JSON Web Tokens (JWT) là một cách phổ biến để bảo mật các API và ứng dụng web. Trong bài viết này, chúng ta sẽ khám phá cách JWT có thể được sử dụng để xác thực, bao gồm cách chúng có thể được cấp bởi authentication server và cách chúng có thể được sử dụng để xác thực các yêu cầu API.
The Basics of JWT Authentication
Trong xác thực JWT, người dùng đăng nhập vào ứng dụng hoặc API bằng cách cung cấp thông tin xác thực của họ (ví dụ: tên người dùng và mật khẩu). Sau đó, ứng dụng sẽ xác minh thông tin đăng nhập và nếu chúng hợp lệ, server sẽ tạo JWT. Sau đó JWT được gửi đến client, nơi nó có thể được lưu trữ trong cookie, bộ nhớ cục bộ hoặc cơ chế lưu trữ khác phía client.
Khi client cần đưa ra yêu cầu tới điểm cuối API yêu cầu xác thực, nó sẽ gửi JWT cùng với yêu cầu. Sau đó, server sẽ xác minh JWT để đảm bảo rằng nó không bị giả mạo và nó vẫn hợp lệ. Nếu JWT hợp lệ, server sẽ cấp quyền truy cập vào tài nguyên được yêu cầu.
Issuing JWTs with an Authentication Server
Để phát hành JWT, ứng dụng có thể sử dụng máy chủ xác thực như OAuth2 hoặc OpenID Connect. Các giao thức này xác định một cách tiêu chuẩn để xác thực người dùng và cấp mã thông báo truy cập (có thể là JWT).
Ví dụ: Trong luồng OAuth2, người dùng đăng nhập vào ứng dụng, sau đó chuyển hướng họ đến máy chủ ủy quyền (authorization server). Người dùng nhập thông tin đăng nhập của họ trên authorization server và nếu chúng hợp lệ, authorization server sẽ tạo mã thông báo truy cập (JWT) và gửi lại cho ứng dụng. Sau đó, ứng dụng có thể sử dụng mã thông báo truy cập để thay mặt người dùng thực hiện các yêu cầu đối với các tài nguyên được bảo vệ.
Authenticating API Requests with JWTs
Khi JWT đã được cấp, nó có thể được sử dụng để xác thực các yêu cầu API. Để thực hiện việc này, client cần gửi JWT trong "Authorization" header của yêu cầu HTTP, sử dụng lược đồ "Bearer". Ví dụ:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Sau đó, server có thể giải mã JWT và xác minh chữ ký của nó để đảm bảo rằng nó được cấp bởi một cơ quan đáng tin cậy và không bị giả mạo. Nếu JWT hợp lệ và chưa hết hạn, máy chủ có thể cấp quyền truy cập vào tài nguyên được yêu cầu.
Lợi ích của xác thực JWT
Xác thực JWT mang lại một số lợi ích so với xác thực dựa trên session-based authentication:
- Stateless: Vì JWT là độc lập và bao gồm tất cả thông tin cần thiết, nên máy chủ không cần duy trì session cho mỗi người dùng. Điều này làm giảm chi phí phía máy chủ và giúp mở rộng ứng dụng dễ dàng hơn.
- Scalable: JWT có thể được sử dụng để xác thực các yêu cầu trên nhiều máy chủ hoặc thậm chí các miền khác nhau. Điều này làm cho việc xây dựng các ứng dụng phân tán trở nên dễ dàng hơn.
- Portable: Vì JWT là độc lập nên chúng có thể được lưu trữ trong cookie, bộ nhớ cục bộ hoặc cơ chế lưu trữ phía máy khách khác. Điều này giúp dễ dàng chia sẻ thông tin xác thực giữa các phần khác nhau của ứng dụng.
Conclusion
Xác thực JWT là một cách mạnh mẽ để bảo mật các API và ứng dụng web. Bằng cách sử dụng JWT để xác thực các yêu cầu, bạn có thể tạo các ứng dụng scalable
, stateless
và portable
, có thể dễ dàng tích hợp với các máy chủ xác thực như OAuth2 hoặc OpenID Connect. Với những lợi ích mà xác thực JWT mang lại, không có gì lạ khi nó trở thành một lựa chọn phổ biến để bảo mật hiện đại.