Giới thiệu về JWT
JSON Web Token (JWT) là một tiêu chuẩn mở được định nghĩa tại RFC 7519 cho việc truyền thông tin một cách an toàn giữa các bên như là một JSON object.
JWT thường được sử dụng để signed token. Signed token dùng để verify tính toàn vẹn của thông tin trong nó, được ký bằng cặp public/private keys, chữ ký đó dùng để như một certifies, chỉ có người giữa private key mới có thể ký trên đó.
Khi nào nên sử dụng JWT
- Authorization: Đây là trường hợp phổ biến nhất được sử dụng JWT. Khi users login, những request tiếp theo sẽ include JWT để cho phép users truy cập resource tương ứng với token đó.
- Information Exchange: JWT là cánh tốt để trao đổi thông tin một cách đảm bảo giữa các bên. Vì JWT có thể ký => bạn có thể chắc chắn người gửi là nguòi đã ký chúng bằng cặp public/private keys. Bạn cũng có thể dựa vào phần header và payload để verify nội dụng không bị thay đổi.
Cấu trúc của JWT
JWT có 3 phần, được tách biệt bới dấu chấm .
- Header
- Payload
- Signature
Một JWT sẽ trông như thế này xxxxxx.yyyyy.zzzz
Header:
Head thường có 2 phần: loại của token (JWT) và thuật toán dùng để ký ví dụ
{
"alg": "SHA256",
"typ": "JWT"
}
Header sau đó được encode bằng công cụ Base64Url
.
Payload
Phần payload thường chứa claims, claims là những thông tin về thự thể ( ví dụ như thông in user) và những thông tin thêm. Một số claims nên có những không bắt buộc như, iss (issuer), exp (expiration time), sub (subject)
Ví dụ
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Payload sau đó được encode bằng công cụ Base64Url
.
Signature
Nếu bạn sử dụng thuật toán HMAC SHA256, chữ ký sẽ được tạo bằng cách
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
Chữ ký này được sử dụng để verify rằng message không bị thay đổi trên đường truyền.
How JWT work
Có một công cụ bạn có thể play với JWT là: https://jwt.io/#debugger-io
Trong bài toán xác thực, khi user đăng nhập thành công, hệ thống sẽ gửi một JWT. JWT này cần phải được bảo mật để tránh security issue. Sau khi JWT hết hạn, bạn nên xoá đi.
Mỗi khi user muốn truy cập vào một protected route, user agent gửi kèm JWT, thường là sử dụng Bearer schema
Authorization: Bearer <token>
Sau đó, server sẽ verify lại token này and allowed user access nếu token hợp lệ.
Lưu ý:
Nếu hacker có thể lấy được token của bạn trước khi token hết hạn, hacker có thể mạo danh bạn truy cập vào protected route. Một số cách để tránh việc này xảy ra:
- Set exp time cho JWT trong thời gian ngắn
- Sử dụng giao thức HTTPS đễ mã hoá thông tin