[스프링부트] 27. 스프링부트 뱅크 v1 로그인

백하림's avatar
Mar 27, 2025
[스프링부트] 27. 스프링부트 뱅크 v1 로그인
💡

세션과 쿠키의 역할

  1. 세션은 서버에서 사용자 정보를 관리하지만, 클라이언트가 세션 ID를 쿠키로 전달해야 서버가 이를 식별할 수 있다.
  1. 쿠키가 없거나 세션이 만료되면 사용자를 알 수 없고, session.getAttribute("metacoding")을 호출해도 null이 반환된다.
  1. 따라서, 세션을 유지하려면 브라우저가 세션 ID를 포함한 쿠키를 유지해야 한다.
  1. 현재 코드에서는 /login-form을 방문해야 세션이 생성되고, 이후에 /join-form에서 세션을 조회할 수 있다.
정리하자면, "쿠키가 없으면 세션을 유지할 수 없고, 따라서 사용자를 알 수 없다

로그인 로직 추가 코드 (BOLD체)

UserController

package com.metacoding.bankv1.user; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @RequiredArgsConstructor @Controller public class UserController { private final UserService userService; private final HttpSession session; @GetMapping("/logout") public String logout() { session.invalidate(); return "redirect:/"; } // 로그인만 예외로 Post (조회시에도) @POST (조회시에도) body에 던져야 하니까 password @PostMapping("/login") public String login(UserRequest.LoginDTO loginDTO) { User sessionUser = userService.로그인(loginDTO); session.setAttribute("sessionUser", sessionUser); // stateful return "redirect:/"; } @GetMapping("/login-form") public String loginForm() { return "user/login-form"; } @GetMapping("/join-form") public String joinForm() { return "user/join-form"; } @PostMapping("/join") public String join(UserRequest.JoinDTO joinDTO) { userService.회원가입(joinDTO); return "redirect:/login-form"; } }

UserService

public User 로그인(UserRequest.LoginDTO loginDTO) { // 1. 해당 유저네임이 있나? User user = userRepository.findByUsername(loginDTO.getUsername()); // 2. 필터링 (유저네임, 패스워드가 불일치하는 것들을) if (user == null) { throw new RuntimeException("해당 username이 없습니다"); } if (!(user.getPassword().equals(loginDTO.getPassword()))) { throw new RuntimeException("해당 password가 틀렸습니다"); } // 3. 인증 return user; }

header.mustache

{{#sessionUser}} <li class="nav-item"> <a class="nav-link" href="/account">계좌목록</a> </li> <li class="nav-item"> <a class="nav-link" href="/account/save-form">계좌생성</a> </li> <li class="nav-item"> <a class="nav-link" href="account/transfer-form">이체하기</a> </li> <li class="nav-item"> <a class="nav-link" href="/logout">로그아웃</a> </li> {{/sessionUser}} {{^sessionUser}} <li class="nav-item"> <a class="nav-link" href="/join-form">회원가입</a> </li> <li class="nav-item"> <a class="nav-link" href="/login-form">로그인</a> </li> {{/sessionUser}}
💡
{{#sessionUser}}, {{/sessionUser}} 로그인 하면 보이는 상태
{{^sessionUser}}, {{/sessionUser}} 로그인 하기 전 보이는 상태
Share article

harimmon