Search

Session

클라이언트가 URI를 이용해 서버에 GET 요청을 하면 WAS서버는 해당하는 메서드를 호출해 알맞은 html 파일을 돌려준다. 클라이언트에게서 온 요청이 최초 요청이라면, 응답 http헤더에 쿠키를 넣어주는데, 여기엔 세션키가 들어가있다. 최초 이후엔 클라이언트단에서 쿠키를 포함하여 요청을 건넨다.
서버는 클라이언트의 쿠키가 위조된것인지 알 수 없기 때문에, 자체적으로 자신이 만든 쿠키에 대한 목록을 가지고 있다.
세션키는 총 세가지 경우에 사라진다.
서버단에서 세션을 삭제했을때
세션키가 생성된 후 특정 시간이 지났을떄(보통 30분)
사용자가 브라우저를 종료할때
최초요청 이후, 세션키를 가지고 있는 클라이언트가 서버로 로그인요청을 하면 서버는 자신의 세션에서 해당되는 세션키의 저장소에 사용자의 정보를 저장한다.
인증 이후 사용자가 권한이 필요한 요청을 할 때 마다, 유저의 요청 쿠키에 담겨있는 세션키를 이용해 유저의 정보에 접근한다.
클라이언트의 수(동시접속자 수)가 너무 많을 경우엔 distrubute한 서버환경에선 한 서버에 트래픽이 몰리는 과집중 현상을 방지하기 위해 로드 밸런싱(Load Balancing)을 수행한다.
여기서, 인증이 완료된 사용자가 트래픽의 문제로 다른 서버와 소통하게끔 로드밸런싱이 작용된다면 서버간 공유되지 않는 세션으로 인해 사용자의 세션키는 로드밸런싱이 적용되는 순간순간 만료될 것이다.
이를 해결하기 위한 방법은, 모든 서버가 공유하는 데이터베이스에 세션을 정의하여 공유하는것이다.
세션을 메모리에 정의했던 개별의 서버와는 달리, 데이터베이스에 정의된 세션에 접근하여 값을 가져온다는것은 flatter의 검색을 통해 I/O를 행한다는 뜻으로, 기존 개별 서버의 세션 접근 속도보다 백만배정도 느리다.
이러한 이유로 I/O가 일어나는 하드디스크를 사용하는 데이터베이스보다 메모리 서버인 In-Memory 데이터베이스를 사용한다.
메모리 서버의 데이터는 영구히 보존되지 않고 적은 용량을 가지고 있기 때문에, In-Memory 데이처베이스는 일정시간 접근되지 않은 데이터를 삭제하며 관리해주어야 한다. 서비스 오작동으로 삭제가 일어나지 않게 하기 위해 데이터베이스는 Replication기능을 통해 failover를 지원한다. 주 사용되는 Master DB를 Replicate한 Slave DB는 Master DB에 장애가 발생했을때 Master DB로 승격되어 서비스를 재개할 수 있다.