October 19, 2021
jwt

Tìm hiểu JSON Web Token (JWT)

Nếu bạn chưa biết JSON Web Token là gì, vậy lúc này chắc bạn đang tự hỏi:

1. 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à khép kín để truyền thông tin an toàn giữa các bên dưới dạng đối tượng JSON. Thông tin này có thể được xác minh và đáng tin cậy vì nó được ký điện tử. JWT có thể được ký bằng cách sử dụng bí mật (với thuật toán HMAC) hoặc cặp khóa public/private bằng RSA hoặc ECDSA.

2. Cấu trúc của một JWT trông như thế nào?

Mỗi một JWT gồm có 3 phần là Header, Payload, Signature. Chúng được ngăn cách bởi dấu . (dot)
Ví dụ về JWT sẽ có dạng như sau:

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJkaW5ocGgiLCJpYXQiOjE2MDkzODY3NjEsImV4cCI6MTYwOTQ3MzE2Mn0._yPpOiI70UZ6lbHK5hlaJzBDIoew

Header

Header là đoạn đầu tiên, nó bao gồm 2 thành phần chính là:

  • alg: Thuật toán sử dụng để mã hoá, như là HMAC SHA256 hoặc RSA.
  • typ: Loại token, mặt định là JWT.

VD:

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

Payload

Phần thứ hai của JWT là payload, nó chứa các thông tin. Các thông tin này là các entity (thường là user) và dữ liệu bổ sung. Có ba loại thông tin: registered, public, and private.

Registered

Đây là một tập hợp các thông tin được xác định trước, không bắt buộc nhưng được khuyến nghị, để cung cấp một tập hợp các xác nhận quyền sở hữu hữu ích, có thể tương tác. Một số trong số đó là: Iss (nhà phát hành), exp (thời gian hết hạn), sub (chủ đề), aud (khán giả) và những thứ khác.

Public

Public claims có thể được xác định theo ý muốn bởi những người sử dụng JWT. Nhưng để tránh ảnh hưởng, trùng lặp chúng nên được xác định trong IANA JSON Web Token Registry hoặc được định nghĩa là một URI có chứa namespace không bị trùng lặp.

Private

Đây là thông tin tự định nghĩ, được tạo ra để chia sẽ thông tin giữa các bên đồng ý sử dụng chúng.

{
        "sub": "1234567890",
        "name": "John Doe",
        "admin": true
}

Signature

Để tạo phần chữ ký, chúng ta cần có Header, Payload đã được mã hoá và 1 chuổi secret.

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

3. Nên sử dụng JWT trong trường hợp nào?

Authorization: Đây là tình huống phổ biến nhất để sử dụng JWT. Khi người dùng đã đăng nhập, mỗi request tiếp theo sẽ bao gồm JWT, cho phép người dùng truy cập các tài nguyên được phép với JWT đó. Single Sign On là một tính năng được JWT sử dụng rộng rãi hiện nay, vì chi phí nhỏ và khả năng dễ dàng sử dụng trên các miền khác nhau.

Information Exchange: JWT là một cách tốt để truyền thông tin giữa các bên một cách an toàn. Bởi vì JWT có thể được ký – ví dụ: sử dụng cặp khóa public/private – bạn có thể chắc chắn rằng đúng người đúng việc. Ngoài ra, vì chữ ký được tính bằng cách sử dụng Header và Payload, bạn cũng có thể xác minh rằng nội dung không bị giả mạo.

4. JSON Web Tokens hoạt động như thế nào?

Trong xác thực, khi người dùng đăng nhập thành công bằng thông tin đăng nhập của họ, JWT sẽ được trả lại. Vì Token là thông tin xác thực nên phải hết sức cẩn thận để ngăn chặn các vấn đề bảo mật. Nói chung, bạn không nên giữ các mã thông báo lâu hơn yêu cầu.

Bất cứ khi nào người dùng muốn truy cập vào một tài nguyên được bảo vệ, user agent phải gửi JWT, thường là trong Header Authorization bằng cách sử dụng schema Bearer. Nội dung của tiêu đề sẽ giống như sau:

Authorization: Bearer <token>

Nếu Token gửi trong tiêu đề Authorization header, Cross-Origin Resource Sharing (CORS) sẽ không phải là vấn đề vì nó không sử dụng cookie.

Sơ đồ sau đây cho thấy cách JWT được lấy và sử dụng để truy cập các API hoặc tài nguyên:

  1. App hoặc client gửi yêu cầu ủy quyền đến server.
  2. Khi authorization được cấp, server trả về một token truy cập cho App.
  3. App sử dụng token truy cập để truy cập tài nguyên được bảo vệ (như API).

Tài liệu tham khảo: JWT

Leave a Reply

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