0
0
Lập trình
Admin Team
Admin Teamtechmely

Tìm Hiểu Về JWT: Khái Niệm, Cấu Trúc và Ứng Dụng Phổ Biến

Đăng vào 2 tuần trước

• 5 phút đọc

JWT là gì?

JWT (JSON Web Token) là một phương thức an toàn và hiệu quả để truyền tải thông tin giữa các bên dưới dạng đối tượng JSON. Thông tin trong JWT có thể được xác minh và đảm bảo tính tin cậy nhờ vào việc được ký điện tử, giúp ngăn chặn sự thay đổi hoặc chỉnh sửa trong quá trình truyền tải. Có hai phương pháp chính để ký JWT: bằng một secret sử dụng thuật toán HMAC hoặc bằng một cặp khóa công khai/riêng tư khi áp dụng RSA hoặc ECDSA. JWT thường được sử dụng trong xác thực và ủy quyền cho các ứng dụng web.

Ứng dụng của JWT

Một số trường hợp sử dụng JWT:

  • Xác thực và ủy quyền: Đây là cách sử dụng phổ biến nhất của JWT. Sau khi người dùng đăng nhập thành công, bất kỳ yêu cầu nào tiếp theo sẽ gửi kèm JWT, cho phép người dùng truy cập vào các endpoint, dịch vụ và tài nguyên mà JWT cấp quyền. Tính năng Single Sign On sử dụng JWT ngày càng trở nên phổ biến nhờ vào chi phí hoạt động thấp và khả năng dễ dàng truy cập qua nhiều miền khác nhau.
  • Trao đổi thông tin: JWT là một phương thức an toàn để truyền thông tin giữa các bên. Một JWT được ký sẽ đảm bảo rằng người gửi gửi thông tin đúng cho người nhận, đồng thời bảo đảm rằng thông tin không bị thay đổi hay giả mạo.

JWT cũng thường được áp dụng trong các tiêu chuẩn như OAuth2 và OpenID Connect.

Cấu trúc của JWT

Trước khi tìm hiểu chi tiết về cấu trúc của JWT, chúng ta cần hiểu về JSON. JSON là định dạng trao đổi dữ liệu nhẹ nhàng, dễ đọc cho con người và cũng đơn giản cho máy móc phân tích. Chính JSON là nơi lưu trữ dữ liệu (payload) trong JWT.

JWT có cấu trúc gồm 3 phần: Header, Payload, và Signature. Mỗi phần này sẽ được mã hóa bằng base64 và cách nhau bằng dấu chấm (.), vì vậy JWT có dạng chung như sau: xxxxx.yyyyy.zzzzz.

Header chứa thông tin gồm 2 phần chính: loại token là JWT và thuật toán ký mà đang được sử dụng để mã hóa, chẳng hạn như HMAC SHA256 hoặc RSA.

Ví dụ về Header của JWT:

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

Payload

Payload của JWT chứa các claims — các tuyên bố về một thực thể, thường là người dùng, cùng với các dữ liệu bổ sung khác. Có 3 loại claims:

  • Registered claims: Đây là một tập hợp các claims đã được định nghĩa sẵn, không bắt buộc nhưng được khuyến khích để cung cấp các thông tin hữu ích như: iss (issuers), exp (expiration time), sub (subject), aud (audience),...
  • Public claims: Những claims này có thể được định nghĩa theo ý muốn của người sử dụng. Tuy nhiên, để tránh xung đột, chúng phải được xác định trong IANA JSON Web Token Registry hoặc được xác định bằng một URI với namespace.
  • Private claims: Đây là các claims tùy chỉnh theo ý muốn, được sử dụng để chia sẻ thông tin giữa các bên đã đồng ý với nhau, không nằm trong các claims đã đăng ký hoặc công khai.

Ví dụ về Payload của JWT:

Copy
{
  "sub": "1234567890",
  "name": "Simon",
  "admin": true
}

Mặc dù payload được mã hóa bằng JSON Web Encryption (JWE), nhưng phần lớn các triển khai JWT chỉ ký để bảo vệ tính toàn vẹn thông tin, nên không nên lưu trữ thông tin nhạy cảm trừ khi chúng đã được mã hóa.

Signature

Chữ ký trong JWT giống như việc niêm phong một phong bì để đảm bảo rằng nó không bị thay đổi hay giả mạo. Để tạo ra chữ ký (signature), bạn cần các thông tin sau: header đã mã hóa, payload đã mã hóa, secret và thuật toán được sử dụng. Có hai loại thuật toán ký chính:

  • Symmetric algorithms (thuật toán đối xứng) như HMAC SHA256 sử dụng một khóa bí mật chung để ký và xác minh.
  • Asymmetric algorithms (thuật toán bất đối xứng) như RSA, sử dụng cặp khóa công khai/riêng tư, trong đó khóa riêng được dùng để ký và khóa công khai được dùng để xác minh.

Ví dụ khi sử dụng HMAC SHA256:

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

Chữ ký này giúp xác minh rằng dữ liệu đã gửi không bị thay đổi trong quá trình truyền tải và trong trường hợp sử dụng khóa riêng, có thể xác định rằng người gửi JWT chính là người được xác nhận.

Khi kết hợp cả ba phần là header, payload và signature, bạn sẽ có một JWT như sau:

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

Dưới đây là luồng hoạt động chung của JWT:

Khi người dùng gửi thông tin đăng nhập, máy chủ sẽ xác thực thông tin đó. Khi xác thực thành công, server tạo ra một JWT đã được ký với thông tin chi tiết người dùng và gửi lại cho client. Client nhận token và lưu trữ để sử dụng cho các yêu cầu tiếp theo. Khi đã có token, client sẽ thêm header vào các yêu cầu sau này là Authorization: Bearer <token/JWT> và gửi đến các tài nguyên đã cấp quyền trên máy chủ. Ngược lại, máy chủ sẽ xác minh chữ ký và trả dữ liệu yêu cầu cho client.

Một số lưu ý khi sử dụng JWT

Dưới đây là một số điểm cần lưu ý khi sử dụng JWT:

  • Payload trong JWT không được mã hóa mặc định, do đó, không nên chứa các thông tin nhạy cảm nếu chưa được mã hóa.
  • Nếu sử dụng các thuật toán mã hóa yếu, tin tặc có thể dễ dàng sử dụng phương pháp brute force để lấy chữ ký của token.
  • Để giảm thiểu rủi ro khi sử dụng JWT, có một số điều tốt mà bạn có thể thực hiện: chỉ lưu trữ các thông tin/claims cần thiết của người dùng, giữ thời gian hết hạn của token càng ngắn càng tốt, bảo đảm lưu trữ token một cách an toàn, và sử dụng các thuật toán mã hóa mạnh.

Kết luận

Thông qua bài viết này, tôi đã giới thiệu về JWT và cách nó hoạt động. Dù kiến thức về JWT đã có từ một thời gian dài, hi vọng rằng bài viết này sẽ giúp bạn ôn lại những kiến thức cơ bản hoặc làm rõ hơn về JWT khi sử dụng. Cảm ơn bạn đã theo dõi bài viết này và hẹn gặp lại trong những bài viết tiếp theo ❤️.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào