🎫
← Quay lại hướng dẫn

Giải thích cấu trúc token JWT: Header, Payload và Signature

· Thẻ: jwt-structure, jwt-header, jwt-payload, jwt-signature, json-web-token

Giải thích cấu trúc token JWT

Mỗi JSON Web Token (JWT) là một chuỗi nhỏ gọn, an toàn với URL, mang theo các claim giữa hai bên. Hiểu cấu trúc bên trong của nó là điều thiết yếu đối với bất kỳ nhà phát triển nào làm việc với bảo mật dựa trên token.

Ba phần của JWT

Một JWT bao gồm ba phần được phân tách bằng dấu chấm (.):

header.payload.signature

Ví dụ:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Mỗi phần là JSON được mã hóa base64url. Một JWT được ký, không được mã hóa — bất kỳ ai cũng có thể giải mã và đọc nội dung của nó.

Phần 1: Header

Header chứa siêu dữ liệu về token — thuật toán ký và loại token.

| Trường | Mô tả | Giá trị ví dụ | |-------|-------------|----------------| | alg | Thuật toán ký (bắt buộc) | HS256, RS256, ES256 | | typ | Loại token (tùy chọn) | JWT | | kid | ID khóa (tùy chọn) | "key-1" |

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

Trường alg cho bên xác minh biết thuật toán nào đã tạo ra chữ ký. Sự không khớp thuật toán — hoặc chấp nhận alg: "none" — là một lỗ hổng bảo mật JWT phổ biến.

Phần 2: Payload

Payload chứa các claim về người dùng và siêu dữ liệu. Các claim được chia thành ba loại:

Registered Claims

| Claim | Tên đầy đủ | Mục đích | |-------|-----------|---------| | iss | Issuer | Bên phát hành token | | sub | Subject | Xác định người dùng | | aud | Audience | Bên nhận dự kiến | | exp | Expiration | Dấu thời gian hết hạn của token | | nbf | Not Before | Token chưa có hiệu lực trước thời điểm này | | iat | Issued At | Dấu thời gian tạo token | | jti | JWT ID | Định danh duy nhất của token |

Ví dụ Payload đã giải mã

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022,
  "exp": 1516242622,
  "iss": "https://auth.example.com"
}

Các public claim được định nghĩa trong sổ đăng ký IANA hoặc sử dụng các URI chống va chạm. Các private claim là các claim tùy chỉnh do bên phát hành và bên tiêu thụ thỏa thuận.

Phần 3: Signature

Chữ ký được tạo bằng cách kết hợp header đã mã hóa, payload đã mã hóa và một secret key bằng thuật toán lấy từ header. Nó phục vụ hai mục đích:

  1. Tính toàn vẹn — xác nhận token không bị sửa đổi sau khi ký.
  2. Xác thực — chứng minh token được ký bởi bên dự kiến.

Tạo chữ ký HS256

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

Tạo chữ ký RS256

RSASHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  privateKey
)

Base64url so với Base64 tiêu chuẩn

| Khía cạnh | Base64 tiêu chuẩn | Base64url | |--------|-----------------|-----------| | Ký tự 62 | + | - | | Ký tự 63 | / | _ | | Phần đệm | = | Bỏ qua |

Cách mã hóa này đảm bảo JWT an toàn cho các HTTP header, tham số truy vấn và đường dẫn URL mà không cần mã hóa phần trăm (percent-encoding).

Quy trình tạo JWT hoàn chỉnh

  1. Tạo JSON header và mã hóa nó bằng base64url.
  2. Tạo JSON payload và mã hóa nó bằng base64url.
  3. Nối chúng với dấu phân tách ..
  4. Ký bằng thuật toán và secret đã chọn.
  5. Mã hóa chữ ký bằng base64url.
  6. Nối cả ba phần với dấu phân tách ..

Các lưu ý bảo mật

  • Không bao giờ lưu trữ secret trong payload. Payload chỉ được mã hóa, không được mã hóa an toàn (encrypted).
  • Luôn xác minh chữ ký. Nếu không xác minh, bất kỳ ai cũng có thể giả mạo token.
  • Kiểm tra header alg. Từ chối alg: "none" và các nỗ lực hạ cấp thuật toán.
  • Đặt thời gian hết hạn ngắn. Sử dụng claim exp trong vài phút hoặc vài giờ, không phải vài tháng.

Giải mã token JWT trực tuyến

Sử dụng công cụ JWT decoder để kiểm tra bất kỳ token nào. Dán token vào và xem ngay header, payload và thuật toán ký đã giải mã. Toàn bộ quá trình xử lý diễn ra trong trình duyệt của bạn.

Giải thích cấu trúc token JWT: Header, Payload và Signature - CoolTool