Trong thời đại công nghệ số, đặc biệt là trong phát triển các ứng dụng web và API, khái niệm Token đã trở thành một yếu tố bắt buộc. Hãy cùng tìm hiểu chi tiết Token có vai trò gì trong bảo mật và quản lý truy cập.

1. Token là gì?

Token là một chuỗi ký tự (thường là mã hóa) được sử dụng để đại diện cho quyền truy cập hoặc danh tính của một người dùng hoặc thiết bị trong một hệ thống. Token đóng vai trò như một "vé" xác thực để truy cập tài nguyên trên máy chủ hoặc dịch vụ. Trong hầu hết các trường hợp, Token được tạo ra sau khi người dùng đăng nhập thành công và được sử dụng để thay thế cho thông tin đăng nhập trong các yêu cầu tiếp theo.

Các đặc điểm chính của Token:

  • Tạm thời: Token có thời gian sống ngắn (để giảm nguy cơ bị tấn công).
  • Bảo mật: Thường được mã hóa hoặc ký số.
  • Không trạng thái (Stateless): Server không cần lưu trữ trạng thái session, mà dựa vào Token để xác thực.

Các loại token phổ biến bao gồm:

  • JWT (JSON Web Token): Một tiêu chuẩn mở để truyền thông tin an toàn giữa các bên dưới dạng JSON. JWT thường được sử dụng cho xác thực và quản lý phiên.
  • Access Token: Thường được sử dụng để xác thực người dùng và cấp quyền truy cập đến tài nguyên.
  • Refresh Token: Được sử dụng để làm mới hoặc tái cấp quyền truy cập khi token truy cập hết hạn.

Xác thực (Authentication) và Ủy quyền (Authorization):

  • Xác thực (Authentication): Quá trình xác định danh tính của người dùng. Điều này thường bao gồm việc sử dụng một loại token để chứng minh danh tính của họ.
  • Ủy quyền (Authorization): Quyết định xem người dùng được phép truy cập tài nguyên nào trong hệ thống dựa trên quyền hạn của họ.

2. Thành phần cơ bản của Token

  • Uid: danh tính duy nhất của người dùng.
  • Thời gian: dấu thời gian của thời gian hiện tại.
  • Ký hiệu: chữ ký, một vài chữ số đầu tiên của token được nén thành một chuỗi thập lục phân có độ dài nhất định bằng thuật toán Hashing hay còn gọi là băm.

3. Json Web Token (Jwt) là gì?

JSON Web Token (JWT) là một tiêu chuẩn mở (RFC 7519) định nghĩa một cách nhỏ gọn và độc lập để truyền tải thông tin một cách an toàn giữa các bên dưới dạng một đối tượng JSON. Thông tin này có thể được xác minh và tin cậy vì nó được ký điện tử. JWT có thể được ký bằng một bí mật (sử dụng thuật toán HMAC) hoặc một cặp khóa công khai/riêng tư sử dụng RSA hoặc ECDSA.

Mặc dù JWT có thể được mã hóa để đảm bảo tính bảo mật giữa các bên, chúng ta sẽ tập trung vào các token đã được ký. Các token đã ký có thể xác minh tính toàn vẹn của các tuyên bố chứa trong đó, trong khi các token được mã hóa sẽ ẩn các tuyên bố này khỏi các bên khác. Khi các token được ký bằng cặp khóa công khai/riêng tư, chữ ký cũng xác nhận rằng chỉ có bên nắm giữ khóa riêng tư mới là bên đã thực hiện ký.

JWT có 2 đặc điểm:

  • Gọn nhẹ (compact): JWT có thể được truyền đi thông qua URL, hoặc qua giao thức POST, hay gán vào bên trong phần HTTP Header. Kích thước nhỏ hơn ứng với công việc truyền tải sẽ nhanh hơn. Dưới đây là cách thức truyền token vào trong HTTP Header sử dụng Bearer Schema:Authorization: Bearer <token>
  • Tự đóng gói (self-contained): Payload của JWT đã chứa các thông tin cần thiết về user (thay vì phải truy vấn cơ sở dữ liệu nhiều lần).

Đây là một số trường hợp nên dùng JSON Web Token (JWT):

  • Uỷ quyền (Authorization): đây là trường hợp phổ biến nhất khi dùng JWT. Sau khi người dùng đăng nhập, mỗi yêu cầu tiếp theo sẽ đính kèm JWT, cho phép người dùng truy cập các tuyến, dịch vụ, và tài nguyên được phép với token đó. Single Sign-On (SSO) hiện nay sử dụng rộng rãi JWT nhờ vào kích thước nhỏ gọn và khả năng dễ dàng sử dụng trên nhiều miền khác nhau.
  • Trao đổi thông tin (Information Exchange): JWT là 1 cách thức không tồi để truyền tin an toàn giữa các thành viên với nhau, nhờ vào phần “chữ ký” của nó. Phía người nhận có thể biết được người gửi là ai thông qua phần chữ ký. Ngoài ra, chữ ký được tạo ra bằng việc kết hợp cả phần header, payload lại nên thông qua đó ta có thể xác nhận được chữ ký có bị giả mạo hay không.

4. Các thành phần của JSON Web Token (JWT)

JWT bao gồm 3 phần, ngăn cách bởi dấu "." :

hình ảnh_2025-01-15_072429097.png
Header thường bao gồm hai phần: loại token (JWT) và thuật toán ký được sử dụng, chẳng hạn như HMAC SHA256 hoặc RSA.

Ví dụ:

hình ảnh_2025-01-15_073714257.png

