Tăng độ bảo mật cho trang web, ứng dụng hay bất cứ một dịch vụ công nghệ thông tin nào cũng là ưu tiên hàng đầu của các nhà phát triển. Trong thời gian gần đây, JWT nổi lên như một hình thức bảo mật tốt – miễn phí ở mức “đỉnh của đỉnh” dành cho các nhà phát triển. Vậy, JWT là gì? Cấu tạo của JWT ra sao? Vì sao và khi nào nên sử dụng JWT?
Tìm hiểu về JWT
JWT là gì?
JWT là viết tắt của JSON Web Tokens – một tiêu chuẩn mở RFC 7519, được sử dụng như một phương tiện đại diện nhỏ gọn, để truyền đạt thông tin giữa server và client thông qua một chuỗi JSON.
Thông tin được truyền đi thông qua JWT sẽ được bảo mật và gia tăng độ tin tưởng nhờ vào chữ ký điện tử. Chữ ký điện tử sử dụng các khóa công khai/ riêng tư sử dụng RSA, ECDSA với thuật toán HMAC.
Nhà phát triển của JWT tuyên bố rằng, họ tập trung vào các signed token, các signed token này có thể xác minh tính toàn vẹn của quyền sở sở hữu của bản thân và bảo mật token khỏi các bên khác. Khi signed token sử dụng cặp khóa công khai/ riêng tư, đồng nghĩa với việc bên nắm giữ cả 2 khóa là bên đã đăng ký signed token.
Bạn có thể tham khảo thêm thông tin về JSON Web Tokens tại trang web chính thức: JWT.io.
3 thành phần của JWT
Một JWT tiêu chuẩn nhỏ gọn sẽ bao gồm 3 thành phần chính được phân tách với nhau bởi dấu chấm ( . ). Chúng là:
- Header
- Payload
- Signature
Một cách đơn giản, JWT sẽ có dạng như sau: xxxxx.yyyyy.zzzz.
Để hiểu hơn về JWT, chúng ta sẽ tìm hiểu chi tiết từng thành phần của JWT nhé!
Header của JWT
Header của JWT sẽ bao gồm 2 thành phần chính:
- Thuật toán mã hóa được sử dụng. Ví dụ như: HS256, HS384, HS512, PS256, PS384, PS512, RS256, RS384, RS512, ES256, ES256K, ES384, ES512 và EdDSA.
- Thành phần thứ 2 là JWT.
Ví dụ như sau:
{
"alg": "HS256",
"typ": "JWT"
}
Trong đó, bạn có thể thấy thuật toán mã hoá ở đây là HS256.
Payload của JWT
Payload là thành phần thứ 2 trong JWT chứa các thông tin về quyền sở hữu một thực thể và các dữ liệu bổ sung. Trong đó, có 3 loại bảo mật xác thực bao gồm: registered, public và private claims.
Ví dụ như:
Signature của JWT
Thành phần cuối cùng, cũng là 1 trong 3 thành phần quan trọng nhất của JWT: Signature – chữ ký. Để tạo được một chữ ký, bán sẽ cần phải mã hoá header, payload, mã khóa bí mật secret và thuật toán sử dụng để mã hóa header và chữ ký đó.
Ví dụ:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
Signature được sử dụng để xác minh rằng tin nhắn được gửi đến không bị thay đổi. Với trường hợp người dùng sử dụng dùng private key cho tokens signed, Signature cũng có thể xác nhận rằng người gửi là người tạo JWT.
Phối hợp tất cả lại với nhau, ta sẽ có:
Kết quả đầu ra sẽ là dạng chuỗi trên tiêu chuẩn Base64-URL có thể dễ dàng truyền đi qua HTML và môi trường HTTP so với tiêu chuẩn XML trên SAML.
Sau khi mã hoá, chúng ta sẽ có một chuỗi JWT như ở bên trái màn hình và bên phải sẽ là phần được giải mã.
JSON Web Tokens được dùng để làm gì?
Khi nào nên sử dụng JWT?
Trong thực tế, JWT có thể ứng dụng trong rất nhiều hoạt động khác nhau. Hai trường hợp điển hình có thể sử dụng JWT là:
- Uỷ quyền – Authorization
- Truyền đạt và bảo vệ toàn vẹn thông tin – Information Exchange
Uỷ quyền – Authorization
Đây là trường hợp điển hình nhất để bạn có thể áp dụng JWT vào đấy!
Khi người dùng đăng nhập thành công bằng thông tin của họ, ứng dụng có thể yêu cầu truy cập vào các tài nguyên, dịch vụ,…. Mỗi lần thực hiện, chúng sẽ phải cung cấp 1 Access Token dạng JWT. Lúc này, hình thức đăng nhập 1 lần SSO của bạn sẽ cần đến JWT bởi vì JWT có chi phí định dạng nhỏ và có thể sử dụng cùng lúc trên nhiều tên miền.
Truyền đạt và bảo vệ toàn vẹn thông tin – Information Exchange
JWT là một phương án tối ưu để truyền đạt và bảo vệ sự toàn vẹn của thông tin là vì:
- JWT sử dụng cặp khóa công khai/ riêng tư – bạn có thể kiểm tra, đối chứng rằng người gửi đúng như những gì họ nói.
- Signature được tính toán bằng cách sử dụng header và payload. Vì vậy, bạn cũng có thể xác thực được rằng nội dung không bị giả mạo.
JWT mang lại lợi ích gì?
Nhỏ gọn hơn
JWT ngắn gọn hơn XML. Vì thế, khi mã hóa, token JWT cũng sẽ ngắn hơn SAML. Điều này khiến JWT trở thành một lựa chọn phù hợp hơn trong HTML và môi trường HTTP.
An toàn hơn
JWT sử dụng cặp khóa công khai/ riêng tư dưới dạng chứng chỉ X.509 để ký; JWT cũng có thể được ký đối xứng bằng một mã bí mật được chia sẻ sử dụng thuật toán HMAC.
SAML có thể sử dụng các cặp khóa công khai/ riêng tư như JWT. Tuy nhiên, chữ ký số bằng XML lại có nhiều lỗ hổng bảo mật rất, phương pháp thực hiện khó khăn hơn JWT rất nhiều.
Phổ biến hơn
Bộ phân tích cú pháp JSON phổ biến hơn trong hầu hết các ngôn ngữ lập trình, vì chúng ánh xạ trực tiếp đến các đối tượng. Ngược lại, XML không có ánh xạ tài liệu một cách tự nhiên.
Điều này dẫn đến việc bạn có thể dễ dàng làm việc với JWT hơn so với các xác nhận SAML.
Dễ sử xử lý hơn
JWT được sử dụng ở quy mô internet. Vì thế, JWT dễ dàng để xử lý trên hầu hết các thiết bị của người dùng, đặc biệt là các thiết bị di động.
JWT hoạt động ra sao?
Để hiểu hơn về cách JWT hoạt động, chúng ta sẽ lấy ví dụ cụ thể ở đây là việc xác thực – Authentication.
Khi người dùng thông tin tài khoản vào trình duyệt, trình duyệt sẽ tự động POST tài khoản và mật khẩu của người dùng về server. Lúc này, server xác thực và trả một chuỗi JWT về cho trình duyệt. Token JWT sẽ được lưu trữ trong cookies hoặc LocalStorage, thay vì tạo session trên server và trả về cookies.
Để rõ hơn về quá trình thực hiện, bạn có thể xem ảnh nhé!
Đến đây, chúng ta đã đi qua một hành trình dài để tìm hiểu về JSON Web Tokens – JWT là gì, cũng như những lợi ích mà JWT đem lại cho người sử dụng. Hi vọng rằng, những thông tin, kiến thức này sẽ hỗ trợ bạn trong việc gia tăng bảo mật cho website, ứng dụng của mình!
Bài viết có tham khảo từ: Introduction to JSON Web Tokens, JSON Web Tokens – Auth0.
Những câu hỏi thường gặp về JWT
Thư viện để xác thực cho JWT ở đâu?
Nếu đang tìm danh sách các thư viện cho JWT nhằm phục vụ cho công việc của mình, bạn có thể truy cập vào Libraries for Token Signing/Verification để tìm cho mình thư viện phù hợp từ: .NET, Python, Node.js, Java, JavaScript, Perl, Ruby,.. cho đến Go, Erlang, Haskell,…
Làm sao để được hỗ trợ khi sử dụng JWT?
Nếu bạn muốn được hỗ trợ khi sử dụng JWT, cách tốt nhất là bạn tham gia vào các cộng đồng hỗ trợ JWT miễn phí như trên Facebook, Reddit,… hoặc Auth0 Community “chính chủ” của JWT.
Cách tạo quyền cho tổ chức truy cập vào token ra sao?
Để có thể tạo quyền truy cập token cho toàn bộ tổ chức, bạn có thể tạo quyền liên kết với một API cụ thể.
Sau đó, bạn chuyển đổi mã nhận dạng API của API đó làm thông số cho đối tượng khi tạo yêu cầu đến token. Khi đó, người dùng sẽ được cấp quyền tương ứng với các API đó.
Làm sao để tìm hiểu thêm về JWT?
Nếu muốn tìm hiểu thêm về JWT, bạn có thể tìm hiểu tại JSON Web Tokens Auth0 Documation. Không chỉ những kiến thức cơ bản về JWT, bạn còn có thể học cách để tạo xác thực, uỷ quyền, bảo mật và thậm chí là xây dựng một ứng dụng với bộ tài liệu chi tiết, vô cùng đầy đủ của Auth0.