
Session
클라이언트의 상태 정보를 서버 측에 저장하여 유지하는 데이터
세션 을 직접 만들어보는 과정을 복기한다
다시 접하려니 기억이 안나서.. 참 애먹었다
HttpServletRequest
HTTP 요청 전체를 들고 있는 서블릿
이 중 헤더에 세션의 정보가 담겨 있을 것이다 (헤더 안에 쿠키가 있으니)
@RequestHeader
스프링에서 이 요청 중 헤더를 갖고오는 어노테이션이다
불필요하게 전체를 갖고 올 필요가 없다
@GetMapping("/headers")
public String getHeaders(
@RequestHeader("session-id") String sessionId,
@RequestHeader(value = "User-Agent") String userAgent
) {
// ...
}
// name or value -> (생략 가능) 이름 지정하기
// required -> 헤더가 필수인지 결정한다
// defaultValue -> required 가 false 일 때, 헤더 값이 없다면 기본값 지정@SessionAttribute
이 헤더를 갖고오는 @RequestHeader 중에서도 세션 ID 정보만
가져오는 어노테이션
활용해보기
위 3가지 선수 지식을 알았으니 이제 몇가지 활용을 해보자
로그인
@PostMapping("/login")
public ResponseEntity<LoginResponse> login(@Valid @RequestBody LoginRequest request, HttpSession session) {
LoginResponse loginResponse = memberService.login(request);
SessionMember sessionMember = new SessionMember(loginResponse.getId(), loginResponse.getNickname());
session.setAttribute("loginMember", sessionMember);
return ResponseEntity.status(HttpStatus.OK).body(loginResponse); HttpSession 을 컨트롤러의 파라미터로 선언하면, 스프링이 자동으로 세션을 주입
기존 생성 세션이 없다면 세션을 새로 생성하고 그 객체를 주입한다
SessionUser DTO 를 통해서 로그인 된 정보를 받아오고 (민감한 정보 없이)
session.setAttribute 를 통해서 세션에 loginMember 로 로그인 정보를 기록한다
로그인 상태로 이제 세션엔 loginResponse의 일부 정보가 남는다
서버에서 클라이언트로 Set-Cookie 를 보면, JSESSIONID 로 정보가 남아있다
로그아웃
이제 @SessionAttribute 를 활용하여 invalidate 시켜주면 세션 정보가 삭제된다
@PostMapping("/logout")
public ResponseEntity<Void> logout(@SessionAttribute(name = "loginUser", required = false) SessionUser sessionUser, HttpSession session) {
if (sessionUser == null) {
return ResponseEntity.badRequest().build();
}
session.invalidate();
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}@SessionAttribute 로 세션 정보를 가져온 후 sessionUser에 대입
로그인 된 상태 였으니 HttpSession 을 파라미터로 선언하면
로그인 때 생성된 객체를 주입한 session 파라미터를 받아온다
이제 sessionUser가 없다면, 세션이 없다고 판단하여 badRequest 로 응답
있다면 invalidate 처리로 서버에 세션 저장소에서 세션 객체, 정보를 삭제한다
이제 곧 JWT 활용 포스트를 위해 더 정진해야겠다