GDSC Sookmyung 활동/10 min Seminar

쿠키 vs 세션 vs 토큰

최가희 2022. 5. 2. 21:25

본 포스팅은 노마드코더의 세션 vs 토큰 vs 쿠키? 기초개념 잡아드림. 10분 순삭! 콘텐츠를 기반으로 작성된 글 입니다.

01. Introduction

01-1) 쿠키? 세션? 토큰?

Auth(인증) 기능을 만들어 봤다면 아마 쿠키, 세션, 토큰 또는 JWT 같은 용어들을 들어봤을 것입니다.
다들 공감하실지는 모르겠지만, 저는 인증 기능을 구현하면서 이 용어들에 대해 잘 몰라서 늘 헷갈리곤 했는데요.
쿠키, 세션, 토큰의 의미가 무엇이며 서로 어떻게 연결되는지, 언제 무엇을 써야 할지 알아보도록 하겠습니다.

 

01-2) 세션과 토큰의 필요성

우리가 웹사이트를 이용할 때 쓰는 프로토콜 HTTP는 stateless(무상태성)라는 특징을 갖고 있습니다.
서버로 가는 모든 요청이 이전 요청과 독립적으로 다뤄진다는 뜻입니다.
요청이 끝나면 서버는 우리가 누군지 잊어버리게 되는 것이죠.

따라서 서버로 요청할 때마다 우리가 누군지 알려줘야 합니다.

이를 위한 방법에는 두 가지가 존재합니다.
바로 쿠키&세션 기반 인증 방식, JWT 기반 인증 방식입니다.

 

02. 쿠키&세션 기반 인증 방식

02-1) 쿠키란?

쉽게 말해서 쿠키는 서버가 우리에 관한 것을 기억하기 위해 우리의 브라우저에 데이터를 넣을 수 있는 시스템, 즉 그냥 서버와 클라이언트 사이의 매개체 라고 생각할 수 있습니다.


02-2) 쿠키의 동작 과정

  1. 우리가 웹사이트에 방문하면 브라우저는 서버에 요청을 보낸다.
  2. 서버는 이에 대한 응답을 보낸다.
    이 응답에는 모든 데이터와 우리가 찾던 페이지 정보, 또한 경우에 따라 브라우저에 저장하고자 하는 쿠키가 들어있다.

  1. 우리는 이 쿠키를 브라우저에 저장한다.

  1. 이후 해당 웹사이트에 방문할 때마다 브라우저는 해당 쿠키를 포함한 요청을 서버에 전송하게 된다. 서버는 이 쿠키로 우리가 누군지 알아낼 수 있다.

02-3) 세션

  • 클라이언트와 서버 간 연결이 활성화된 상태로,
    쿠키와 마찬가지로 로그인과 같은 사용자 인증을 할때 주로 사용됩니다.
  • 큰 차이점으로는 쿠키는 클라이언트 쪽에 정보를 저장하는 반면,
    세션은 서버 쪽에 정보를 저장한다는 점이 있습니다.

02-4) 쿠키&세션 기반 인증 방식 예시: 로그인

쿠키와 세션에 대해 알아보았으니 이제 쿠키&세션 기반 인증 방식에 대해 살펴보겠습니다.

  1. '가희'라는 유저가 로그인을 하려고 한다. 가희는 '가희'라는 유저네임과 비밀번호를 서버에 보낸다.

  1. 비밀번호가 맞다면, 서버는 세션 DB에 '가희'라는 유저를 생성한다.

  1. 각 세션마다 별도의 ID가 있어서 해당 세션 ID는 쿠키를 통해 브라우저로 돌아오고 저장된다.

  1. 따라서 같은 웹사이트의 다른 페이지로 이동하면, 브라우저는 세션 ID를 갖고 있는 쿠키를 자동으로 서버에게 보내게 된다.
  2. 서버는 세션 ID와 함께 오는 쿠키를 확인하지만, 아직까지 이 세션 ID의 주인이 누군지 알지 못하는 상태이다. 그저 세션 ID가 있는 쿠키를 지닌 요청이 있다는 것만 인지하고 있을 뿐이다.

  1. 이제 서버는 해당 세션 ID를 가지고 세션 DB를 확인한다. 그리고 거기서 이 ID가 '가희'라는 유저네임을 지닌 유저의 것이라는 것을 알게된다.

기억해야 할 점은 중요한 유저 정보는 모두 서버에 있다는 점입니다.
유저가 갖고 있는 건 오직 세션 ID뿐 입니다.
쿠키 역시 그저 세션 ID를 전달하기 위한 매개체일 뿐입니다.

그러면 현재 로그인한 유저들의 모든 세션 ID는 DB에 저장해야 한다는 말인데요.
유저가 늘어남에 따라(즉, 요청이 증가함에 따라) DB 리소스가 더 필요하게 되는 셈인 거죠.
당연히 서버 부하도 심해질 것입니다.

 


03. JWT 기반 인증 방식

이 때 등장하는 것이 JWT(JSON Web Token)입니다.

03-1) JWT란?

토큰은 이렇게 이상하고 무지 긴 string입니다. 쿠키&세션 방식과 마찬가지로 서버로부터 받아서 요청할 때마다 같이 보내줘야 합니다. 서버에게 보여줘야 하는 신분증 같은 거라고 생각할 수 있습니다.


