[Spring MVC] 쿠키를 사용한 로그인
- [ Backend ]/Spring Web
- 2022. 8. 8.
로그인 api를 개발할 때, 쿠키(영속 쿠키, 세션 쿠키)를 이용하여 로그인 상태를 유지할 수 있다.
<컨트롤러-로그인>
@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";
}
//로그인 성공 처리
//세션 쿠키 : 쿠키에 시간 정보를 주지 않으면
Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
response.addCookie(idCookie);
return "redirect:/";
}
쿠키 객체를 생성한 이후, HttpServletResponse를 인자로 주고 addCookie()를 통해서 String형태로 쿠키를 추가해주면 쿠키가 생성된다. 이때 쿠키에 별도로 시간 정보를 주지 않으면 세션 쿠키(화면 종료시 만료), 시간 정보를 설정하면 영속 쿠키(설정한 기간 혹은 시간동안 유효)로 설정된다.
참고로 addCookie()로 동일한 이름의 쿠키를 여러번 보낼 경우 가장 최근의 쿠키만 저장되고, 다른 이름의 쿠키를 보내면 여러개가 저장된다.
응답 헤더를 확인해보면 로그인 시 설정한대로 쿠키가 저장되고, 새로고침을 할 때에도 요청 헤더에 memberId가 있는 것을 확인할 수 있다. 서버에서는 이 요청 헤더를 보고 로그인이 되었다는 사실을 확인하고, 처리해줄 수 있다.
<컨트롤러-홈화면에 로그인여부 표시>
@GetMapping("/")
public String homeLogin(@CookieValue(name = "memberId", required = false) Long memberId, Model model) {
if(memberId==null) //memberId 쿠키 정보가 없는경우
return "home";
Member loginMember = memberRepository.findById(memberId);
if(loginMember==null) //repository에 정보가 없는 경우
return "home";
model.addAttribute("member", loginMember);
return "loginHome";
}
홈 화면을 다루는 컨트롤러 코드이다. @CookieValue(name="?") 어노테이션의 name속성을 통해서 전달받을 쿠키의 이름을 설정하고, required속성을 false로 지정해서 쿠키정보가 없는 경우에도 예외를 발생시키지 않고 로직이 정상적으로 동작하도록 하였다.
<컨트롤러-로그아웃>
@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);
}
로그아웃의 경우 쿠키를 강제로 만료시켜주면 된다. maxAge(0)으로 만료된 영속쿠키를 만들어서 쿠키를 전송해주면 만료된 쿠키가 전달되고, 홈화면으로 redirect된다.
이렇게 쿠키를 사용하여 간단하게 로그인 기능을 관리할 수 있다. 하지만 이 방법은 보안에 문제가 있기 때문에, 다른 대안이 필요하다.
'[ Backend ] > Spring Web' 카테고리의 다른 글
[Spring MVC] 서블릿 필터, 스프링 인터셉터 (0) | 2022.08.14 |
---|---|
[Spring MVC] 쿠키+세션을 사용한 로그인 (0) | 2022.08.09 |
[Spring MVC] 검증 2 - Bean Validation (0) | 2022.07.14 |
[Spring MVC] 검증 - BindingResult, @InitBinder (0) | 2022.07.08 |
[Spring MVC] 메세지, 국제화 (0) | 2022.07.08 |