Skip to content

JWT — cấu trúc và cách xác minh ​

JWT (JSON Web Token) là một chuỗi gồm ba phần, phân cách bằng dấu chấm: header.payload.signature. Mỗi phần được mã hoá base64url từ một đối tượng JSON.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTYiLCJuYW1lIjoiUmludGMiLCJleHAiOjE3MzAwMDAwMDB9.4f8a2c...
└──────────── header ────────────┘ └──────────────── payload ────────────────┘ └── signature ──┘
  • Header: khai báo thuật toán ký (alg, ví dụ HS256 hoặc RS256) và loại token (typ: JWT).
  • Payload: chứa các claim (thông tin) — ví dụ sub (subject, tức user id), exp (thời điểm hết hạn), iss (issuer, ai cấp token), aud (audience, token dành cho service nào). Lưu ý: payload chỉ được encode base64, không mã hoá — ai cũng đọc được nội dung này nếu có token, vì vậy tuyệt đối không nhét dữ liệu nhạy cảm (mật khẩu, số thẻ...) vào claim.
  • Signature: phần đảm bảo token không bị chỉnh sửa và đúng là do bên phát hành cấp.

Cách ký và xác minh phụ thuộc vào thuật toán khai báo trong header:

HS256 (đối xứng)RS256 (bất đối xứng)
Cơ chếDùng một khoá bí mật (secret) duy nhất cho cả ký và xác minhDùng cặp khoá riêng/công khai (private/public key) — private key để ký, public key để xác minh
Ai ký đượcChỉ bên giữ secretChỉ bên giữ private key
Ai xác minh đượcChỉ bên giữ cùng secret đó (thường chỉ có 1 server)Bất kỳ ai có public key — không cần biết private key
Phù hợp khiHệ thống nhỏ, chỉ một service phát hành và kiểm tra tokenHệ thống phân tán, nhiều service độc lập cần tự xác minh token mà không cần hỏi lại service phát hành

Quá trình xác minh (verify) một JWT ký bằng RS256, ví dụ:

  1. Server nhận token, tách header.payload và signature.
  2. Server dùng public key của bên phát hành, áp dụng thuật toán xác minh RSA lên signature để lấy lại giá trị hash gốc.
  3. Server tự tính hash SHA-256 của chuỗi header.payload nhận được.
  4. So sánh hai giá trị hash: khớp → token hợp lệ, chưa bị sửa; không khớp → từ chối ngay lập tức.

Ngoài chữ ký, một hệ thống xác minh JWT đúng cách còn phải kiểm tra thêm: exp (chưa hết hạn), aud (token đúng dành cho service này), iss (token đến từ nguồn tin cậy) — thiếu các bước này là lỗi phổ biến dù chữ ký vẫn đúng.