Khái niệm
JSON Web Token (JWT) là 1 tiêu chuẩn mở (RFC 7519) định nghĩa cách thức truyền tin an toàn giữa bên bằng 1 đố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 dùng một secret (sử dụng thuật toán HMAC) hoặc cặp khóa public/private bằng thuật toán RSA hoặc ECDSA
JWT nên được sử dụng trong trường hợp nào?
Một ứng dụng phổ biến nhất của JWT đó là authorization:
Sau khi user login phía client sẽ nhận response bao gồm jwt, ở mỗi request sau đó sẽ gửi kèm JWT. server sẽ xác minh token đó và user có thể truy cập resouce, routes được phép với token đó.
Trao đổi thông tin
JWT có thể được sử dụng để trao đổi thông tin giữa các bên một cách an toàn. Bởi vì jwt có thể được ký bằng cách sử dụng cặp private/public key - bạn có thể chắc chắn rằng người gửi là ai và họ nói điều gì. Ngoài ra, vì jwt xác minh bằng header, payload nên bạn có thể xác minh thông tin không bị giả mạo.
Cấu trúc của JWT
JSON Web Tokens bao gồm 3 phần được phân tách bằng dấu chấm (.) đó là:
- Header
- Payload
- Signature
=> JWT có cấu trúc như sau: xxxxx.yyyyyy.zzzzzz
Header
Header thường bao gồm hai phần: loại token, là JWT và thuật toán ký đang được sử dụng, chẳng hạn như HMAC SHA256 hoặc RSA. Ví dụ:
{
"alg": "HS256",
"typ": "JWT"
}
Phần thứ 2 của token là payload, nó chứa các the claims. Claims thường chứa các thông tin entity (thông tin user) và các dữ liệu bổ sung. Có 3 loại claims: registered, public, và private claims.
- Registered claims: Đây là một tập hợp các claims được xác định trước không bắt buộc nhưng được khuyến nghị. Ví dụ: iss (issuer), exp (expiration time), sub (subject), aud (audience)...
- Public claims: Được định nghĩa bởi người dùng. Nhưng để tránh xung đột, chúng phải được xác định trong IANA JSON Web Token Registry hoặc được định nghĩa là URI chứa namespace chống xung đột.
- Private claims: Đây là các custom clams được tạo để trao đổi thông tin giữa các bên và thỏa thuận sử dụng chúng
Làm sao để lưu trữ JWT an toàn.
Như đã giới thiệu ở trên một ứng dụng phổ biến nhất của JWT là ủy quyền(authorization) và để có thể làm được việc này cần lưu lại jwt. Vậy jwt cần lưu ở đâu cho an toàn. Nếu lưu trữ nó bên trong localStorage, nó có thể truy cập bằng bất kỳ script nào trong trang của bạn (một cuộc tấn công XSS có thể cho phép kẻ tấn công bên ngoài lấy được token). JWT cần được lưu trữ bên trong cookie httpOnly, một loại cookie đặc biệt chỉ được gửi trong các yêu cầu HTTP đến máy chủ và không bao giờ có thể truy cập được (cả để đọc hoặc ghi) từ JavaScript đang chạy trong trình duyệt.
TÀI LIỆU THAM KHẢO
https://jwt.io/introduction https://blog.logrocket.com/jwt-authentication-best-practices/