본문 바로가기

두두의 IT/Computer Science

쿠키 vs 세션 vs 토큰

728x90

쿠키

  • 세션ID 등을 옮기는 시스템. 매개체
  • 특정 사용자의 것을 기억하기 위해 서버는 쿠키를 이용해서 브라우저에 데이터를 넣을 수 있음
  • 도메인에 따라 제한됨(유튜브가 준 쿠키는 유튜브에만 보내짐)
  • 서버가 정한 유효기간이 있음(하루, 한달 등)
  • 여러가지 정보(인증, 언어설정 등)를 저장할 수 있음
  • 자동으로 전송됨

 

Stateless 

  • 서버로 가는 모든 요청이 이전 리퀘스트와 독립적으로 다뤄진다는 뜻
  • 요청끼리 연결(메모리)이 없음
  • 요청이 끝나면 서버는 사용자가 누군지 잊어버릴 것임 => 요청할 때마다 사용자가 누군지 알려줘야 함 => 세션

세션 (유저인증 O)

  • 같은 웹사이트에서 다른 페이지로 이동할 때 위와 같은 프로세스 반복
  • 세션을 이용해 iOS, android 앱을 만들 수 있지만 쿠키는 브라우저에만 있으니가 네이티브 앱에서 사용할 수 없음 => 토큰 사용
  • 현재 로그인한 유저들의 모든 세션 ID를 DB에 저장해야 한다
  • 요청이 들어올 때마다 서버는 쿠키를 받아서 세션 ID를 DB에서 찾아야 함 => 유저가 늘어남에 따라 DB 리소스가 더 필요함 => redis 사용. 해당 목적을 수행하기 위한 빠르고 저렴한 DB
  • 서비스가 커지고 유저 계정을 좀 더 잘 관리하고 싶을 때 사용

[장점]

  • 서버는 로그인 된 유저의 모든 정보를 저장함
  • 해당 정보를 이용하면 새로운 기능들을 추가할 수 있음
  • ex) 특정 유저를 쫓아내고 싶을 때 세션을 삭제해버리면 된다
  • ex) 인스타그램처럼 로그인된 모든 디바이스를 보여주는데 원하지 않는 디바이스에서 강제 로그아웃을 할 수 있다.
  • ex) 넷플릭스처럼 계정 공유 숫자를 제한할 수 있다. 현재 로그인을 몇 명이 했고 시청하는지 알 수 있다.

 

토큰

  • 서버가 기억하는 이상하게 생긴 Sign한 String
  • id카드처럼 서버에게 보여줘야 하는 것

JWT (유저인증 O)

  • 정보를 갖고 있는 토큰
  • 쿠키는 공간제약이 있는데 jwt는 제약이 없어서 세션 ID보다 훨씬 길다
  • DB를 건드리지 않음
  • 암호화되자 않음. 누구나 열어서 해당 컨텐츠를 볼 수 있음. 비밀번호를 JWT에 둬서는 안 됨

[장점]

  • 생성된 토큰을 추적하지 않는다
  • 서버가 아는 것은 토큰이 유효한가 여부일 뿐이다
  • DB를 따로 살 필요가 없다
  • 세션 기능(강제 로그아웃)을 할 수 없다
  • 해당 토큰이 만료되기 전가지는 유효하니까 데이터를 사인하고 유저에게 보내고 해당 데이터를 돌려받을 때 유효성을 검증할 수 있다
  • ex) 코로나 qr체크인 : jwt가 들어간 qr코드