Sau đó, JSON này được mã hóa Base64Url để tạo thành phần đầu tiên của JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Payload chứa các claim. Claim là các tuyên bố về một thực thể (thường là người dùng) và các dữ liệu bổ sung. Có ba loại claim:

Claim đã đăng ký (Registered claims): Những claim này không bắt buộc nhưng được khuyến khích:

  • iss (issuer): tổ chức phát hành token.
  • sub (subject): chủ đề của token.
  • aud (audience): đối tượng sử dụng token.
  • exp (expired time): thời điểm token sẽ hết hạn.
  • nbf (not before time): token sẽ chưa hợp lệ trước thời điểm này.
  • iat (issued at): thời điểm token được phát hành, tính theo UNIX time.
  • jti: JWT ID.

Claim công khai (Public claims): Do người dùng tự định nghĩa nhưng cần tránh trùng lặp bằng cách đăng ký trong IANA JSON Web Token Registry.

{
"https://abcd.com/jwt_clams/user_role" : "admin"
}
Claim riêng tư (Private claims): Các claim do các bên thỏa thuận sử dụng, không phải claim đăng ký hay công khai.
{
"email":"abcd@gmail.com",
"name":"John Doe"
}
Ví dụ: hình ảnh_2025-01-15_073740304.png

Payload sau đó được mã hóa Base64Url để tạo thành phần thứ hai của JWT eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

Signature là phần chữ ký được tạo bằng cách:

Mã hóa header và payload

Sử dụng thuật toán ký (như HMAC SHA256) cùng với một khóa bí mật.

Ví dụ:

hình ảnh_2025-01-15_073811107.png

Kết quả SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Chữ ký đảm bảo rằng thông điệp không bị sửa đổi và xác thực người gửi.

5. Cách hoạt động của JSON Web Token

hình ảnh_2025-01-15_075531904.png
Authenticate (Xác thực):
  • Ứng dụng tiêu thụ API (API Consumer Application) gửi thông tin đăng nhập (ví dụ: username và password) hoặc các thông tin xác thực khác tới Auth0 Authorization Server để yêu cầu xác thực.
JWT (Cấp JWT):
  • Sau khi xác thực thành công, Auth0 Authorization Server tạo một JSON Web Token (JWT) và trả về cho ứng dụng người dùng API. JWT chứa thông tin người dùng (claims) và được ký bằng khóa bí mật để đảm -bảo tính toàn vẹn.
Request with JWT (Gửi yêu cầu với JWT):
  • Ứng dụng người dùng API sử dụng JWT nhận được để gửi yêu cầu tới API (Resource Server). JWT thường được đính kèm trong tiêu đề (header) của HTTP request, thường token được gửi trong header: Authorization: Bearer <token>.
Validate JWT (Xác thực JWT):

API (Resource Server) nhận yêu cầu và kiểm tra JWT. Quá trình này bao gồm:

  • Kiểm tra chữ ký số (signature) của JWT để đảm bảo JWT không bị thay đổi.
  • Kiểm tra tính hợp lệ của JWT (ví dụ: ngày hết hạn, scope, hoặc quyền hạn).
Response (Phản hồi):
  • Sau khi xác thực JWT thành công, API (Resource Server) xử lý yêu cầu và trả về phản hồi (response) cho ứng dụng người dùng API.

6. So sánh giữa JSON Web Token và Access Token của EzyPlatform

Bạn có thể tìm hiểu thêm về Access Token của EzyPlatform tại đây.

Đặc điểmJWT TokenEzyplatform
Cấu trúcGồm 3 phần: Header, Payload, SignatureGồm 2 phần: Header, Body
HeaderChứa metadata về thuật toán mã hóa, kiểu tokenChứa userId hoặc adminId, được mã hóa base64
Payload/Body Chứa thông tin định danh và các claim (dữ liệu người dùng)Chứa hash từ ID, UUID và thời gian hiện tại
Độ dàiPhụ thuộc vào nội dung payload và thuật toán mã hóa (thường vài trăm ký tự)Cố định 108 ký tự (44 ký tự header, 64 ký tự body)
Cách tạoHeader và Payload được mã hóa và ký bằng secret key, tạo chuỗi Base64 URLMã hóa userId/adminId trong header; Body là SHA-256 hash từ thông tin ID và timestamp
Tính minh bạchPayload không mã hóa (chỉ base64-encode), nên có thể đọc được nội dung Header được mã hóa, body chỉ lưu hash, không thể giải mã
Bảo mật Signature giúp xác minh token không bị chỉnh sửa; Payload có thể đọc được, cần hạn chế lưu thông tin nhạy cảm Header mã hóa khó bị đọc lén; Body sử dụng hash (SHA-256), không lưu thông tin nhạy cảm
Cách xác thực Kiểm tra signature bằng secret key; Kiểm tra thời hạn hoặc dữ liệu trong payload Giải mã header để lấy ID; Kiểm tra trong cơ sở dữ liệu và trạng thái token
Lưu trữ trạng tháiStateless (không cần lưu trữ trên server)Stateful (token phải được lưu trong cơ sở dữ liệu)

7. Tóm lại

JSON Web Token (JWT) là công cụ hiệu quả để xác thực và trao đổi thông tin trong các ứng dụng web và API. Với cấu trúc gọn nhẹ, tự đóng gói và đảm bảo an toàn thông qua chữ ký số, JWT giúp quản lý truy cập một cách hiệu quả, đặc biệt trong các hệ thống không trạng thái (stateless). JWT là lựa chọn phổ biến để uỷ quyền và truyền dữ liệu an toàn, phù hợp với yêu cầu bảo mật hiện đại.