쿠키는 사용자를 식별하고 세션을 유지하는 방식 중에서 현재까지 가장 널리 사용하는 방식이다. 쿠키는 넷스케이프가 최초로 개발했지만, 지금은 모든 브라우저에서 지원한다.
처음에 사용자가 웹 사이트에 방문하면 웹 서버는 사용자에 대해서 아무것도 모른다. 웹 서버는 사용자가 다시 돌아왔을 때, 해당 사용자를 식별하기 위한 유일한 값을 쿠키에 할당한다. 쿠키는 임의의 key & value 형태의 리스트를 갖고 Set-Cookie 혹은 Set-Cookie2 같은 HTTP 응답 헤더에 기술되어 사용자에게 전달된다.
브라우저는 서버로 온 Set-Cookie 혹은 Set-Cookie2 헤더에 있는 쿠키 콘텐츠를 브라우저 쿠키 데이터베이스에 저장한다. 사용자가 미래에 같은 사이트를 방문하면, 브라우저는 서버가 해당 사용자에게 할당했던 쿠키를 Cookie 요청 헤더에 기술해 전송한다. 즉, 서버에 접근할 때마다 정보를 함께 전송하는 것이다. 브라우저는 쿠키 정보를 저장할 책임이 있다.
쿠키는 크게 세션 쿠키와 지속 쿠키 두 가지 타입으로 나눌 수 있으며, 두 쿠키의 다른 점은 파기되는 시점뿐이다. 쿠키에 Discard 파라미터가 설정되어 있거나, 파기되기까지 남은 시간을 가리키는 Expires 혹은 Max-Age 파라미터가 없으면 세션 쿠키가 된다.
웹 서버는 클라이언트에게 세션 아이디를 부여하고 클라이언트는 세션 아이디를 쿠키에 저장한다. 이후 클라이언트가 웹 서버에 요청을 보낼 때, 브라우저가 쿠키에 저장된 세션 아이디를 요청과 함께 서버로 보낸다. 서버는 이 세션 아이디로 클라이언트를 구분하여 클라이언트의 세션 정보를 유지할 수 있다.
Spring Interceptor는 Spring MVC에서 요청과 응답 사이에 위치하여 컨트롤러가 처리하기 전에 요청을 가로채어 처리할 수 있는 기능을 제공한다. Spring Interceptor를 이용하여 클라이언트의 로그인 여부를 확인하고, 로그인이 되어 있지 않다면 로그인 페이지로 이동시킬 수 있다.
이 외에도 Interceptor를 이용하여 요청 로그를 남기거나, 보안 검사를 수행하거나, 특정 URL에 대한 접근 권한 검사를 수행할 수 있다.
about spring mvc handlerinterceptor
HandlerInterceptor 인터페이스는 다음과 같은 세 개의 메소드를 제공한다.
preHandle()
: Controller가 요청을 처리하기 전에 호출된다. 클라이언트의 요청 정보를 분석하여 특정 작업을 수행하거나, 요청을 가로채어 처리할 수 있다. boolean 타입을 반환하며, true를 반환하면 요청이 계속 진행되고, false를 반환하면 DispatcherServlet이 인터셉터가 이미 응답 자체를 처리했다고 가정하여 요청이 중단된다.
postHandle()
: Controller가 요청을 처리한 후, view rendering을 수행하기 전에 호출된다. 요청 정보를 기반으로 작업을 수행할 수 있다. void 타입을 반환한다.
afterCompletion()
: view rendering이 완료된 후, 응답을 클라이언트에 반환하기 전에 호출된다. 모든 작업이 완료되었음을 보장하며, void 타입을 반환합니다.
thymeleaf 공식 문서에 따르면 요청 매개변수와 세션과 같은 속성을 가져오는 데 사용할 수 있는 몇 가지 특수 표현식을 제공한다.
${session.x} // x = key
위 표현식을 통해 session의 해당 키에 대한 속성 값을 가져올 수 있다.