JWT (JSON Web Token)

찬민·2024년 9월 5일

TIL

목록 보기
49/62

JWT (JSON Web Token)는 JSON 포맷을 사용하여 클레임(Claim)을 저장하고 전송하는 방법이다. 주로 인증과 권한 부여를 목적으로 사용된다. 클라이언트와 서버 간에 정보를 안전하게 전달하기 위해 JWT를 사용하는 것이 일반적이다.


JWT의 구조

JWT는 세 부분으로 나뉜다:
1. Header (헤더): 토큰의 타입과 해싱 알고리즘을 정의한다.
2. Payload (페이로드): 토큰에 담길 클레임 정보를 포함한다. 클레임에는 토큰이 발급된 시간, 유효 기간, 사용자 정보 등을 담을 수 있다.
3. Signature (서명): 헤더와 페이로드의 무결성을 보장하기 위해 서명한 부분이다. 이 서명은 비밀키를 사용해 생성된다.

예시:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

각각의 파트는 Base64URL로 인코딩되어 점(.)으로 구분된다.


Header (헤더)

Header는 JWT의 메타 데이터를 포함하는 부분이다. 일반적으로 두 가지 정보를 담는다:

  • alg: 해싱 알고리즘을 지정한다 (예: HS256, RS256).
  • typ: 토큰의 타입을 나타낸다 (일반적으로 JWT).

예시:

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

Payload (페이로드)

Payload는 클레임(Claim)이라고 불리는 사용자 및 관련 데이터가 저장된 부분이다. 클레임은 크게 세 가지로 분류된다:

  • 등록된 클레임 (Registered Claims): 토큰 사용을 표준화하기 위해 권장되는 클레임 (예: iss, exp, sub, aud).
  • 공개 클레임 (Public Claims): 사용자 정의가 가능한 클레임으로, 충돌이 없도록 주의해야 한다.
  • 비공개 클레임 (Private Claims): 클라이언트와 서버 간에 동의된 클레임이다.

예시:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

Signature (서명)

Signature는 헤더, 페이로드, 비밀키를 결합한 후 해싱 알고리즘으로 생성된다. 이를 통해 데이터의 무결성을 보장하고, 누군가 토큰을 위조하는 것을 방지할 수 있다.

예시 서명 생성:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

JWT 사용 사례

JWT는 주로 인증(Authentication)권한 부여(Authorization)에서 사용된다.

  • 인증: 사용자가 로그인하면 서버는 JWT를 생성하여 클라이언트에게 반환한다. 이후 클라이언트는 JWT를 포함하여 서버에 요청을 보내고, 서버는 해당 JWT를 검증하여 사용자를 인증한다.
  • 권한 부여: JWT에 사용자의 역할(예: 관리자, 일반 사용자)을 포함시켜, 해당 사용자의 권한을 관리할 수 있다.

JWT의 장점

  • 자기 포함적: JWT는 필요한 모든 정보를 자체적으로 포함하고 있어, 별도의 상태 저장이 필요하지 않다.
  • 확장성: 다양한 클레임을 담을 수 있어 유연하게 확장 가능하다.
  • 안전성: 비밀키로 서명되어 있어 변조를 방지한다.

JWT의 단점

  • 크기: JWT는 모든 데이터를 토큰 안에 포함하기 때문에, 매우 길어질 수 있다.
  • 보안 위험: 토큰이 유출되면 만료되기 전까지는 사용자가 해당 시스템에 접근할 수 있기 때문에, 반드시 HTTPS를 통해 전송해야 한다.

0개의 댓글