Giới thiệu

JWT (JSON Web Token) là một tiêu chuẩn mã hóa gọn nhẹ và bảo mật được sử dụng rộng rãi để xác thực và trao quyền truy cập trong các ứng dụng web và API. Với cấu trúc đơn giản nhưng mạnh mẽ, JWT cho phép truyền tải dữ liệu giữa các bên một cách an toàn, đồng thời giúp tối ưu hóa hiệu suất của hệ thống.

JWT là gì?

JSON Web Token (JWT) là một chuỗi JSON được mã hóa và ký, dùng để truyền thông tin một cách an toàn giữa các bên. JWT thường được sử dụng trong quá trình xác thực (Authentication) và phân quyền (Authorization) cho người dùng.

Cấu trúc của JWT

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

  • Header:
    • Chứa thông tin về loại token và thuật toán mã hóa.
    • Ví dụ:
json
{
  "alg": "HS256",
  "typ": "JWT"
}
  • Sau khi mã hóa Base64Url, phần này trông như sau: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
  • Payload:
    • Chứa dữ liệu (claims) như thông tin người dùng hoặc các tuyên bố khác.
    • Có hai loại claims:
      • Registered Claims: Các claims được định nghĩa trước như iss (issuer), exp (expiration), sub (subject).
      • Custom Claims: Các claims tùy chỉnh do người phát triển định nghĩa.
    • Ví dụ:
json
{
  "userId": 123,
  "role": "admin",
  "exp": 1666666666
}
  • Sau khi mã hóa Base64Url, phần này trông như sau: eyJ1c2VySWQiOjEyMywicm9sZSI6ImFkbWluIiwiZXhwIjoxNjY2NjY2NjY2fQ
  • Signature:
    • Được tạo bằng cách mã hóa phần header và payload cùng với một khóa bí mật bằng thuật toán được chỉ định trong header.
    • Ví dụ:
plain
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)
  • Kết quả là một chuỗi mã hóa dùng để xác minh tính toàn vẹn và tính xác thực của JWT.

Một ví dụ hoàn chỉnh về JWT:

plain
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywicm9sZSI6ImFkbWluIiwiZXhwIjoxNjY2NjY2NjY2fQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Cách hoạt động của JWT

  1. Người dùng đăng nhập: Khi người dùng đăng nhập vào hệ thống, máy chủ sẽ xác thực thông tin đăng nhập (username, password).
  2. Tạo token: Sau khi xác thực thành công, máy chủ tạo một JWT chứa thông tin người dùng và gửi về client.
  3. Truyền token: Client lưu JWT (thường trong localStorage hoặc cookies) và gửi token này kèm theo các yêu cầu tiếp theo đến máy chủ.
  4. Xác thực token: Máy chủ nhận yêu cầu từ client, kiểm tra JWT để xác minh người dùng và quyền truy cập.

JWT và REST API có mối liên hệ gì?

JWT và REST API thường được sử dụng cùng nhau để cung cấp giải pháp xác thực và phân quyền hiệu quả. Dưới đây là mối liên hệ giữa chúng:

  • Không trạng thái (Stateless): REST API được thiết kế không lưu trạng thái, và JWT hỗ trợ điều này bằng cách lưu trữ tất cả thông tin xác thực bên trong token. Máy chủ không cần lưu trữ thêm dữ liệu về phiên làm việc.
  • Xác thực người dùng: JWT có thể được đính kèm trong header của mỗi yêu cầu HTTP (thường là Authorization: Bearer <token>), giúp REST API xác minh người dùng mà không cần thực hiện quá nhiều truy vấn cơ sở dữ liệu.
  • Phân quyền truy cập: JWT có thể chứa thông tin về vai trò hoặc quyền hạn của người dùng, giúp REST API dễ dàng quyết định người dùng có quyền truy cập vào tài nguyên nào.
  • Tính di động: Do JWT là chuẩn JSON, chúng dễ dàng được sử dụng trên nhiều nền tảng khác nhau và hoàn toàn tương thích với các REST API hiện đại.

Ưu điểm của JWT

  • Nhẹ và nhanh: JWT được mã hóa gọn nhẹ, giúp tăng tốc độ xử lý và truyền dữ liệu.
  • Không trạng thái (Stateless): Máy chủ không cần lưu trạng thái của JWT, giảm tải lưu trữ.
  • Bảo mật: Sử dụng chữ ký số để xác minh tính toàn vẹn và tránh bị giả mạo.
  • Tương thích cao: JWT có thể được sử dụng với nhiều ngôn ngữ và nền tảng khác nhau.

Hạn chế của JWT

  • Không thể thu hồi: Một khi JWT được cấp phát, không thể thu hồi hoặc vô hiệu hóa trước khi hết hạn.
  • Thời gian sống giới hạn: Nếu thời gian sống quá dài, JWT có thể trở thành rủi ro bảo mật. Nếu quá ngắn, nó gây bất tiện cho người dùng.

Ứng dụng trong thực tế

JWT được sử dụng rộng rãi trong các lĩnh vực như:

  • Xác thực người dùng: Đăng nhập vào hệ thống và duy trì phiên làm việc.
  • Phân quyền: Quyết định quyền truy cập tài nguyên của người dùng.
  • Trao đổi dữ liệu an toàn: Truyền thông tin nhạy cảm giữa các bên một cách bảo mật.

Kết luận

JWT là một công cụ mạnh mẽ và linh hoạt để xác thực và phân quyền trong các hệ thống hiện đại. Tuy nhiên, để sử dụng hiệu quả, cần nắm vững các ưu nhược điểm và áp dụng đúng cách để đảm bảo an toàn và hiệu suất cao.