JWT(Json Web Token)

hi2li·2026년 4월 26일
  • 사용자 인증 정보를 담아서 서버에 전달하는 “토큰 기반의 인증방식”
  • 클라이언트가 서버에 접속하면 서버는 JWT를 생성하여 클라이언트에 전달한다.
  • 클라이언트는 이를 로컬 스토리지에저장해두고, 이후 요청마다 이 토큰으로 인증한다.
  • 정확히는 이미 인증된 사용자를 식별한다.
  • 로그인 완료했을 때 서버가 발급하고, 클라이언트는 다음요청부터 비밀번호 대신 토큰으로 증명한다.

→ “이 토큰은 서버가 발급했고 위조되지 않았다”

왜 JWT인증방식을 사용하는가?

기존에는 서버는 클라이언트의 접속 상태정보를 세션이라는 이름으로 저장해두고, 클라이언트의 요청시 서버는 세션을 조회 해야했다.

하지만 JWT는 사용자 정보를 토큰 본문에 담기 때문에 서버는 상태를 저장하지 않고 토큰만 검증하면 된다.

이는 서버의 부담을 줄여주며 확장성이 높다.

원래 방식은 서버가 클러스터로 묶이는 등 이중화가 되면 각 서버에 세션 정보를 공유해야하는데, JWT는 상태 정보를 저장하지 않아도 되기 때문에 단순히 서버가 같은 secret키만 가지고있으면 되므로 서버 확장성이 높다.

토큰 검증방식

  • 서버는 헤더에 담겨온 JWT를 보고 JWT를 .을 기준으로 3 부분으로 분리한다.
  • header, Payload를 각각 base64URL로 디코딩하여 사용자 정보를 확인.
  • 자신이 가진 secret key로 signature을 다시 계산하여 다시 계산하고 JWT에 담겨있는 signuture과 같은지 비교.

JWT의 구조

  • JWT는 header, Payload, signature이렇게 3 부분으로 구성된다.
Header.Payload.Signature
  • 이때 각 부분은 Base64로 인코딩된다.
  • 서명 알고리즘
  • 토큰 타입
# 디코딩 시 아래와 같음
{
  "alg": "HS256",
  "typ": "JWT"
}

[Payload]

  • 발급자
  • 대상
  • 발급시간
  • 토큰 ID
  • 사용자 정보
  • 이 외에도 개발자가 커스텀 데이터를 넣을 수 있다.
{
  "sub": "123",
  "name": "Alice",
  "iat": 1516239022, 
  "role" : "admin" # 커스텀 값
  
}

[Signature]

  • 헤더와 페이로드를 서버의 secret key로 서명하여 생성한다.
  • 서버에서는 이 signature를 검증하여 위조 여부를 판단할 수 있다.

HMACSHA256(Base64Url(header) + "." + Base64Url(payload), secret) 를 사용하여 생성.

어떤식으로 서버에 전달하나?

  • HTTP 헤더에 담아서 보낸다. (일반적으로)
  • 헤더 이름 : “Authorization”
GET /api/user HTTP/1.1
Host: example.com
Authorization: Bearer <JWT> # 이렇게 JWT를 담아서 전달

Authorization헤더는 HTTP표준에서 인증정보를 넣는 헤더이다. JWT토큰등의 로그인 토큰 뿐만 아니라 , API키, OAuth토큰등을 넣을 수 있다.

  • 이 방식말고도 비표준 방식이 몇가지있는데 쿠키 헤더에 담아서 보내거나, URL파라미터에 담아서 보낼 수는 있다. 하지만 로그에 남거나, 보안이 취약하기 때문에 사용을 권장하지 않는다.

실제 코드 예시

# python (requests사용)
headers = {
    "Authorization": f"Bearer {token}"
}
requests.get(url, headers=headers)
profile
easy come , easy go

0개의 댓글