로그인 기능을 만들 때, 세션 유지를 하기 위해 Redis 등의 외부 저장소를 이용하지 않는다면 보통 브라우저의 로컬 스토리지(Local Storage)나 쿠키(Cookie)에 로그인 정보를 저장합니다.
로컬 스토리지는 로그아웃 등으로 지우기 전까지 영구적으로 남아있으며 쿠키는 만료 기간을 설정할 수 있습니다.
세션 스토리지(Session Storage) 에 저장하기도 하는데 새로고침 시엔 남아 있어도 브라우저가 닫히면 정보가 사라지기에 요즘은 로그인 기능에는 잘 사용하진 않는 추세인 것 같습니다. (일회성 로그인이 필요한 사이트 제외)
어쨌든 이런 것들은 브라우저에 저장되기 때문에 이제까지 관리도 클라이언트 사이드에서 했었는데요, 스프링부트에서 제공하는 HttpSession을 이용하면 서버나 Redis, MongoDB 등에서 이것들을 관리할 수 있습니다.
매커니즘은 아래와 같습니다.
1. 어떤 클라이언트가 로그인 요청을 하고 성공했습니다.
2. 그러면 서버에서 세션키를 생성하여 저장해 놓습니다. (이때 SetAttribute로 개발자가 넣고 싶은 데이터를 함께 저장 가능)
3. 생성했던 세션키를 담은 쿠키를 클라이언트에게 응답 헤더로 전달합니다.
4. 그럼 클라이언트는 그 쿠키 값을 브라우저에 저장하고 서버에 HTTP 통신을 할 때마다 요청 헤더에 쿠키를 담아 보냅니다. (이 과정은 브라우저가 자동으로 처리해줌)
5. 서버에서는 클라이언트가 보낸 쿠키를 서버에 저장된 세션키와 비교하고 식별하여 세션이 유지되어 있음을 판단합니다.
이렇게 구현했을 때의 장점은 중요한 세션 데이터가 사용자에게 공개되지 않기 때문에 보안 측면에서 좋다는 겁니다.
단점은 서버 저장소를 사용하기 때문에 사용자가 많아지면 서버에 부하가 생길 수 있다는 점이며, 서버가 재시작되기라도 하면 모든 세션 데이터가 초기화됩니다.
단점을 해결하기 위해서는 세션키를 저장하는 장소를 서버 내부가 아닌 DB에 저장해 놓으면 됩니다.
Redis를 이용해 Session을 저장하는 방법이 위 블로그에 잘 나와있어 주소를 첨부합니다.