728x90
- 로그인 상태를 유지하기 위해 쿠키를 사용

- 모든 요청에 쿠키 정보가 포함이 된다.

- 쿠키에는 영속 쿠키와 세션 쿠키가 있다.
- 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
- 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료 시까지만 유지
쿠키 생성하기 - LoginController
@PostMapping("/login")
public String login(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletResponse response){
if(bindingResult.hasErrors()){
return "login/loginForm";
}
Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
if(loginMember == null){
bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
return "login/loginForm";
}
//로그인 성공 처리 TODO
//쿠키에 시간 정보를 주지 않으면 세션 쿠키 (브라우져 종료시 삭제)
Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
response.addCookie(idCookie);
return "redirect:/";
}
- 로그인에 성공하면 쿠키를 생성하고 response에 담는다.
- 쿠키 ID = memberId, 값은 member의 Id값이다.
Home Login 처리
@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";
}
- 쿠키에 memberId 가 없는 사용자나, 쿠키가 오래돼서 memberId에 저장이 되어있지 않은 사용자의 경우에는 home으로 보낸다.
- 로그인 쿠키가 있는 사용자는 로그인 사용자 전용 홈인 loginHome 으로 보낸다.
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<link th:href="@{/css/bootstrap.min.css}" href="../css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container" style="max-width: 600px">
<div class="py-5 text-center">
<h2>홈 화면</h2>
</div>
<h4 class="mb-3" th:text="|로그인: ${member.name}|">로그인 사용자 이름</h4>
<hr class="my-4">
<div class="row">
<div class="col">
<button class="w-100 btn btn-secondary btn-lg" type="button" th:onclick="|location.href='@{/items}'|">
상품 관리
</button>
</div>
<div class="col">
<form th:action="@{/logout}" method="post">
<button class="w-100 btn btn-dark btn-lg"
onclick="location.href='items.html'" type="submit">
로그아웃
</button>
</form>
</div>
</div>
<hr class="my-4">
</div> <!-- /container -->
</body>
</html>
로그아웃 기능
@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);
}
- logout을 하게 될 경우 cookie에 Age값을 0으로 세팅하여 더이상 쿠키가 유지되지 않도록 한다(쿠키 즉시 종료)
728x90
'스프링 MVC 2편(백엔드 웹 개발 활용 기술)' 카테고리의 다른 글
| Ch06. 로그인 처리(쿠키, 세션) - 로그인 처리하기 (0) | 2022.03.17 |
|---|---|
| Ch06. 로그인 처리(쿠키, 세션) - 쿠키와 보안 문제 (0) | 2022.03.17 |
| Ch06. 로그인 처리(쿠키, 세션) - 로그인 기능 (0) | 2022.03.17 |
| Ch06. 로그인 처리(쿠키, 세션) - 회원 가입 (0) | 2022.03.17 |
| Ch06. 로그인 처리(쿠키, 세션) - 로그인 요구사항 & 프로젝트 구조 (0) | 2022.03.17 |