03-2) JWT 기반 인증 방식 예시: 로그인

또 다시 로그인 예시를 통해 JWT 기반 인증 방식을 알아보도록 하겠습니다.

  1. 유저네임 '가히'가 로그인을 하기 위해 유저네임, 비밀번호를 서버에 보낸다.

  1. JWT 기반 인증 방식에서는 유저네임, 비밀번호가 맞다면, 서버가 DB에 뭔가를 생성하지 않는다.(세션 db가 필요없다.)

  1. 대신 서버는 유저의 ID를 가져다가 Access Token과 같은 '사인된 정보'를 string 값으로 보내준다.

  1. 이제 '가희'가 서버에 요청을 하기 위해서는 이 토큰을 같이 보내줘야 한다.
  2. 서버는 토큰을 받으면 해당 사인이 유효한지 체크하고, 토큰이 유효하다면 그제서야 '가희'를 유저로 인증해준다.
    (여기서 유효한지 체크한다는 것은 토큰이 조작되었는지 확인하는 과정이다.)

 


04. 쿠키&세션 vs JWT

그러면 언제 어떤 방법이 사용되는 걸까요?

04-1) 쿠키&세션 기반 인증 방식

세션 방식에서 서버는 로그인 된 유저의 모든 정보를 세션 DB에 저장합니다. 이 정보들을 이용하면 새로운 기능들을 추가할 수 있게 됩니다.

예를 들면, 특정 유저를 쫓아내는 기능을 구현하고 싶을 때, 그냥 세션을 삭제해버리면 됩니다.

더 구체적인 사례로 보자면,

  • 원하지 않는 디바이스에서 강제 로그아웃을 할 수 있게 하거나,
  • OTT 서비스에서 계정 공유 숫자를 제한할 수 있습니다. 현재 로그인을 몇명이 했고, 몇명이 시청하는지 알 수 있습니다.

다만, 이렇게 다 알기 위해서는 DB를 반드시 사고, 유지해야 합니다. 게다가 유저가 늘어나면 늘어날수록 DB도 커져야 한다는 점을 유의해야 합니다.

 


04-2) JWT 기반 인증 방식

  • JWT를 사용하면 생성된 토큰을 추적하지 않습니다. 서버는 오직 토큰이 유효한지만 살펴볼 뿐입니다. 따라서 세션 DB를 따로 살 필요가 없습니다.
  • 하지만 토큰을 추적하지 않기 때문에 쿠키&세션 방식에서 말한 강제 로그아웃과 같은 기능은 구현할 수 없습니다. 해당 토큰이 만료되기 전까지는 유효하기 때문이죠.

  • 그렇다고 JWT가 별로인 것은 아닙니다. DB 없이도 데이터를 사인하고, 유저에게 보내고, 해당 데이터를 돌려받을 때 유효성을 검증할 수 있기 때문입니다.
  • JWT를 사용한 사례
    우리가 얼마전까지 코로나때문에 아주 많이 사용했던 QR 체크인도 바로 JWT가 사용된 qr 코드입니다. 이 외에도 JWT의 사용 사례는 아주 많다고 합니다.
  • 유의해야 할 점은 JWT의 payload는 암호화되지 않기 때문에 토큰을 탈취당할 위험이 있어 유저의 중요한 정보를 담을 수 없다는 점입니다.

 

두 방식 모두 장단점이 있으니 필요에 따라 서비스에 맞는 방식을 선택하면 됩니다.

 


오늘 다뤄본 내용을 정리해보겠습니다.

05. 정리

05-1) 용어

  • 쿠키 = 서버와 클라이언트 간 매개체
  • 세션 = 쿠키랑 비슷. 대신 서버 쪽에 정보를 저장
  • 토큰 = 서버에게 보여줘야하며, 서버가 기억하는 이상하고 무지 긴 string ~ like 신분증
  • JWT = 정보를 갖고 있는 토큰. DB 없이 검증 가능

 

05-2) 쿠키&세션 방식 vs JWT 방식 차이

  • 쿠키/세션 기반 인증 방식
    그냥 세션 id만 주면 되고, 세션에 대한 모든 정보는 세션 DB에 저장되어 있다. 페이지를 요청하면 서버는 세션 ID를 DB에서 찾으면 된다.
  • JWT 기반 인증 방식
    서버가 유저를 인증하는 데에 필요한 정보를 토큰에 저장한다. 그리고 이 토큰을 우리에게 보내준다. 페이지를 요청하면 서버는 DB를 건드릴 필요 없이 해당 토큰이 유효한지만 검증한다.

Reference

세션 vs 토큰 vs 쿠키? 기초개념 잡아드림. 10분 순삭!
세션과 쿠키 차이점
쿠키, 세션, 토큰에 관하여


이미지 자료 제작에 쓰인 아이콘

'GDSC Sookmyung 활동 > 10 min Seminar' 카테고리의 다른 글

디지털 소유권 - NFT와 메타버스  (0) 2022.05.16
CORS란?  (0) 2022.05.12
Web 3.0이란?  (0) 2022.04.04
자연어 : 전처리부터 임베딩까지  (0) 2022.03.14
Shader란?  (0) 2022.03.07