#11. Token

jychan99·2025년 3월 20일

개념정리

목록 보기
11/22

API를 사용하는 웹서비스에 유저인증을 처리하는 가장 좋은 방법 중하나가 토큰이다.

토큰은 옛날 버스티켓처럼 유저가 해당 사이트를 이용하는 권한을 발급하는것과 같다.

토큰 사용 이유

Stateless
토큰기반 인증은 서버에 유저 정보를 가지지않아 서버를 확장해도 문제가없다.

모바일 어플리케이션에 적합

인증정보를 다른 어플리케이션에 전달
대표적으로 Oauth

보안
다만 토큰을 쓴다고 무조건 보안위협에서 벗어날 수 있는것은 아니다.

토큰 종류

토큰 기반의 인증은 크게 두가지로 일반 토큰 기반의 인증과 클레임(Claim) 토큰 기반 인증으로 나뉜다.

일반 토큰 기반 인증
과거에 많이 사용하던 방식으로 주로 의미가 없는 문자열로 구성되어있으며 아래와 같이 표현된다.

bc1a9dcb734ff89a5d1eac98d2d443d9

일반 토큰 기반 인증은 단순문자열이고, 정보를 담지않기때문에 토큰을 검증할 때 필요한 관련 정보들을 서버에 저장해두고 있었기 때문에 항상 DB에 접근해야하는데, 이과정에서 부하가 걸릴수도있다.

그래서 나온방법이

Claim기반 토큰 인증
클레임이란 사용자 정보나 데이터 속성등을 의미한다.

abcd123aec.ef502a32.d920aecc9
(header).(payload).(signature)

로 이루어진다.

header
헤더에는 어떤토큰인지, 어떤 알고리즘으로 암호화되어있는지 담겨있다.

header example
{
  "alg": "HS256",
  "typ": "JWT"
}

payload
페이로드에는 정보가 담겨있다. 민감한 정보는 되도록이면 담지않는것이 좋다.

payload example
{
  "id": "test12345",
  "role": "user",
  "age": 20
}

signature
헤더와 페이로드가 완성되었으면 원하는 비밀키(암호화에 추가할 salt)로 암호화한다.

예를 들어, 만약 HMAC SHA256 알고리즘(암호화 방법중 하나)을 사용한다면 signature는 아래와 같은 방식으로 생성된다.

HMACSHA256(base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret);

그래서 클레임 토큰 이라고 하면 토큰 안에 사용자 정보나 데이터 속성들을 담고있는 토큰이라 생각하면 되고, 이런 클레임을 기반한 토큰 중 가장 대표적인 것이 JWT가 있다.

{
  "id":"test12345",
  "role":"user",
  "age":"20"
}

JWT

Json Web Token은 JSON 객체에 인증 정보를 담아 비밀키로 서명한 토큰이다.

AccessToken
실제 권한을 받는 토큰
보통 유효기간을 짧게주어(1시간 또는 30분...etc)탈취되어도 오래사용하지 못하도록 한다.

RefreshToken
Accesstoken이 만료되었을때, 유효기간을 갱신하기 위한 토큰.

profile
내가 지금 두려워 하고 있는 일이 바로 내가 지금 해야 할 일이다. 🐍

0개의 댓글