상세 컨텐츠

본문 제목

[nestJS] JWT의 구조는 어떻게 되있는가 payload 등

카테고리 없음

by esoesmio 2024. 5. 9. 18:56

본문

JWT (JSON Web Token)는 세 부분으로 구성된 토큰 형식입니다: 헤더(Header), 페이로드(Payload), 그리고 서명(Signature). 여기서 페이로드 부분은 토큰 내에 실제로 전달되는 데이터를 담고 있으며, 다양한 정보(클레임)를 포함할 수 있습니다. 페이로드는 Base64Url 방식으로 인코딩되어 네트워크를 통해 전송됩니다.

### JWT 페이로드의 구성

JWT 페이로드는 주로 다음과 같은 클레임들을 포함할 수 있습니다:

1. **등록된(Registered) 클레임**: 이 클레임들은 토큰의 용도를 명확하게 하기 위해 예약된 이름을 사용합니다. 주요 등록된 클레임은 다음과 같습니다:
   - `iss` (Issuer): 토큰을 발행한 발행자를 나타냅니다.
   - `sub` (Subject): 토큰의 주제를 나타내며, 사용자 ID 또는 주요 식별자가 될 수 있습니다.
   - `aud` (Audience): 토큰의 수신자 또는 대상 audience를 지정합니다.
   - `exp` (Expiration Time): 토큰의 만료 시간을 지정합니다. 이 값은 UNIX 타임스탬프(1970년 1월 1일부터의 초 단위)로 표현됩니다.
   - `nbf` (Not Before): 토큰이 활성화되기 전의 시간을 지정합니다. 이 또한 UNIX 타임스탬프로 표현됩니다.
   - `iat` (Issued At): 토큰이 발행된 시간을 나타냅니다.
   - `jti` (JWT ID): 토큰의 고유 식별자로, 주로 토큰의 중복을 방지하는 데 사용됩니다.

2. **공개(Public) 클레임**: 사용자 또는 개발자가 자유롭게 정의할 수 있는 클레임입니다. 충돌을 방지하기 위해 클레임 이름을 URI 형식으로 사용할 수 있습니다.

3. **비공개(Private) 클레임**: 서로 합의하에 사용하고, 등록되지 않은 클레임입니다. 이 클레임들은 두 개체 사이에서 합의된 정보를 전달하는 데 사용됩니다. 예를 들어, 사용자 이름, 이메일 주소 등의 개인적인 정보가 여기에 해당할 수 있습니다.

### 예시 페이로드

 {
  "iss": "yourwebsite.com",
  "sub": "user123456",
  "aud": "yourwebsite.com",
  "exp": 1716239022,
  "iat": 1624038022,
  "nbf": 1624036622,
  "jti": "unique-jwt-id",
  "customClaim": "customValue"
}



이 예시에서는 몇 가지 등록된 클레임과 `customClaim`이라는 비공개 클레임을 포함하고 있습니다. `customClaim`은 사용자 정의 데이터를 포함할 수 있는 예시로, 실제 사용 시에는 애플리케이션의 요구에 맞게 조정될 수 있습니다.

### JWT 페이로드의 활용

JWT 페이로드는 주로 사용자 인증에 사용되며, 클라이언트가 서버에 요청을 보낼 때마다 해당 토큰을 전송하여 자신의 신원을 증명하고 서버의 자원에 접근 권한이 있는지를 확인하는 데 사용됩니다. 페이로드에 포함된 클레임은 서버가 사용자의 신원을 검증하고,

 요청에 필요한 조치를 취하는 데 필요한 정보를 제공합니다.

 

 

 

 

JWT (JSON Web Token)는 세 부분으로 구성됩니다: 헤더(Header), 페이로드(Payload), 그리고 서명(Signature). 이 중 헤더와 서명은 토큰의 구조와 보안을 정의하는 데 중요한 역할을 합니다.

### 1. JWT 헤더(Header)

JWT의 헤더는 토큰의 첫 번째 부분으로, 토큰이 사용하는 유형과 알고리즘에 대한 정보를 담고 있습니다. 헤더는 보통 두 가지 주요 정보를 포함합니다:

- **alg (Algorithm)**: 이 필드는 JWT의 서명을 생성하고 검증할 때 사용되는 알고리즘을 명시합니다. 예를 들어, HMAC SHA-256은 'HS256'으로, RSA SHA-256은 'RS256'으로 표현됩니다. 이 값은 서버가 토큰을 검증할 때 사용할 알고리즘을 지정합니다.
- **typ (Type)**: 이 필드는 토큰의 타입을 명시하며, 일반적으로 "JWT"라고 명시됩니다. 이는 단순히 토큰이 JWT 형식임을 나타내는 목적으로 사용됩니다.

#### 예시 헤더

 

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


```
이 헤더는 Base64Url 인코딩되어 JWT의 첫 부분을 형성합니다.

### 2. JWT 서명(Signature)

JWT의 서명은 토큰의 마지막 부분으로, 헤더와 페이로드의 무결성과 인증을 보장하는 데 사용됩니다. 서명 과정은 다음과 같이 이루어집니다:

1. **헤더와 페이로드 인코딩**: 먼저, 헤더와 페이로드는 각각 Base64Url 방식으로 인코딩됩니다.
2. **서명 생성**: 인코딩된 헤더와 페이로드를 `.`으로 연결한 후, 지정된 알고리즘(`alg` 필드에서 정의)에 따라 서버의 비밀 키 또는 개인 키를 사용하여 서명이 생성됩니다.
   - **대칭 알고리즘 (예: HS256)**: 서명을 생성하고 검증하는 데 동일한 비밀 키를 사용합니다.
   - **비대칭 알고리즘 (예: RS256)**: 개인 키로 서명을 생성하고 공개 키로 서명을 검증합니다.

#### 서명 과정의 예
서명은 다음과 같은 방식으로 생성됩니다:

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


여기서 `secret`은 서버가 보관하는 비밀 키입니다. 비대칭 알고리즘을 사용하는 경우, 서명을 생성할 때는 개인 키가 사용되고, 검증할 때는 공개 키가 사용됩니다.

### JWT의 완성
완성된 JWT는 다음과 같은 형태를 가집니다:
```

base64UrlEncode(header).base64UrlEncode(payload).signature

```
여기서 `signature` 부분은 위의 방법으로 생성된 해시 값입니다.

### JWT 서명의 중요성
서명 부분은 JWT가 중간에 조작되지 않았음을 보증합니다. 서버는 받은 토큰의 서명을 검증하여, 해당 토큰이 서버에서 발행되었고 변경되지 않았음을 확인할 수 있습니다. 이 과정을 통해 토큰 기반 인증 시스템의 보안성이 크게 향상됩니다.



이처럼, JWT의 헤더와 서명은 토큰의 신뢰성과 보안을 보장하는 데 중요한 역할을 하며, 올바르게 구현될 때 강력한 인증 및 정보 교환 도구가 될 수 있습니다.

댓글 영역