정확히 짚어주신 대로, http에서 통신은 매번 독립적으로 이루어지며, 개별 통신에 대한 별다른 정보를 저장하여 기억해 두지 않습니다(stateless). 때문에 같은 사용자가 요청을 여러 번 하더라도 해당 사용자에 대한 정보(이전에도 방문한 적이 있는지, 로그인을 했는지 등등..)를 알 길이 없죠. 하지만 쿠키와 세션을 활용하면 여러 번의 통신에 걸쳐, 어떤 사용자에 대한 상태를 파악할 수 있습니다.세션에 대해 이해하려면 쿠키에 대한 개념부터 간략하게 짚고 넘어가면 좋을 것 같습니다. 쿠키는 일종의 서버와 클라이언트가 대화하기 위한 수단입니다.
요청 헤더의 set-cookie 속성에 정보를 담을 수 있어요.(express에서 쿠키 활용은 res.cookie, req.cookie, cookie-parser 모듈에 대해 찾아 보시면 쉽게 이해하실 수 있을 겁니다.)
말씀해주신 대로 쿠키에 담기는 어떤 데이터는 브라우저에서 관리를 하고요.
반면 세션은 서버와 클라이언트가 연결되어 있는 상태입니다.
세션 활성화가 시작되면, 다시 말해 어떤 클라이언트가 서버와 통신을 시작하면 서버는 해당 클라이언트에 대해 유일한 아이디(세션 id)를 부여하고, 세션 스토리지에 세션에 대한 정보를 저장해 둡니다.
클라이언트는 이 세션 id를 쿠키를 통해 기억하고요. 이후 클라이언트는 어떤 요청을 보낼 때마다 헤더의 cookie에 세션 id를 담아 전송합니다.
서버는 클라이언트가 보낸 요청의 쿠키에 담긴 세션 id와, 세션 스토리지에 저장된 세션 id를 대조하여 인증 상태를 판단합니다.
(여기서 다시 한 번 강조하고 싶은 부분이 있는데요, 세션과 쿠키는 완전히 분리된 개념이 아닙니다! 세션 또한 쿠키를 기반으로 합니다.)각 클라이언트마다 유니크한 세션 객체가 주어지고, 이 세션 객체에 어떤 데이터를 담아 관리할 수도 있습니다.
하지만 이 세션 객체와 데이터는 서버에 존재합니다. 클라이언트가 보내는 쿠키에 담겨 있는 것은 세션 id 뿐이고요.
(세션id가 열쇠라면, 세션 객체는 자물쇠로 잠긴 상자라고 생각할 수도 있을 것 같아요.)
반면 세션을 사용하지 않고 오직 쿠키만으로 어떤 데이터를 주고 받는다면, 클라이언트는 이미 모든 데이터를 다 알고 있겠죠?결국 쿠키 / 세션은 사용자의 정보를 저장하기 위해서 필요한 것들인가요?
쿠키와 세션은 결국 요청을 보내는 측(사용자)에 대한 정보에 따라, 1) 적합한 사용자 경험을 제공하고(e.g. '7일간 다시 보지 않기', 인증 상태 유지 등)
2) 보안을 유지(e.g. 인증 상태 관리)하기 위해 사용된다고 이해할 수 있을 것 같습니다. 위에서 말씀해 주신 대로, 원래 stateless한 http 통신으로는 정보를 기억할 수 없으니 쿠키와 세션이 사용되는 것이고요.토큰은 인증을 위해 사용되는 암호화된 문자열 입니다.
사용자가 인증에 성공하면, 서버는 토큰을 생성해서 클라이언트로 보냅니다.
토큰 또한 세션과 마찬가지로 사용자가 보내는 요청에 포함이 되고요.
서버는 토큰이 유효한지 확인만 합니다. 세션 인증에서 서버가 세션 id를 저장하고, 클라이언트가 쿠키에 실어 보낸 세션 id를 세션 스토리지에 저장된 것과 대조하는 과정이 없지요.
그래서 http 통신의 stateless한 성격과 더 적합한 인증 방식입니다. 서버 운영의 효율 측면으로도 더 좋고요.세션과 토큰에 대한 개념을 이해하는 데 도움이 되는 레퍼런스 자료가 있을까요?
토큰과 세션 인증에 대한 비교 글입니다.
https://dev.to/vasilevskialeks/token-vs-session-authentication-56ed
쿠키-세션에 대해, 재미있는 비유를 통해 설명한 영상입니다.
https://www.youtube.com/watch?v=OpoVuwxGRDI