JSON Web Token (JWT) là gì? Cấu trúc và cơ chế hoạt động chi tiết

Nội dung chính

 

  • Khái niệm JWT và vai trò trong xác thực, uỷ quyền, trao đổi dữ liệu

 

  • Giải nghĩa từng phần trong cụm từ “JSON Web Token”

 

  • Phân tích cấu trúc của JWT và chức năng từng phần

 

  • Tìm hiểu cơ chế hoạt động của JWT trong hệ thống xác thực

 

  • Lý do nên sử dụng JWT trong ứng dụng hiện đại

 

  • Các trường hợp thực tế nên áp dụng JWT

 

JWT là gì?

 

JWT (JSON Web Token) là một tiêu chuẩn mở giúp truyền tải thông tin bảo mật giữa client và server dưới dạng đối tượng JSON được mã hóa. Mỗi JWT chứa các claim – tức là các cặp dữ liệu thể hiện quyền hoặc thông tin của người dùng.

 

Token này được ký bằng thuật toán mã hóa để đảm bảo tính toàn vẹn, nghĩa là sau khi phát hành, nội dung không thể bị thay đổi nếu không có khóa bí mật phù hợp.

 

JWT, JSON, Token

 

Giải nghĩa từng phần trong tên gọi JSON Web Token

 

1. JSON

 

JSON (JavaScript Object Notation) là định dạng văn bản được sử dụng để trao đổi dữ liệu giữa client và server. Dữ liệu trong JSON dễ đọc, dễ phân tích và có thể được xử lý bởi hầu hết các ngôn ngữ lập trình hiện nay.

 

Từ khi ra đời vào đầu những năm 2000, JSON đã nhanh chóng thay thế XML và trở thành định dạng tiêu chuẩn trong các API web.

 

JWT, JSON, Token

 

2. Token

 

Token là một chuỗi ký tự đại diện cho một thực thể — chẳng hạn như người dùng hoặc ứng dụng. Trong quá trình xác thực, token cho phép server biết được ai đang gửi yêu cầu.

 

Khác với các token thông thường, JWT còn chứa thêm claim, dùng để truyền thông tin về người phát hành, thời gian hiệu lực, quyền truy cập,… giúp việc xác thực trở nên rõ ràng và linh hoạt hơn.

 

Cấu trúc của JSON Web Token

 

Một JWT gồm ba phần được nối với nhau bằng dấu chấm (.) và được mã hóa bằng Base64URL. Cấu trúc tổng quát:


 
xxxxx.yyyyy.zzzzz
 

Trong đó:

 

  • Header – chứa thông tin về loại token và thuật toán ký.

 

  • Payload – chứa dữ liệu (claim) mà token mang theo.

 

  • Signature – chữ ký xác thực tính toàn vẹn của token.

 

Ví dụ về một JWT:


 
eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiSm9lIENvZGVyIn0.5dlp7GmziL2QS06sZgK4mtaqv0_xX4oFUuTDh1zHK4U
 

Phân tách ra ta có:

 

  • Header: eyJhbGciOiJIUzI1NiJ9

 

  • Payload: eyJuYW1lIjoiSm9lIENvZGVyIn0

 

  • Signature: 5dlp7GmziL2QS06sZgK4mtaqv0_xX4oFUuTDh1zHK4U

 

JWT, JSON, Token

 

1. Header

 

Header (JOSE header) định nghĩa loại token và thuật toán dùng để ký (ví dụ: HMAC, SHA256, RSA…).

 

Ví dụ:


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

Sau khi mã hóa Base64URL:


 
eyJhbGciOiJIUzI1NiJ9
 

2. Payload

 

Payload chứa các claim, tức là thông tin mà token truyền tải. Thông thường, JWT chỉ chứa một lượng nhỏ dữ liệu (dưới 10 claim) để giữ token ngắn gọn.

 

Ba loại claim chính gồm:

 

  • Registered claim – Các trường tiêu chuẩn (như iat, exp, nbf) giúp xác định thời gian phát hành, hết hạn hoặc thời điểm hiệu lực của token.

 

  • Public claim – Các claim được cộng đồng công nhận và sử dụng chung.

 

  • Private claim – Các claim tự định nghĩa, dùng riêng cho hệ thống.

 

Ví dụ:


 
{"name": "Joe Coder"}
 

Mã hóa Base64URL:


 
eyJuYW1lIjoiSm9lIENvZGVyIn0
 

3. Signature

 

Signature được tạo ra bằng cách kết hợp header, payload và một chuỗi bí mật (secret), sau đó mã hóa theo thuật toán đã chọn.

 

Mục đích của signature là đảm bảo token không bị chỉnh sửa trong quá trình truyền tải.

Ví dụ:


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

Kết quả:


 
5dlp7GmziL2QS06sZgK4mtaqv0_xX4oFUuTDh1zHK4U
 

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

 

  1. Người dùng đăng nhập: Client gửi thông tin xác thực (username, password) đến server.

  2. Server tạo JWT: Nếu thông tin hợp lệ, server tạo JWT chứa dữ liệu người dùng và gửi về client.

  3. Client lưu JWT: Token được lưu trong localStorage hoặc sessionStorage.

  4. Gửi yêu cầu: Mỗi khi gửi request, client thêm JWT vào header:

    
    		
     
    Authorization: Bearer <token>
     
  5. Server xác thực: Server kiểm tra chữ ký JWT để xác nhận tính hợp lệ và cấp quyền truy cập tài nguyên.

 

JWT không cần lưu trạng thái phiên trên server, giúp giảm tải cho hệ thống và tăng tốc độ xử lý.

 

JWT, JSON, Token

 

Lý do nên sử dụng JWT

 

  • Bảo mật cao: Dữ liệu trong JWT được ký bằng khóa bí mật hoặc cặp private/public key.

 

  • Đảm bảo toàn vẹn: Chữ ký giúp phát hiện mọi thay đổi trái phép với token.

 

  • Linh hoạt: Hỗ trợ nhiều thuật toán mã hóa khác nhau (HMAC, RSA, ECDSA…).

 

  • Stateless: Không cần lưu phiên đăng nhập trên server.

 

  • Phù hợp với hệ thống phân tán: Dễ dàng tích hợp trong kiến trúc microservices hoặc API gateway.

 

JWT, JSON, Token

 

Khi nào nên sử dụng JWT

 

1. Xác thực (Authentication)

 

Sau khi đăng nhập thành công, server tạo JWT và gửi về client. JWT sẽ được sử dụng trong các request kế tiếp để truy cập tài nguyên cần xác thực.

 

2. Uỷ quyền (Authorization)

 

JWT có thể chứa thông tin về quyền hạn người dùng. Khi client gửi request, server chỉ cần xác minh token để quyết định có cho phép truy cập hay không.

 

JWT, JSON, Token

 

3. Trao đổi dữ liệu (Data Exchange)

 

JWT có thể dùng để truyền dữ liệu giữa các hệ thống khác nhau một cách an toàn. Người nhận có thể kiểm tra chữ ký để xác thực tính hợp lệ của dữ liệu.

 HỖ TRỢ TRỰC TUYẾN