In computer science and networking in particular, a session is a temporary and interactive information interchange between two or more communicating devices, or between a computer and user (see login session).
위키백과에서 정의하고 있는 세션에 관한 내용입니다. 한국어 문서보다 오히려 영어가 더 이해하기 쉽도록 되어 있어 영어 문서의 내용을 가져왔습니다.
세션이 무엇인지 정확히 알지는 못해도 아마 웹브라우저나 모바일 기기를 사용하다가 세션이 만료되었다는 글을 보신 적은 있을 겁니다. 여러 세션의 사용 방법 중에, 로그인과 관련해서 세션을 사용하는 경우가 많기 때문입니다.
그래서 오늘은 세션 기반 인증(Session-based Authentication) 에 대해 블로깅을 해보려고 합니다.
인증과 보안에 관해 공부하면서 매우 간편하게 사용했던 로그인 기능이 이렇게 복잡했는지를 새삼스럽게 깨닫게 됩니다.
만약 우리가 어떤 사이트를 사용하는데 매번 사용할 때마다 로그인을 해야 한다면 어떨까요. 조금 더 구체적인 예를 들어보겠습니다. 유튜브에서 어떤 영상을 보고 나서 다음 영상을 보려고 하니 다시 로그인을 요청한다면 어떨까요? 아마 너무 귀찮을 겁니다. 그래서는 유튜브를 이용하기가 어렵겠죠.
로그인을 하면 당연히 내가 로그인했다는 사실을 안다고 생각하기 쉽지만, 사실 이 모든 과정은 개발자들이 고민 끝에 구현해 낸 것입니다. 로그인 과정에서의 세션의 사용 같은 경우가 바로 그런 케이스라고 할 수 있죠.
사용자가 어떤 웹사이트에 자신의 아이디와 비밀번호를 이용해 로그인을 시도한다면, 서버는 사용자의 아이디와 비밀번호가 저장되어 있는 것과 같은지를 우선적으로 비교하게 됩니다. 만약 정확하게 입력되었다면 인증에 성공했다고 판단하겠죠.
이 때 세션을 사용하는 로그인 과정에서는 단순히 인증에 성공했다고 판단하는데서 멈추지 않고, 세션이라는 것을 서버에 별도로 저장하게 됩니다. 어떠한 사용자가 인증에 성공했다고 하는 그 상태를 저장하게 되는 것이죠.
그리고 이 세션에 개별적으로 부여되는 session_id 를 쿠키에 담아 클라이언트에게 전해주게 됩니다. 이 다음부터는 로그인을 통해 나를 인증하는 것이 아닌 세션 아이디를 통해서 나를 인증할 수 있게 되는 것이죠. 서버는 사용자의 아이디와 비밀번호를 검증하는 대신 저장되어 있는 세션의 목록 중에서 해당하는 세션 아이디가 있는지만을 검토해, 요청을 처리할지 여부를 검토하게 됩니다.
로그아웃도 마찬가지입니다. 로그아웃을 하기 위해서 아이디와 비밀번호를 적으신 적 있나요? 아마 없을 겁니다. 로그아웃을 하는 과정도 동일하게 세션 id 를 전달하게 됩니다. 그러면 서버에서는 저장되어 있던 세션의 정보를 삭제하게 되죠. 마찬가지로 쿠키에 무효한 세션 아이디의 값을 갱신해서 전달하는 것으로 로그아웃이 이뤄지게 됩니다.
express-session 은 세션 관리를 위한 Node.js 모듈입니다. 고유한 세션 객체와 세션 아이디를 만들어 서버에 저장하고 이를 사용할 수 있게 해주는 모듈입니다.
req.session
을 통해 세션 데이터를 저장하거나 확인할 수 있습니다. 위의 링크에서 req.session 으로 검색하거나 스크롤을 중간 즈음으로 내려서 더 자세한 정보와 예시를 확인하실 수 있습니다.