세션과 토큰

세션과 토큰의 인가 과정, 장단점에 대해 알아보자.
Nov 10, 2023
세션과 토큰
목록
세션 기반 인증, 토큰 기반 인증이라고 많이들 얘기하지만 기본적으로 세션과 토큰은 인증 보다는 인가와 더 관련된 기술이다.

인증과 인가

인증 (Authentication)

인증은 이 클라이언트의 사용자가 우리 서비스에 가입한 사용자인지 아닌지 판단하는 절차를 말한다. 단순하게 로그인 과정만을 인증이라고 생각하면 된다. 클라이언트는 아이디와 비밀번호를 입력하고, 서버에서는 해당 정보를 받아 우리 서비스에 있는 사용자인지 아닌지 검증한다.

인가 (Authentication)

인가는 인증된 사용자해당 정보에 접근할 수 있는 권한 여부에 대해 판단하는 절차를 말한다. 예를 들어, 이 사용자가 일반 유저라면 내 정보에까지만 접근할 수 있고, 어드민 유저라면 모든 회원 정보를 관리하는 페이지에 까지도 접근할 수 있다.
 

세션 기반 인가 과정

세션은 특별히 설정하지 않으면 서버의 메모리에 위치한다. 즉, 세션 기반 인가는 사용자의 로그인 상태를 서버에 저장하고 있는 것이다.
  1. 브라우저에서 사용자가 로그인을 한다.
  1. 서버는 사용자 정보를 세션에 저장하고, 응답으로 session ID (데이터 식별자)를 반환한다.
  1. 브라우저는 인증이 필요한 정보에 접근할 때 마다 (로그인이 필요한 정보들 ex. 마이페이지) session ID를 HTTP Cookie 헤더에 넣어 서버에 요청한다.

토큰 기반 인가 과정

토큰 기반 인가는 세션과 달리 상태를 저장하지 않고, 토큰으로 인증의 여부를 판단한다. 세션과의 가장 큰 차이점이다. 토큰은 HTTP의 무상태성(stateless)에 대해 이해하면 토큰기반 인가에 대해 더 쉽게 이해할 수 있다.
저장하는 토큰에도 여러 종류가 있지만, 가장 유명한 것은 JWT (Jason Web Token) 이다.
  1. 브라우저에서 사용자가 로그인을 한다.
  1. 서버는 사용자의 정보를 데이터베이스에 저장하고, 응답으로 토큰을 반환한다. 이 토큰을 엑세스 토큰 (access token) 이라고 하고, 페이로드 (payload)에는 사용자를 식별할 수 있지만 민감하지 않은 정보 (회원번호 등)으로 해당 사용자를 증명한다.
  1. 브라우저는 토큰을 로컬 스토리지 또는 쿠키에 저장한다.
  1. 인증이 필요한 정보에 접근할 때 마다 엑세스 토큰을 HTTP Authorization 헤더에 넣어 서버에 요청한다. (쿠키에 넣어 요청할 수도 있다.)

HTTP 무상태성 (Stateless)

HTTP는 상태를 유지하지 않는 프로토콜 이다. 각각의 요청은 서로 독립적이고, 이전 요청과의 상태 정보가 서버에 유지 되지 않는다는 것을 의미한다. 당연히 서버의 리소스가 요청 사이에서 공유되지 않는다.

세션 기반 vs 토큰 기반

그래서 둘의 장단점은 무엇인가.

패킷의 사이즈

여기서 사이즈는 각 요청과 응답시 패킷 (packet)의 사이즈를 의미한다. 패킷은 데이터를 전송하는데 사용 되는 작은 단위의 정보 묶음이다. 이 패킷의 사이즈는 세션이 토큰보다 가볍다.
왜냐하면 세션은 데이터 전송시 session ID만 보내면 되지만, 토큰의 경우 데이터 식별자 뿐만 아니라 토큰에 대한 여러 정보들을 포함하고 있기 때문이다. 토큰에는 토큰 발행소, 번호, 유효기간, 생성시간 등 여러 정보를 가지고 있다.

안전성과 보안문제

세션이 토큰보다 보안적으로 더 유리하다.
왜냐하면 세션은 모든 인증 정보를 서버에서 관리하기 때문에, 탈취 당하더라도 서버측에서 해당 세션을 무효처리 하 수 있다.
그러나 토큰의 경우 서버에서 상태를 저장하지 않기 때문에, 탈취 당하더라도 서버에서 알아챌 수 없다. 이를 대비하여 엑세스 토큰의 유효기간을 짧게 주고, 리프레시 토큰 (refresh token)을 발급하여 엑세스 토큰이 만료시 새로 발급하는 형식으로 그 위험성을 낮추고 있다.
해당 내용과 관련하여 아래 링크에 정리해 두었으니 궁금하다면 확인해보자.

서버의 확장성

앞서 다룬 토큰의 단점에도 불구하고 이 확장성 때문에 많은 인가 관련 로직들이 토큰 기반으로 구현되고 있다. 토큰 기반의 인가 방식은 수평확장이 가능하다.
서버의 확장방법에는 수직확장과 수평확장이 있다. 수직확장, 또는 스케일업(scale up)은 단일 서버의 스펙을 업그레이드 시키는 방식이다. 단순히 서버의 메모리를 확장한다거나, CPU를 더 좋은 제품으로 교체하는 등을 예로 들 수 있다. 하지만 수직확장의 경우, 확장될 수 있는 범위에 비해 비용이 많이 들기 때문에 일반 서버의 확장 방식으로는 사용되지 않느낟.
반대로 수평확장, 또는 스케일아웃(scale out)은 서버를 여러대로 늘리는 것이다. 이는 수직확장보다 비용도 적게 들고, 원하는 만큼 서버를 확장시킬 수 있다.
그러나 세션의 경우 수평확장이 어렵다. 왜냐하면 세션은 서버의 메모리에 저장되는 것인데 하나의 서버가 아닌 다른 서버들이 존재했을 때 그 세션의 상태를 맞추기 힘들기 때문이다. 이를 해결할 수 있는 방법이 존재하지만 토큰 방식에 비해 확장성이 어려운 것은 분명하다.
세션
토큰
서버의 부담
부담이 크다
부담이 적다
패킷의 사이즈
작다
크다
보안성
비교적 안전하다
비교적 위험하다
서버의 확장성 (수평 확장 여부)
가능하나 어렵다
가능하다

References

Share article

haccoon