단순히 쿠키만을 이용하여 로그인, 로그아웃 기능을 구현 해보았다.
@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());
log.info("login? {}", loginMember);
if (loginMember == null) {
bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
return "login/loginForm";
}
//로그인 성공 처리
//쿠키에 시간 정보를 주지 않으면 세션 쿠키(브라우저 종료시 모두 종료)
Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId())); //쿠키이름 "memberId"
response.addCookie(idCookie);
return "redirect:/";
}
로그인에 성공 시 쿠키를 생성하고 HttpServletResponse에 담은 후 요청을 보낼때 마다 회원의 id를 쿠키에 담아서 보낸다.
로그아웃 구현
쿠키의 종료 날짜를 조절하여 로그아웃을 구현 가능하다.
@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);
}
로그아웃을 누를 경우 쿠키의 종료 날짜를 0으로 설정하여 요청이 이루어지면 해당 쿠키가 즉시 종료된다.
이 방식의 보안상 문제점
- 사용자가 쿠키값을 임의로 변경 가능
- 쿠키에 보관된 정보를 다른 사용자가 훔쳐갈 수 있다. --> 쿠키에 민감한 정보를 포함 시키지 않는다.
- 헤커가 쿠키를 훔쳐가면 평생 사용 가능 --> 토큰 만료기간을 짧게 설정하여 시간이 지나면 사용할 수 없도록 해야함
해결법 → 세션을 활용
로그인 요청시 서버의 동작
- 사용자가 ID, PASSWORD를 이용하여 로그인
- 서버에서 회원 정보를 찾는다.
- 세션ID를 생성( SessionId는 예측 불가능한 값을 부여하여 해킹 방지)
- 생성된 세션ID와 유저 객체를 세션 저장소에 보관
- 서버에서 mySessionId라는 이름으로 세션ID만 쿠키에 담아서 전달한다.
- 클라이언트의 쿠키저장소에 mySessionId쿠키를 보관
로그인 이후 동작
- 클라이언트는 요청시 mySessionId 쿠키를 항상 전달한다.
- 서버에서 mySessionId 쿠키 정보로 세션 저장소를 조회하여 세션 정보를 사용한다.
'BackEnd > 스프링 MVC' 카테고리의 다른 글
로그인 처리 - 서블릿 HTTP 세션,@SessionAttribute,세션 타임아웃 설정 (0) | 2025.01.01 |
---|---|
로그인 처리 - 세션 직접 만들어 보기 (1) | 2024.12.30 |
HTTP 요청 메시지 - JSON (0) | 2024.02.28 |
HTTP 요청 메시지 - 단순 텍스트 (0) | 2024.02.28 |
HTTP 요청 파라미터 - @ModelAttribute (0) | 2024.02.28 |