1 분 소요

쿠키, 세션

서버에서는 회원 정보가 맞는지 검증하기 위해 세션 저장소에서 해당 회원 정보가 있는지 찾아봐야 한다. 이렇게
서버에 중요한 정보를 저장하고 연결을 유지하는 방법을 세션이라 하고, 서버에 처음 접근하는 클라이언트는 앞으로
이용하면서 세션이 유지되는 한 유효한 클라이언트임을 알리기 위해 쿠키에 필요한 정보를 담아 서버로 보내게 된다.
하지만 처음 접근하는 클라이언트는 쿠키 정보가 없으므로 서버에서 발급받고 서버는 쿠키 정보와 회원 정보를 세션
저장소에 저장하고 만료 기한까지 관리한다.

쿠키는 본인이 유효한 클라이언트임을 검증하는 정보로 활용되는데 임의로 변경될 수 있다는 점에 주목해야 한다.
강제로 쿠키 값을 변경하면 다른 클라이언트가 될 수 있기 때문이다! 그러므로 쿠키에는 개인정보나 신용정보가 담기지
않도록 함으로써 특정 클라이언트로의 접근을 불가능하게 해야하고, 예상 불가능한 정보를 넣어야 한다. 또한 털어가도
사용하지 장기간 사용할 수 없도록 만료 기한을 설정해야 한다.

로그인 처리

서블릿을 통해 세션을 생성하고 활용할 수 있다! 이 세션에서 발급하는 쿠키는 JSESSIONID이고, 값은 추정 불가능
한 랜덤값을 갖는다.

로그인 API 함수에서 다음과 같이 세션을 생성하고 회원 정보를 설정할 수 있다.
SessionConst.LOGIN_MEMBER는 세션 저장소에 저장되는 회원 정보에 대한 key를 상수이다.

@PostMapping("/login")
public String loginV3(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request) {
    ...
    //로그인 성공 처리
    //세션 있으면 그대로 반환, 없으면 신규 세션 생성
    HttpSession session = request.getSession();
    //세션에 로그인 회원 정보 보관
    session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);

    return "redirect:/";
}


public HttpSession getSession(boolean create)
  • getSession(true): 기본값
    • 세션 있음: 그대로 반환
    • 세션 없음: 새로 생성 후 반환
  • getSession(false)
    • 세션 있음: 그대로 반환
    • 세션 없음: null 반환

Spring에서 세션을 편리하게 활용할 수 있도록 @SessionAttribute를 지원한다!
다음은 로그인된 사용자를 찾을 때의 예시이고, getSession(false)처럼 새 세션을 생성하지 않는다.

@GetMapping("/")
public String homeLoginV3Spring(
    @SessionAttribute(name = SessionConst.LONG_MEMBER, required = false) Member loginMember, Model model) {

    //세션에 회원 데이터 없으면 home 이동
    if(loginMember == null) {
        return "home";
    }

    //세션 유지되면 로그인 화면으로 이동
    model.addAttribute("member", loginMember);
    return "loginHome";
}


TrackingModes

로그인 첫 시도 시 새로 발급한 jsessionid를 URL 뒤에 포함하게 되는데 이는 웹 브라우저가 쿠키를 지원하지 않을
때를 대비해 URL를 통해서 세션을 유지하기 위함이다. 이 방법을 비활성화하려면 application.properties에 다음
코드를 추가하자.

server.servlet.session.tracking-modes=cookie


timeout 설정

세션은 서버의 메모리에서 관리되기 때문에 사용하지 않는 클라이언트의 세션 정보를 영구적으로 관리하면 부담이 크다.
그러므로 timeout 설정이 필수적이며, application.properties에 다음 코드를 추가하면 된다. 1800초로 설정했을
때 예시이고. 클라이언트가 서버에 최근에 요청한 시간을 기준으로 설정한 값(초)만큼 세션 생존 시간이 재설정된다.

session.setMaxInactiveInterval(1800);

카테고리:

업데이트:

댓글남기기