Xin chào các bạn, thông qua bài viết hướng dẫn kết hợp JWT và RSA cùng nhau thì hôm nay mình sẽ giới thiệu lại JWT cho những bạn mới nhe.
JWT (JSON Web Token) là một tiêu chuẩn mã nguồn mở (RFC 7519) dùng để truyền tải thông tin an toàn, gọn nhẹ và khép kín giữa các bên tham gia dưới dạng JSON.
Vậy cụ thể hơn nó là gì? có hình dáng ra sao? sử dụng như thế nào? thì chúng ta sẽ tiếp tục tìm hiểu nha.
Lịch sử ra đời
Ngày xưa, khi các website còn đang phổ biến, họ sử dụng cơ chế Session – Cookie để tạo/quản lý phiên hoạt động giữa người dùng và trình duyệt. Khi người dùng đăng nhập thành công, Session sẽ được tạo và lưu tại server, đồng thời server trả về session-id để lưu lại tại trình duyệt ở Cookie. Miễn là Session và Cookie còn thời hạn, thì mọi request ở trình duyệt luôn được đính kèm Cookie để xác minh người dùng và trao đổi các thông tin cần thiết. Mọi thứ lúc đó hoạt động rất là tuyệt vời.
Vậy điều gì đã làm JWT xuất hiện và được dùng nhiều hơn Session? Câu trả lời đơn giản là nằm ở việc “Mở rộng nền tảng và hệ thống”.
Khi ở trình duyệt, chúng ta có thể dùng Cookie để trao đổi thông tin nhưng khi ở app mobile thì chuyện gì xảy ra? hoặc là các máy chủ khác cùng giao tiếp thì làm sao có thể dùng session lẫn nhau được?
Vậy nên JWT ra đời và được sử dụng khá phổ biến trong các project ngày nay. Vậy JWT thì có gì thú vị?
Cấu trúc JWT
JWT là một chuỗi ký tự, có 3 phần, được mã hoá và từng chuỗi được nối với nhau bởi dấu chấm.
Header.Payload.Signature
Ví dụ chuỗi JWT như sau:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
- Header
Trong header gồm có 2 thông tin cơ bản, đầu tiên là thuật toán được sử dụng, trong ví dụ là HS256, thứ 2 là loại mã token, trong ví dụ là JWT.
Phần header này sẽ được dùng để xác định tính toán dữ liệu như thế nào, ký token ra làm sao.
{
"alg": "HS256",
"typ": "JWT"
}
JSON- Payload
Trong payload sẽ chứa chuỗi json bao gồm các thông tin cơ bản dùng để xác định người dùng, quyền hạn truy cập và 1 số thông tin mở rộng khác.
Xin lưu ý rằng đối với các token đã ký, thông tin được bảo vệ chống giả mạo nhưng mọi người đều có thể đọc được (vì dữ liệu payload chỉ có mã hoá base64). Không được đưa các thông tin bảo mật, nhạy cảm vào payload hoặc header của JWT trừ khi được mã hóa hoặc thật sự cần thiết.
{
"user_id": 123,
"username": "phatnef",
"admin": true,
"iat": 1516239022
}
JSONNgoài ra, có một số thông tin được xác định trước gọi là Registered Claims, viết tắt thành 3 ký tự.
iss
(issuer): Tổ chức, đơn vị cung cấp, phát hành JWT.iat
(issued at): Thời gian tạo của JWT, là thời gian unix có đơn vị là giây.exp
(expiration time): Thời hạn của JWT, vượt quá thời gian này, JWT được coi là không hợp lệ.
- Signature
Để tạo signature bạn phải lấy header được mã hóa base64, payload được mã hóa base64, một secret (mật khẩu), thuật toán được chỉ định trong header và sign. Ví dụ bạn dùng thuật toán HMAC SHA256 (HS256), signature (chữ ký) sẽ được tạo như sau:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
mậtkhẩu
)
PlaintextSignature được sử dụng từ phía server để xác minh nội dung không bị thay đổi do đường truyền hoặc có kẻ tấn công đang cố thay đổi dữ liệu.
Các bạn cũng có thể tự tạo nhanh một mã JWT bằng công cụ online ở đây:

JWT hoạt động ra sao
Khi người dùng xác thực thành công, Server sẽ ký một mã JWT sau đó gửi về cho phía client lưu trữ, những request tiếp theo từ client gửi lên thì phải đính kèm mã JWT này (thông thường là ở header), server sẽ xác thực JWT và gửi lại response thành công/thất bại về cho client.
Authorization: Bearer <token JWT>
PlaintextKhông như Session, thay vì lưu session-id tại Cookie của trình duyệt, thì chúng ta sẽ lưu chuỗi JWT tại Cookie hoặc localStorage tuỳ ý bạn. Đối với app mobile, IOS app thì sẽ dùng Keychain và Android app sẽ lưu vào SharedPreferences.

Ưu điểm của JWT
- Gọn nhẹ: JWT nhỏ gọn, chi phí truyền tải thấp giúp tăng hiệu suất của các ứng dụng. Server không cần lưu trữ JWT.
- Bảo mật: JWT sử dụng các mật mã hoá để tiến hành xác thực người danh tính người dùng. Ngoài ra, cấu trúc của JWT cho phép chống giả mạo nên thông tin được đảm bảo an toan trong quá trình trao đổi.
- Phổ thông: JWT được sử dụng dựa trên JSON – là một dạng cấu trúc dữ liệu phổ biến, có thể sử dụng ở hầu hết các ngôn ngữ lập trình. Ngoài ra, triển khai JWT tương đối dễ dàng và tích hợp được với nhiều thiết bị, vì JWT đã khá phổ biến.
Khuyết điểm của JWT
- Kích thước: Mặc dù trong tài liệu không ghi cụ thể giới hạn, nhưng do được truyền trên HTTP Header, vì thế JWT có giới hạn tương đương với HTTP Header (khoảng 8KB).
- Rủi ro bảo mật: Khi sử dụng JWT không đúng cách, ví dụ như không kiểm tra tính hợp lệ của signature, không kiểm tra thời gian hết hạn, kẻ tấn công có thể lợi dụng sơ hở để truy cập vào các thông tin trái phép.
Ngoài ra, việc để thời gian hết hạn của JWT quá dài cũng có thể tạo ra kẽ hở tương tự.
Một số ứng dụng JWT
- Single Sign-On (SSO): JWT có thể được sử dụng để cung cấp single sign-on cho người dùng. Điều này cho phép họ đăng nhập vào nhiều ứng dụng chỉ với một tài khoản duy nhất.
- API Authorization: JWT thường được sử dụng để phân quyền cho người dùng đến những tài nguyên cụ thể, từ những claims chứa trong JWT đó.
- User Authentication: JWT cung cấp khả năng xác thực người dùng và cấp quyền cho họ truy cập vào các tài nguyên mong muốn trong hệ thống.
- Microservices Communication: JWT còn có thể sử dụng cho việc giao tiếp giữa các service nhỏ trong hệ thống microservices.
Kết luận
JWT thường được sử dụng trong các hệ thống xác thực và ủy quyền, đặc biệt là trong các ứng dụng web và dịch vụ API, nhờ vào tính gọn nhẹ và khả năng tích hợp dễ dàng với các hệ thống khác nhau. Tuy nhiên, việc triển khai JWT cũng cần được thực hiện cẩn thận để tránh các lỗ hổng bảo mật, đảm bảo rằng mã hóa và ký số được thực hiện đúng cách, các token được quản lý hiệu quả.