쿠키에 대해선 잘 모르겠다면
https://qwefdg3.tistory.com/204
여기를 참고하도록 하자.
여튼 논리자체는,
쿠키는 영속성 쿠키, 세션 쿠키 이렇게 두가지 종류가 있는데,
영속성 쿠키는 우리가 날짜 (expire 될 날짜) 를 정해주는 것으로, 웹브라우저를 꺼도 쿠키가 지정한 시간만큼 유지가 된다.
세션쿠키는 웹브라우저를 종료하면 그냥 사라진다.
그러므로, 로그인에는 세션쿠키가 더 알맞다.
@Slf4j
@Controller
@RequiredArgsConstructor
public class LoginContoller {
private final LoginService loginService;
@GetMapping("/login")
public String loginForm(@ModelAttribute LoginForm form){
return "login/loginForm";
}
@PostMapping("/login")
public String login(@Validated @ModelAttribute LoginForm loginForm, BindingResult bindingResult, HttpServletResponse response){
if(bindingResult.hasErrors()){
return "login/loginForm";
}
Member loginMember = loginService.login(loginForm.getLoginId(), loginForm.getPassword());
if(loginMember == null){
bindingResult.reject("loginFail", "아이디 혹은 비밀번호가 맞지 않습니다.");
return "/login/loginForm";
}
Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
response.addCookie(idCookie);
return "redirect:/";
}
@PostMapping("/logout")
public String logout(HttpServletResponse response){
expireCookie(response, "memberId");
return "redirect:/";
}
private void expireCookie(HttpServletResponse response, String cookieName){
Cookie cookie = new Cookie(cookieName, null);
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
loginId를 통해 repository에서 member를 찾았다면,
쿠키를 만든다. memberId라는 key로, 값은 찾은 member의 id로 한다.
이 id는 loginId가 아닌 우리가 관리하기 위한 id이다.
여튼 그렇게 응답에 쿠키를 추가 해준다. 따로 expire에 대한 값을 주지 않았으므로 세션 쿠키가 된다.
로그아웃은 더 간단하다.
로그아웃 버튼을 누르면 Post로 /logout으로 요청하고,
expireCookie로 같은 쿠키 key로
setMaxAge(0) 영속성을 (MaxAge같은 경우는 남은 시간, 초) 0으로 줘서 바로 끝내버린다.
그럼 쿠키가 사라진다.
둘 다 홈으로 리다이렉트 하게끔 해 놨는데,
@Slf4j
@Controller
@RequiredArgsConstructor
public class HomeController {
private final MemberRepository memberRepository;
// @GetMapping("/")
// public String home() {
// return "home";
// }
@GetMapping("/")
public String homeLogin(@CookieValue(name = "memberId", required = false) Long memberId, Model model) {
if(memberId == null){
return "home";
}
Member loginMember = memberRepository.findById(memberId);
if(loginMember == null){
return "home";
}
model.addAttribute("member", loginMember);
return "loginHome";
}
}
아예 로그인 후 템플릿을 따로 만들었다. 확실히 그게 더 편해 보일듯도 싶다.
쿠키가 있고, 들어왔어도 그 들어온 쿠키에 관한 값을 memberRepository가 가지고 있을 때만 로그인 후 홈 화면으로 이동시킨다.
쿠키를 주는 것은 서버에서 주는 것이다.
서버에서 세션쿠키를 준다. 그러면 클라이언트 입장에서는 웹브라우저를 종료하기 전 까지 그 쿠키가 유지된다.
그 전까지는 계속해서 이 웹사이트의 하위나 (위에 안내한 쿠키에 관한 정보를 기입해놓은 링크를 들어가 보자. 도메인의 하위나 그런 것에 대한 설정까지도 할 수 있다.) 이 도메인에 들어가면 클라이언트는 계속 서버로 쿠키를 헤더에 포함해서 보내게 되어있다.
서버는 그 쿠키를 읽고 DB에서 회원 정보를 가져와서 활용하면 된다.
'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글
48. 서버 세션 (0) | 2023.09.05 |
---|---|
47. 쿠키의 보안문제 (0) | 2023.09.05 |
45. 로그인 구현 (0) | 2023.09.05 |
44. 멤버 회원가입 구현 (0) | 2023.09.04 |
43. 도메인과 표현 분리 (0) | 2023.09.04 |