세션과 쿠키의 역할
- 세션은 서버에서 사용자 정보를 관리하지만, 클라이언트가 세션 ID를 쿠키로 전달해야 서버가 이를 식별할 수 있다.
- 쿠키가 없거나 세션이 만료되면 사용자를 알 수 없고,
session.getAttribute("metacoding")
을 호출해도null
이 반환된다.
- 따라서, 세션을 유지하려면 브라우저가 세션 ID를 포함한 쿠키를 유지해야 한다.
- 현재 코드에서는
/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