BackEnd/스프링 MVC

로그인 처리하기 - 쿠키 사용

연향동큰손 2024. 12. 30. 22:41

단순히 쿠키만을 이용하여 로그인, 로그아웃 기능을 구현 해보았다.

 

 

@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를 쿠키에 담아서 보낸다.

 

 

로그인 시 응답 헤더에 memberId가 포함되어 있는것을 확인 가능하다.

 

로그아웃 구현

 

쿠키의 종료 날짜를 조절하여 로그아웃을 구현 가능하다.

@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으로 설정하여 요청이 이루어지면 해당 쿠키가 즉시 종료된다.

 

로그아웃 시 쿠키가 삭제되는것을 확인 가능하다.

 

이 방식의 보안상 문제점

  1. 사용자가 쿠키값을 임의로 변경 가능
  2. 쿠키에 보관된 정보를 다른 사용자가 훔쳐갈 수 있다. --> 쿠키에 민감한 정보를 포함 시키지 않는다.
  3. 헤커가 쿠키를 훔쳐가면 평생 사용 가능  --> 토큰 만료기간을 짧게 설정하여 시간이 지나면 사용할 수 없도록 해야함

 

 

해결법 → 세션을 활용

 

로그인 요청시 서버의 동작

  1. 사용자가 ID, PASSWORD를 이용하여 로그인
  2. 서버에서 회원 정보를 찾는다.
  3. 세션ID를 생성( SessionId는 예측 불가능한 값을 부여하여 해킹 방지)
  4. 생성된 세션ID와 유저 객체를 세션 저장소에 보관
  5. 서버에서 mySessionId라는 이름으로 세션ID만 쿠키에 담아서 전달한다.
  6. 클라이언트의 쿠키저장소에 mySessionId쿠키를 보관

 

 

로그인 이후 동작

 

 

  1. 클라이언트는 요청시 mySessionId 쿠키를 항상 전달한다.
  2. 서버에서 mySessionId 쿠키 정보로 세션 저장소를 조회하여 세션 정보를 사용한다.