본문 바로가기
백엔드

Cookies,Sessions and Tokens

by juneMiller 2021. 10. 3.

쿠키 Cookie 

사이트에 방문하면 브라우저는 서버에 요청request 을 보내게 되는데 

서버는 이에 응답response하며 당신이 찾던 페이지 정보를 넘겨준다. 

 

이때 넘겨받은 브라우저에 Cookies 정보를 저장하여 

해당 사이트에 접속할때 마다 브라우저는 해당 쿠키도 요청과 함께 보내게 된다. 

 

쿠키는 도메인에 따라 제한적이다. 

 

예를 들어

Youtube가 준 쿠키는  Youtube에만 보내지게 되어있다. 

유효기간이 있을 수 있으며 서버가 정한 하루,일주일 혹은 한달 등. 

 

쿠키는 인증 뿐아니라, 여러가지 정보를 저장 할 수 있다

예를 들어 웹사이트 언어설정을 바꾸면, 서버는 쿠키를 주고 당신이 선택한 언어를 저장한다.  

다음에 다시 윕사이트를 방문시, 쿠키는 요청과 함께 서버로 보내지고 

덕분에 서버는 쿠키가 기억해둔 언어설정의 페이지를 제공하게 되는 것이다. 

 

 

세션 vs 토큰  Sessions vs Token 

 

Stateless 

이전 requeest 와 독립적으로 다뤄진다는 이야기.

요청끼리 연결이 없다, 메모리가 없다.

 

요청이 끝나면, 서버는 우리가 누군지 잊어버리게 되는 것이므로,

요청할 때마다, 우리가 누구인지 알려줘야 한다. 

 

Sessions 

Id + pwd 를 서버에 보내서, DB에 저장된 사용자와 매칭되는 것을 찾아서 

세션 데이터베이스에 유저를 생성한다. 

 

그 Sessions 은 별도의 ID 가 있다. 

 

그 Sessions 은 서버로 보내지고, 해당 세션 ID 를 가지고 있는 쿠키를 통해 

브라우저로 돌아와 저장된다. 

 

웹사이트에서 다른 페이지로 이동할때, 브라우저는 세션 ID 를 갖고 있는 쿠키를 

서버에 보내게 된다.  서버는 받아들이는 쿠키를 보고 세션 ID 와 함께 오는 쿠키를 확인한다. 

이 시점까지 아직 서버는 우리가 누구인지 알 수없다. 

 

서버는 세션 ID가 있는 쿠키를 지닌 요청이 있다는 것만 알고 있다. 

 

그 세션ID를 들고 DB에서 확인해, 거기서 해당 ID 는 유저명의 것이라는 것을 알게되고,

이 시점에서 서버는 우리가 누구인지 알게 되는 것이다. 

 

같은 웹사이트에서 페이지를 이동할때, 위 프로세스를 반복해 진행 될 것이며,

중요한 것은 모든 유저 정보는 서버에 있다는 것이다. 

 

유저가 가지고 있는 것은 오직 Sessions ID 뿐이다. 

 

쿠키는 그저 Sessions ID를 전달하기 위한 매개체 일 뿐이다. 

 

 

Tokens 

세션을 이용해 iOS, Android 앱을 만들 수 있지만  쿠키는 사용할 수 없다.

쿠키는 오직 브러우저에만 있다.  

 

이 경우 우리는 토큰 Tokens 이란것을 이용하게 되는 것이다. 

서버는 세션 DB에서 해당  토큰와 일치하는 유저를 찾게 된다. 

 

토큰은 그냥 이상하게 생긴 String 이라고  생각하면 쉽다. 

 

세션을 유지하기 위해, 현재 로그인 한 모든 유저의 세션 ID 를 DB 에 저장해야 한다는 것이다. 

 

더 많은 유저가 생기고, 그것을 관리하기 위해 쓰게 되는 것이 JWT 토큰 형식이다. 

JWT 로 관리하게 되면, 세션 DB 를 갖출 필요가 없고,

서버는 유저 인증한다고 많은 일을 하지 않아도 된다. 

 

JWT 토큰 형식

세션과 비교하여 다른점은, 모든 것이 동일하나, 서버는 DB에 뭔가를 생성하지 않는다!! 

대신 서버는 유저 ID 를 가져다가, 사인 알고리즘을 이용해서 '사인'을 하게 된다. 

 

그리고 해당 '사인된 정보'를 String 형태로 보내지게 된다. 

 

쿠키는 공간 제약이 있는 반면 JWT 는 제약이 없다는 것도  특징이다.

 

DB를 건드리는 대신, 정보를 사인하고, 전달하는 것이 JWT 토큰 방식이다. 

 

 


세션은 서버는 로그인 된 유저와 모든 정보를 저장한다.

이 정보를 이용해 새로운 기능을 추가할 수 있다. 

 

예를 들면, 특정 유저를 내보내고 싶으면, 그 유저 세션 id 를 databass 에서 지우면 된다. 

인스타그램의 기능 중 하나인, 어떤 디바이스에서 로그인이 되어있는지 알고, 특정 디바이스에서 로그아웃 할수있다.

넥플레스에서 공유가능한 사람 수가 5명으로 지정하거나,현재 로그인 사람이 누구인지, 시청중인지를 파악할 수 있따. 

 

이것이 가능한것은 서버에서 누가 로그인하고,저장했는지 정보가 세션 DB에 있기 때문이다. 

위 같은 기능을 하기위해서는 DB는 커야하며, 사용량에 따라 지불해야 할 금액도 높아진다. 

 

 

유명한 것으로 Redis로, 빠르고 저렴하다. 

 

 

JWT 를 사용하면, 생성된 토큰을 추적하지 않는다. 

서버가 아는 것은 토큰의 유효성 여부일 뿐이다. 

DB를 따로 구매 할 필요 없다. 

 

하지만 세션으로 할 수 있던 추가 기능은 수행 할 수 없다. 

 

'백엔드' 카테고리의 다른 글

XML(eXtensible Markup Language) ?  (0) 2022.01.04
웹(WWW)의 동작 원리  (0) 2022.01.04
Mybatis  (0) 2021.10.10