JSON Web Tokens (JWTs) Và Ứng Dụng

3 min read

JWT là gì?

JSON web token (JWT) là một tiêu chuẩn mở (RFC 7519) cho phép truyền tải thông tin một cách an toàn, gọn nhẹ giữa các bên dưới dạng một đối tượng JSON.

Vì kích thước tương đối nhỏ, một JWT có thể được gửi qua URL, thông qua một tham số POST, hoặc bên trong một tiêu đề HTTP, và nó được truyền tải nhanh chóng. Một JWT chứa tất cả các thông tin cần thiết về một thực thể để tránh phải truy vấn cơ sở dữ liệu nhiều lần.

Cấu trúc của một JWT token

JWTs được mã hóa base64Url, tạo ra một chuỗi như sau: Header.Payload.Signature

  • Header: Chứa loại token (JWT) và thuật toán ký (ví dụ: HMAC SHA256). Được base64encode
// Raw json
{
  "alg": "HS256",
  "typ": "JWT"
}
// base64endcode
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
  • Payload: Chứa các dữ liệu về một thực thể (thường là người dùng) và các dữ liệu bổ sung.
// Raw json
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
// base64encode
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
  • Signature: Đảm bảo rằng token không bị thay đổi. Nó được tạo bằng cách ký phần header và payload đã được base64 với một bí mật hoặc khóa riêng.
// base64encode
base64UrlEncode(header) + "." +  base64UrlEncode(payload)
// sign with encryption algorithm 
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  your-256-bit-secret
)

Lợi Ích khi sử dụng JWTs

  • Xác Thực Không Trạng Thái: JWTs chứa tất cả thông tin cần thiết, loại bỏ nhu cầu lưu trữ phía máy chủ.
  • Khả Năng Mở Rộng: Lý tưởng cho các hệ thống phân tán, vì các token có thể được xác minh độc lập bởi mỗi dịch vụ.
  • Bảo Mật: JWTs được ký, đảm bảo tính toàn vẹn và tin cậy của dữ liệu.

Một số use case sử dụng JWTs

API Authorization/Authorization

Trong một ứng dụng web hoặc di động, sau khi người dùng đăng nhập thành công, máy chủ tạo ra một JWT token. Sau đó, token này được gửi đến máy khách, nơi nó được lưu trữ (thường là trong localStorage hoặc cookie). Máy khách sẽ thêm token này vào các yêu cầu HTTP sau đó tới các API được bảo vệ.

Microservices Architecture

Trong kiến trúc microservices, JWT được sử dụng để truyền tải và kiểm tra danh tính, quyền hạn người dùng qua các services khác nhau. Mỗi service có thể xác minh JWT để đảm bảo các yêu cầu được xác thực và được cho phép

Lưu ý: Trong mô hình này có thể dùng phương thức mã hóa bất đối xứng (Sử dụng private key + public key) thay thế cho phương thức mã hóa mặc định (chỉ sử dụng secret key). Khi dùng phương thức mã hóa bất đối xứng chỉ có Authorisation Service lưu trữ private key, các services khác chỉ lưu trữ public key dùng để xác thực người dùng

Secure Data Exchange

JWTs sử dụng mã hóa RSA để truyền tải thông tin một cách an toàn giữa các bên, đảm bảo tính toàn vẹn và xác thực dữ liệu.

Một số lưu ý khi dùng JWTs

Lưu Trữ Token An Toàn

LocalStorage: Dễ dàng truy cập qua JavaScript nhưng dễ bị tấn công XSS. Sử dụng kết hợp content policy để tránh XSS
Cookies: Sử dụng flag HttpOnly và Secure để giảm rủi ro XSS. Cookies HttpOnly không thể truy cập qua JavaScript, và cookies Secure chỉ được truyền qua HTTPS.

Sử Dụng HTTPS

Luôn sử dụng HTTPS để truyền JWTs. Điều này mã hóa token trong quá trình truyền, bảo vệ nó khỏi các cuộc tấn công man-in-the-middle (MITM). Truyền token qua HTTP có thể làm lộ chúng và bị tấn công.

Thời Gian Hiệu Lực Của Token

Đặt thời gian hết hạn ngắn cho các token truy cập để giới hạn cơ hội cho kẻ tấn công. Thông thường, token truy cập nên hết hạn sau vài phút đến vài giờ.

Thuật Toán Mã Hóa Mạnh

Sử dụng các thuật toán mạnh, đã được kiểm chứng để ký JWTs, chẳng hạn như HMAC SHA256 (HS256) hoặc RSA. Tránh các thuật toán yếu có thể dễ dàng bị tấn công.

Tránh Dữ Liệu Nhạy Cảm

Không bao gồm thông tin nhạy cảm trong payload của JWTs, vì chúng chỉ được mã hóa base64Url, không được mã hóa. Việc lộ mật khẩu người dùng hoặc số thẻ tín dụng trong token là một rủi ro bảo mật lớn.

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *