Computer Programming/AI

TIL_Django REST Framework, Cookie&Session와 Token의 차이점

JYCoder 2023. 9. 20. 20:40

로그인 인증 기능을 구현할 때 cookie, session, token에 대한 용어들이 등장한다.

전에 cookie와 session에 대한 내용을 정리한 적이 있는데, 이번에 token이 새로 등장하면서 개념들이 다시 헷갈리기 시작했다. 그래서 이들의 개념을 확실히 하기 위해 cookie, session, token에 대한 내용을 정리해 보았다.

 

웹사이트를 이용할 때 사용되는 HTTP(Hypertext Transfer Protocol)은 'stateless'라는 특징을 갖는다. 

stateless라는 것은 client에서 server로 요청이 갈 때마다 모두 독립적인 요청으로 다루어진다는 것이다. 따라서, server로 요청을 할 때마다 내가 누구인지를 매번 알려주어야 한다.

 

server에게 내가 누구인지 알려주는 방법으로는 두 가지가 있다.

Cookie&SessionToken

 

 

Cookie&Session 인증 방식

Cookie와 Session은 모두 server와 client 사이의 intermediate 역할을 한다.

다만 Cookie는 브라우저에 '나'에 대한 데이터를 저장하고, Session은 server 쪽에 '나'에 대한 데이터를 저장한다.

로그인을 하면 session DB에 해당하는 session ID와 user 정보가 저장되고, 브라우저는 cookie를 통해 session ID를 받고, 페이지를 요청하면 server는 DB에서 session ID를 찾는다.

즉, cookie는 session ID 전달을 위한 매개체 역할을 하고, 중요한 user 정보들은 server의 DB에 저장되어 있다.

이 말은 로그인한 user들이 많아짐에 따라 더 큰 DB의 용량이 요구되고 동시에 server 부하도 커진다.

 

예시)

  1.  user가 login을 하기 위해 username과 password를 입력하여 server에 보낸다.
  2. username과 password가 맞다면, server는 session DB에 user를 생성한다. 이때, 이 user에 해당하는 session ID가 있고, 이 session ID는 cookie에 담겨 브라우저에 저장된다.
  3. 같은 웹사이트의 다른 페이지를 요청할 때마다 브라우저의 (session ID를 담고 있는) cookie를 server로 보낸다.
  4. server는 cookie가 온 것만 알고 아직 누구의 cookie인지는 알지 못한다.
  5. cookie가 갖고 있던 session ID가 session DB에 있는 정보와 일치하는 것을 확인하고 어떤 user인지 알게된다.

 

Token 인증 방식

server가 '나'를 인증하는 데에 필요한 정보를 Token에 저장을 하고, Token은 신분증과 같은 역할을 한다.

server가 Token에 정보를 담아 저장하고 이것을 client에게 보내준다. 페이지를 요청하면 server는 DB 필요없이 Token이 유효한지만 검증한다.

 

예시)

  1. user가 login을 하기 위해 username과 password를 입력하여 server에 보낸다.
  2. username과 password가 맞다면, server는 JWT(JSON Web Token)을 생성하여 client에게 보낸다. 이 token은 브라우저의 cookie 또는 local storage에 저장된다.
  3. client는 server의 요청을 보낼 때마다 JWT를 요청 헤더에 포함시킨다.
  4. server는 요청을 맏을 때 token을 검증하여 유효하면 요청을 처리하고 응답한다.

 

두 인증 방식의 차이점

  Cookie&Session-based 인증방식 JWT 인증방식
특징 - stateful(server에서 user 정보와 session ID를 DB에 저장하고 있음)
- server-side session storage에 의존
- stateless(모든 필요 정보들이 JWT에 담겨져 있어서 DB가 필요하지 않음)

 

 

LIST