스프링 MVC 2편(백엔드 웹 개발 활용 기술)

Ch06. 로그인 처리(쿠키, 세션) - 로그인 처리하기(쿠키 사용)

webmaster 2022. 3. 17. 11:29
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