Hiểu về Token JWT: Cơ chế hoạt động và tầm quan trọng của chúng
By hientd, at: 21:50 Ngày 25 tháng 2 năm 2023
Thời gian đọc ước tính: __READING_TIME__ phút


Chúng ta sẽ đề cập đến một số chủ đề quan trọng
- Giới thiệu về Token JWT
- Cách thức hoạt động của Token JWT
- Ưu điểm của Token JWT
- Nhược điểm của Token JWT
- Thực tiễn tốt nhất khi sử dụng Token JWT
- Ứng dụng của Token JWT
- Tài liệu tham khảo
Hãy cùng xem xét từng phần một
1. Giới thiệu về Token JWT
JSON Web Token (JWT) là một tiêu chuẩn mở (RFC 7519) định nghĩa một cách thức nhỏ gọn và tự chứa để truyền thông tin một cách an toàn giữa các bên dưới dạng một đối tượng JSON. Thông tin này có thể được xác minh và tin cậy vì nó được ký số. JWT có thể được ký bằng một khóa bí mật (với thuật toán HMAC) hoặc một cặp khóa công khai/khóa riêng tư sử dụng RSA hoặc ECDSA.
Token JWT rất quan trọng vì chúng cung cấp một cách thức an toàn và hiệu quả để xử lý xác thực và ủy quyền người dùng trong các ứng dụng web. Token JWT loại bỏ nhu cầu về kho lưu trữ phiên ở phía máy chủ, điều này đơn giản hóa kiến trúc của các ứng dụng web và cải thiện khả năng mở rộng.
Token JWT được sử dụng trong nhiều ứng dụng và kiến trúc web khác nhau, bao gồm các ứng dụng trang đơn (SPA), microservices và API. Chúng thường được sử dụng trong các framework web hiện đại như Node.js, Ruby on Rails và Django.
2. Cách thức hoạt động của Token JWT
Cấu trúc của Token JWT
Trong dạng nhỏ gọn của nó, JSON Web Token bao gồm ba phần được phân tách bởi dấu chấm (.
), đó là:
- Header
- Payload
- Signature
Do đó, một JWT thường trông như sau.
Hãy cùng phân tích các phần khác nhau.
Header
Header thường bao gồm hai phần: loại token, là JWT, và thuật toán ký được sử dụng, chẳng hạn như HMAC SHA256 hoặc RSA.
Ví dụ:
{
"alg": "HS256",
"typ": "JWT"
}
Sau đó, JSON này được mã hóa Base64Url để tạo thành phần đầu tiên của JWT.
Payload
Phần thứ hai của token là payload, chứa các claims. Claims là các tuyên bố về một thực thể (thường là người dùng) và dữ liệu bổ sung. Có ba loại claims: đã đăng ký, công khai, và riêng tư claims.
-
Claims đã đăng ký:
Claims đã đăng ký là các claims được liên kết với người giữ token và được sử dụng để xác thực danh tính của họ. Các claims này được tạo khi token được tạo và có thể được liên kết với một người dùng hoặc thực thể cụ thể, cho phép họ chứng minh danh tính của mình và ủy quyền cho một số hoạt động nhất định. Ví dụ về claims đã đăng ký bao gồm tên người dùng, địa chỉ email và thông tin cá nhân khác. Các ví dụ khác về claims đã đăng ký bao gồm các quyền truy cập và đặc quyền cụ thể, chẳng hạn như được phép xem hoặc chỉnh sửa một số dữ liệu hoặc tệp, truy cập các dịch vụ nhất định hoặc thậm chí tham gia vào các sự kiện nhất định. Claims đã đăng ký là một phần quan trọng của danh tính kỹ thuật số và việc tạo token, vì chúng cho phép xác thực và xác minh an toàn người dùng trong hệ thống.
-
Claims công khai:
Claims công khai là các tuyên bố được thực hiện bởi một dự án về ý định của nó đối với token, chẳng hạn như mục đích, công nghệ cơ bản và cách nó dự định sử dụng số tiền được huy động. Một số ví dụ về claims công khai bao gồm cam kết của một dự án sử dụng số tiền được huy động để phát triển một sản phẩm mới, lời hứa sử dụng số tiền để nghiên cứu một công nghệ mới hoặc cam kết sử dụng số tiền để mở rộng phạm vi thị trường của nó. Vì claims công khai tạo thành một phần quan trọng của quá trình bán token, nên chúng phải được xác minh và chính xác.
Những điều này có thể được xác định tùy ý bởi những người sử dụng JWT. Nhưng để tránh xung đột, chúng nên được xác định trong IANA JSON Web Token Registry hoặc được định nghĩa là một URI chứa một không gian tên chống va chạm.
-
Claims riêng tư:
Claims riêng tư là những claims không được IANA đăng ký và được sử dụng để chuyển thông tin bổ sung chỉ có ý nghĩa đối với các bên liên quan. Claims riêng tư có thể được sử dụng để lưu trữ thông tin như tùy chọn người dùng, vai trò người dùng, chi tiết tổ chức và dữ liệu xác thực.
Ví dụ: khi người dùng được xác thực bởi nhà cung cấp danh tính, JWT có thể chứa một claim riêng tư lưu trữ vai trò của người dùng trong tổ chức (ví dụ: "admin", "member", v.v.). Một ví dụ khác là một claim riêng tư lưu trữ tùy chọn người dùng, chẳng hạn như ngôn ngữ hoặc múi giờ ưa thích. Claims riêng tư cũng có thể được sử dụng để lưu trữ dữ liệu xác thực, chẳng hạn như token một lần hoặc dấu thời gian. Các claims này sau đó có thể được ứng dụng sử dụng để đảm bảo rằng người dùng được xác thực và được ủy quyền truy cập ứng dụng.
Một payload ví dụ có thể là:
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Payload sau đó được mã hóa Base64Url để tạo thành phần thứ hai của JSON Web Token.
Signature
Để tạo phần chữ ký, bạn phải lấy header đã được mã hóa, payload đã được mã hóa, một khóa bí mật, thuật toán được chỉ định trong header và ký vào đó.
Ví dụ: nếu bạn muốn sử dụng thuật toán HMAC SHA256, chữ ký sẽ được tạo theo cách sau:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
Chữ ký được sử dụng để xác minh rằng tin nhắn không bị thay đổi trong quá trình truyền và, trong trường hợp các token được ký bằng khóa riêng, nó cũng có thể xác minh rằng người gửi JWT là người mà nó nói.
Nếu bạn muốn thử nghiệm với JWT và đưa các khái niệm này vào thực tế, bạn có thể sử dụng jwt.io Debugger để giải mã, xác minh và tạo JWT.
Ký và Xác minh Token:
Ký và xác minh token trong JWT là một quy trình xác thực được sử dụng để đảm bảo rằng JSON Web Token (JWT) chưa bị sửa đổi trong quá trình truyền. JWT là một phần dữ liệu được mã hóa được sử dụng để chứng minh danh tính của người dùng hoặc tính xác thực của một yêu cầu. JWT bao gồm ba phần: header, payload và chữ ký. Header và payload được mã hóa và sau đó một chữ ký được thêm vào JWT để đảm bảo rằng nó không bị sửa đổi theo bất kỳ cách nào.
Khi JWT được gửi từ client đến server, server phải xác minh rằng JWT có chữ ký hợp lệ. Điều này được thực hiện bằng cách sử dụng một khóa bí mật mà cả server và client đều biết. Sau đó, server sử dụng khóa bí mật để tạo một chữ ký khớp với chữ ký có trong JWT. Nếu các chữ ký khớp, thì JWT được xác minh và server có thể tin tưởng vào dữ liệu trong payload.
Quy trình xác minh chữ ký của JWT này được gọi là ký và xác minh token trong JWT. Đó là một phần thiết yếu của việc xác thực và xác minh các yêu cầu và đảm bảo rằng dữ liệu không bị làm giả. Bằng cách sử dụng ký và xác minh token, các nhà phát triển có thể đảm bảo rằng các ứng dụng của họ an toàn và
Lưu trữ và Truyền Token JWT:
Khi lưu trữ và truyền token JWT, điều quan trọng là phải xem xét các tác động về bảo mật. Token JWT nên được lưu trữ an toàn và không ở dạng văn bản thuần túy. Điều quan trọng cũng là phải xem xét cách các token sẽ được truyền và chỉ truyền chúng qua kết nối được mã hóa như HTTPS. Ngoài ra, token JWT không nên được lưu trữ trong trình duyệt hoặc trong cookie, vì điều này có thể dẫn đến các lỗ hổng bảo mật. Thay vào đó, token JWT nên được lưu trữ trong phiên ở phía máy chủ hoặc trong cơ sở dữ liệu.
Điều quan trọng cũng là phải xem xét thời gian hợp lệ của các token và sử dụng một thuật toán an toàn để ký và xác minh token. Ngoài ra, token JWT nên được luân chuyển định kỳ để đảm bảo rằng kẻ tấn công không thể sử dụng token cũ đã hết hạn.
Cuối cùng, điều quan trọng là phải xem xét tác động của việc mất hoặc bị đánh cắp token JWT. Cách tốt nhất để bảo vệ chống lại điều này là sử dụng các token ngắn hạn và thu hồi tất cả
3. Ưu điểm của Token JWT
Xác thực không trạng thái: Token JWT cho phép xác thực không trạng thái, có nghĩa là máy chủ không cần phải duy trì thông tin phiên cho mỗi người dùng. Điều này có thể cải thiện hiệu suất và khả năng mở rộng của các ứng dụng web.
Khả năng mở rộng: Token JWT có thể giúp cải thiện khả năng mở rộng của các ứng dụng web, đặc biệt là trong kiến trúc microservices. Chúng cho phép tách biệt các mối quan tâm giữa xác thực và ủy quyền, điều này có thể giúp dễ dàng mở rộng các dịch vụ riêng lẻ.
Giảm truy vấn cơ sở dữ liệu: Token JWT có thể giúp giảm số lượng truy vấn cơ sở dữ liệu cần thiết để xác thực, điều này có thể cải thiện hiệu suất. Điều này là bởi vì Token chứa tất cả các thông tin cần thiết để xác thực, loại bỏ nhu cầu máy chủ phải truy vấn cơ sở dữ liệu để lấy thông tin người dùng.
Tính linh hoạt: Token JWT có thể được sử dụng trong nhiều trường hợp khác nhau và có thể được tùy chỉnh để đáp ứng nhu cầu của các ứng dụng khác nhau. Chúng có thể được sử dụng để xác thực và ủy quyền người dùng, cũng như để truyền dữ liệu an toàn giữa các dịch vụ.
4. Nhược điểm của Token JWT
Vấn đề hết hạn token: Một trong những nhược điểm chính của Token JWT là một khi chúng được phát hành, thời gian hết hạn của chúng không thể thay đổi. Điều này có nghĩa là nếu một Token có thời gian hết hạn dài và đặc quyền hoặc quyền truy cập của người dùng thay đổi, người dùng vẫn sẽ có quyền truy cập cho đến khi Token hết hạn. Mặt khác, nếu thời gian hết hạn được đặt quá ngắn, người dùng có thể cần phải đăng nhập thường xuyên, điều này có thể gây bất tiện.
Rủi ro bảo mật Token:
1. Entropy không đủ: Token JWT được tạo bằng cách sử dụng một khóa bí mật. Nếu khóa này quá yếu, nó có thể bị kẻ tấn công đoán và sử dụng để tạo các token giả mạo. Đây là lý do tại sao điều quan trọng là phải sử dụng một khóa mạnh có đủ entropy và được giữ bí mật.
2. Token chưa được ký: Theo mặc định, token JWT được ký bằng một thuật toán mật mã. Nếu token không được ký, nó có thể dễ dàng bị kẻ tấn công làm giả. Đây là lý do tại sao điều quan trọng là luôn ký token bằng một thuật toán mạnh như HS256.
3. Token chưa được mã hóa: Theo mặc định, token JWT không được mã hóa. Điều này có nghĩa là payload của token có thể được bất kỳ ai có quyền truy cập vào token đọc được. Điều quan trọng là luôn mã hóa token JWT để bảo vệ payload khỏi
Kích thước Token: Token JWT có thể trở nên khá lớn, đặc biệt là nếu chúng chứa nhiều dữ liệu. Điều này có thể dẫn đến lưu lượng mạng tăng lên và hiệu suất chậm hơn. Trong một số trường hợp, có thể cần phải chia Token thành nhiều phần hoặc sử dụng một cơ chế xác thực khác.
5. Thực tiễn tốt nhất khi sử dụng Token JWT
Sử dụng Khóa Bí Mật Mạnh: Khóa bí mật được sử dụng để ký và xác minh Token JWT phải dài, phức tạp và được giữ bí mật. Nên sử dụng một trình tạo chuỗi ngẫu nhiên để tạo một khóa mạnh.
Đặt Thời Gian Hết Hạn Token Hợp Lý: Đặt thời gian hết hạn của token thành một độ dài hợp lý, tính đến nhu cầu của người dùng và các yêu cầu bảo mật của ứng dụng. Thời gian hết hạn ngắn hơn có thể cải thiện bảo mật, trong khi thời gian dài hơn có thể cải thiện khả năng sử dụng.
Luôn Sử Dụng HTTPS: Token JWT luôn phải được truyền qua HTTPS, vì nó cung cấp mã hóa đầu cuối và bảo vệ chống lại các cuộc tấn công man-in-the-middle.
Không Lưu Trữ Thông Tin Nhạy Cảm trong Token: Token JWT không nên chứa thông tin nhạy cảm, chẳng hạn như mật khẩu hoặc số thẻ tín dụng. Thay vào đó, hãy lưu trữ thông tin này ở phía máy chủ và chỉ bao gồm một tham chiếu đến nó trong Token nếu cần thiết.
6. Ứng dụng của Token JWT
Xác thực người dùng: Token JWT có thể được sử dụng để xác thực người dùng, cho phép họ truy cập an toàn vào tài nguyên và dịch vụ trong một ứng dụng web hoặc ứng dụng di động.
Ủy quyền và Kiểm soát Truy cập: Token JWT cũng có thể được sử dụng để ủy quyền và kiểm soát truy cập. Sau khi người dùng được xác thực, Token có thể chứa thông tin về quyền và quyền truy cập của người dùng. Thông tin này sau đó có thể được sử dụng để kiểm soát quyền truy cập vào các tài nguyên hoặc dịch vụ cụ thể trong ứng dụng.
Cải thiện bảo mật API: Token JWT có thể được sử dụng để bảo mật API bằng cách xác thực và ủy quyền các yêu cầu được gửi đến API. Điều này giúp ngăn chặn truy cập trái phép và giúp bảo vệ dữ liệu nhạy cảm.
Quản lý phiên: Token JWT có thể được sử dụng để quản lý phiên người dùng. Token có thể được lưu trữ ở phía client và được gửi kèm theo mỗi yêu cầu đến server. Điều này cho phép server dễ dàng theo dõi người dùng nào đang thực hiện yêu cầu nào. Điều này đặc biệt quan trọng
7. Tài liệu tham khảo
JWT.io: https://jwt.io/
Microsoft Docs: https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens
Auth0.com: https://auth0.com/learn/json-web-tokens