세션
클라이언트가 웹 서버에 접속해 있는 상태 동안 유지되는 논리적인 연결 상태 및 서버측 데이터 가상화 스토리지.
— RFC 6265 표준 명세 및 웹 상태 관리 가이드북
"서버 RAM에 유저 정보를 다 담아두다가 동접자 터지면 서버도 같이 골로 간다." 결국 이 고생을 안 하려고 다들 토큰 방식으로 도망친 거다.(...)
1. 개요
상태가 없는(Stateless) 특성을 가진 HTTP 프로토콜의 한계를 극복하기 위해, 서버가 클라이언트의 로그인 등의 상태를 자신의 메모리나 데이터베이스에 박아두고 관리하는 영속성 기술이다. 브라우저에는 세션 ID(Session ID)라는 임의의 문자열 쪼가리만 쿠키로 전달하고, 진짜 민감한 유저 정보는 서버 인프라 깊숙한 곳에 숨겨둔다.(...)
2. 메모리 과부하와 세션 스티키네스의 눈물
세션은 보안성이 뛰어나다는 장점이 있지만, 치명적인 약점이 있으니 바로 모든 짐을 서버가 다 짊어진다는 것이다. 유저가 로그인할 때마다 서버의 가중 메모리(RAM) 공간을 갉아먹기 때문에 동접자가 폭증하면 서버가 OOM(Out of Memory)을 뿜으며 뻗어버린다. 이를 막으려고 API 서버를 로드밸런서 뒤에 여러 대 배치하면, 이번에는 유저가 1번 서버에서 로그인했는데 다음 요청이 2번 서버로 가면서 '너 누구세요?'를 당하는 세션 불일치 촌극이 터진다. 이를 해결하겠다고 특정 유저의 요청은 무조건 특정 서버로만 보내는 스티키 세션(Sticky Session)을 썼다가 그 서버 하나가 과부하로 터지면 연쇄 폭발이 일어났다. 결국 현대 아키텍처에서는 세션 전용 고속 인메모리 DB인 Redis를 따로 파서 세션을 공유하는 방식을 고수하고 있다.1
3. 관련 밈 및 드립
3.1. 세션 만료 30초 전
인터넷 뱅킹이나 관공서 사이트에서 중요한 서류를 장문으로 타이핑하고 있거나 공인인증서 비밀번호를 고르고 있을 때, 우측 상단에서 자비 없이 깜빡이며 사람 피를 말리게 하는 마의 타이머다. 연장 버튼을 제때 누르지 않으면 수십 분 동안 작성하던 텍스트 쪼가리가 서버 메모리에서 깔끔하게 증발하는 대참사를 낳는다.
3.2. 쿠키와 세션의 혼동
면접장에서 신입 주니어 개발자들을 감별하는 단골 질문이자 튀김 옷 같은 단골 드립이다. 쿠키는 유저 브라우저(클라이언트) 장바구니에 담아두는 과자 쪼가리이고 세션은 서버실 금고에 보관하는 장부라고 수백 번을 외워놓고도, 면접관 앞에만 서면 둘의 위치를 뒤바꿔 대답하여 면접 탈락 탈곡기에 탈탈 털리는 애환을 풍자한다.
4. 여담
- 쿠키 필수론: 세션은 쿠키와 대립되는 개념이 아니다. 서버에 장부가 있어도 브라우저가 자기 '세션 ID'를 쿠키에 담아서 보내주지 않으면 서버는 장부를 뒤질 열쇠가 없다.
- 브라우저 종료와 세션: 흔히 브라우저를 끄면 세션이 즉시 죽는다고 알지만, 정확히는 브라우저가 세션 쿠키를 날리는 것뿐이며, 서버의 메모리 장부는 타임아웃이 만료될 때까지 유령처럼 남아 숨을 쉰다.
- 세션 하이재킹(Session Hijacking): 유저의 PC를 해킹하거나 네트워크 패킷을 가로채서 오직 '세션 ID' 문자열 하나만 훔쳐내면, ID/비밀번호를 몰라도 그 유저의 계정을 완벽하게 도용해 서버를 농락할 수 있다.
5. 관련 문서
각주
-
그리고 그 Redis마저 메모리가 꽉 차서 신규 유저의 세션 구우려다 기존 유저의 세션을 밀어버리는 순간, 대규모 로그아웃 사태가 벌어지며 슬랙에 비상벨이 울린다.(...) ↩