# Khái niệm
**JWT (JSON Web Token)** là một tiêu chuẩn mở (RFC 7519) được sử dụng để xác thực và truyền thông tin giữa các bên trong một mạng máy tính. JWT sử dụng định dạng JSON để định nghĩa các thông tin và được ký điện tử để đảm bảo tính toàn vẹn của dữ liệu.
# Cấu trúc JWT:
JWT bao gồm ba phần chính, được phân tách bởi dấu chấm ("."):
**Header (Tiêu đề):** Chứa thông tin về loại mã hóa (algorithm) được sử dụng và loại token.
```jwt
{
"typ": "JWT",
"alg": "HS256"
}
```
- “typ” (type) chỉ ra rằng đối tượng là một JWT
- “alg” (algorithm) xác định thuật toán mã hóa cho chuỗi là HS256
**Payload (Phần thông tin):** Chứa các thông tin khác nhau (claims) như thông tin về người dùng, quyền truy cập, thời gian hết hạn, v.v.
```
{
"user_name": "admin",
"user_id": "1513717410",
"authorities": "ADMIN_USER",
"jti": "474cb37f-2c9c-44e4-8f5c-1ea5e4cc4d18"
}
```
**Signature (Chữ ký):** Được tạo bằng cách ký điện tử (sign) của phần header, payload và một secret key (khóa bí mật) sử dụng thuật toán mã hóa được xác định trong header. Chữ ký này đảm bảo tính toàn vẹn của JWT và được sử dụng để xác thực nội dung. Ví dụ:
```
data = base64urlEncode( header ) + "." + base64urlEncode( payload )
signature = Hash( data, secret );
```
> base64UrlEncoder : thuật toán mã hóa header và payload
Đoạn code trên sau khi mã hóa header và payload bằng thuật toán base64UrlEncode ta sẽ có chuỗi như sau:
```
// header
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
// payload
eyJhdWQiOlsidGVzdGp3dHJlc291cmNlaWQiXSwidXNlcl9uYW1lIjoiYWRtaW4iLCJzY29wZSI6WyJyZWFkIiwid3JpdGUiXSwiZXhwIjoxNTEzNzE
```
Sau đó mã hóa 2 chuỗi trên kèm theo secret (khóa bí mật) bằng thuật toán HS256 ta sẽ có chuỗi signature như sau:
```
// signature
9nRhBWiRoryc8fV5xRpTmw9iyJ6EM7WTGTjvCM1e36Q
```
Kết hợp 3 chuỗi trên lại ta sẽ có được một chuỗi JWT hoàn chỉnh:
> eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsidGVzdGp3dHJlc291cmNlaWQiXSwidXNlcl9uYW1lIjoiYWRtaW4iLCJzY29wZSI6WyJyZWFkIiwid3JpdGUiXSwiZXhwIjoxNTEzNzE.9nRhBWiRoryc8fV5xRpTmw9iyJ6EM7WTGTjvCM1e36Q
# Cách JWT hoạt động:
1. Người dùng sau khi xác thực đăng nhập sẽ nhận được JWT từ server.
2. JWT được gửi và lưu trữ trên phía client (thường được lưu trong cookie hoặc local storage).
3. Khi gửi yêu cầu từ client tới server, JWT sẽ được đính kèm trong header Authorization.
4. Server sẽ xác thực tính hợp lệ của JWT bằng cách kiểm tra chữ ký và thông tin trong payload. Nếu hợp lệ, server tiếp tục xử lý yêu cầu của client.
# Lợi ích của JWT:
- Phân tách xác thực và phiên làm việc: JWT cho phép xác thực người dùng một lần và sử dụng token để định danh người dùng trong các yêu cầu sau này, giúp giảm tải cho server và cải thiện hiệu suất.
- Phân phối dữ liệu dễ dàng: JWT cho phép truyền thông tin liên quan đến người dùng, quyền truy cập và thông tin khác giữa các thành phần hệ thống một cách an toàn.
- Đơn giản và di động: JWT sử dụng cấu trúc dữ liệu JSON và có thể được gửi dễ dàng qua mạng và được hỗ trợ trên nhiều ngôn ngữ lập trình.
# Bảo mật trong JWT:
- Chữ ký: JWT sử dụng chữ ký điện tử để đảm bảo tính toàn vẹn của dữ liệu. Chữ ký chỉ có thể được xác minh bởi server sử dụng khóa bí mật đã được chia sẻ.
- Mã hóa: Ngoài việc ký điện tử, JWT còn hỗ trợ mã hóa để bảo vệ thông tin riêng tư trong payload.
# Quyền truy cập (Claims) trong JWT:
- Có hai loại quyền truy cập trong JWT: "Registered claims" (quyền truy cập đã đăng ký) và "Custom claims" (quyền truy cập tùy chỉnh).
- Registered claims bao gồm các thông tin như iss (issuer), sub (subject), aud (audience), exp (expiration time), nbf (not before time), iat (issued at time), và jti (JWT ID).
- Custom claims cho phép bạn thêm các thông tin tùy chỉnh vào payload.
# Xác thực và thời gian hết hạn:
- JWT có thể chứa thông tin về thời gian hết hạn (expiration time) để hạn chế thời gian hiệu lực của token. Khi thời gian hết hạn đã qua, token sẽ không còn được chấp nhận và người dùng sẽ phải xác thực lại.
- Server có thể xác thực JWT bằng cách kiểm tra chữ ký và thời gian hết hạn trong payload.
# Khi nào nên dùng JSON Web Token?
**Authentication:** Đây là trường hợp phổ biến nhất thường sử dụng JWT. Khi người dùng đã đăng nhập vào hệ thống thì những request tiếp theo từ phía người dùng sẽ chứa thêm mã JWT. Điều này cho phép người dùng được cấp quyền truy cập vào các url, service, và resource mà mã Token đó cho phép. Phương pháp này không bị ảnh hưởng bởi Cross-Origin Resource Sharing (CORS) do nó không sử dụng cookie.
**Trao đổi thông tin:** JSON Web Token là 1 cách thức khá hay để truyền thông tin an toàn giữa các thành viên với nhau, nhờ vào phần signature của nó. Phía người nhận có thể biết được người gửi là ai thông qua phần signature. Và chữ ký được tạo ra bằng việc kết hợp cả phần header, payload lại nên thông qua đó ta có thể xác nhận được chữ ký có bị giả mạo hay không.
Tài liệu tham khảo: https://topdev.vn/blog/jwt-la-gi/