[Spring] 상태 유지 - 세션 관리 (쿠키, 세션)
http는 비연결성과 무상태성 때문에, 서버는 클라이언트를 기억하지 못한다.
하지만, 로그인 정보를 기억하는 등 기억해야 하는 경우가 있다.
이러한 상황을 처리하기 위해, 쿠키, 세션을 이용해 상태를 유지한다.
쿠키?
클라이언트(브라우저)에 저장되는 키와 값이 들어있는 작은 데이터 파일.
사용자 인증이 유효한 시간을 명시하고, 시간 내에는 브라우저가 종료돼도 인증이 유지된다.
ResponseHeader에 Set-Cookie 속성을 사용해 클라이언트에 쿠키를 만들 수 있다.
이름과 값, 유효시간, 도메인, 요청 경로 정보가 포함된다.
세션?
쿠키 기반이지만, 서버 측에서 관리한다.
클라이언트를 구분하기 위해 세션ID를 부여하며, 브라우저가 접속해서 설정한 시간만큼 응답이 없거나, 브라우저를 종료할 때까지 인증상태를 유지한다.
결국, 사용자 인증(여러 요청이 연결된 것 처럼 보이게 하기 위함)을 위하여 상태를 유지하기 위함이고, 쿠키와 세션의 가장 큰 차이는 관리하는 위치이다.
그래서 스프링에서는?
Spring 쿠키
쿠키값을 사용할 메서드 파라미터에 @CookieValue 어노테이션을 붙여 쿠키 값을 파라미터에 할당한다.
@GetMapping("/cookie")
fun cookie(@CookieValue("id")id: String) {
}
Spring 세션
HttpServletRequest, HttpSession
세션을 사용할 메서드 파라미터에 HttpSession 혹은 HttpServletRequest 타입의 파라미터를 명시한다.
세션의 setAttribute() 함수로 key, value를 저장, getAttribute()함수로 key를 통해 value를 조회할 수 있다.
HttpSession.invalidate(): 세션 데이터 일괄 삭제
HttpSession.removeAttribute(): 세션의 특정 키 값의 데이터 삭제
위 메소드로 @SessionAttribute에 등록되지 않은 세션 데이터를 삭제할 수 있다.
@GetMapping("/session")
fun session(s: HttpSession) {
}
@GetMapping("/session")
fun session(request: HttpServeletRequest) {
val s = request.session
}
s.setAttribute("id", "abcd")
val id = s.getAttribute("id")
@SessionAttribute, @ModelAttribute, Model
SessionStatus를 파라미터로 받아 SessionStatus.setComplete()를 통해 @SessionAttributes에 등록된 세션 데이터를 일괄 삭제할 수 있다.
@RestController
@SessionAttributes(arrayOf = {"key1", "key2"})
class Controller {
@GetMapping("/register")
fun registerAttribute(model: Model) {
model.addAttribute("key1", "abcd")
}
@GetMapping("/search")
fun getAttribute(@ModelAttribute("key1") key1: String) {
}
}