1. Token Authentication là gì?

Token Authentication là cơ chế xác thực trong đó Client đăng nhập và nhận một Token từ Server. Sau đó, Client sử dụng Token này trong các request tiếp theo để chứng minh rằng request đã được xác thực.

Thay vì gửi lại username/password cho mỗi request:

Login
  ↓
Access Token
  ↓
Các request tiếp theo dùng Token

2. JWT là gì?

JWT (JSON Web Token) là một dạng Token phổ biến được sử dụng trong Authentication.

JWT thường có dạng:

xxxxx.yyyyy.zzzzz

JWT gồm 3 phần:

Header.Payload.Signature

Ba phần này được nối với nhau bằng dấu ..

JWT thường được dùng để chứa các thông tin cần thiết để Server xác định User và kiểm tra tính hợp lệ của Token.

3. Cấu trúc JWT

Header

Header chứa thông tin mô tả Token, thường bao gồm:

{
  "alg": "HS256",
  "typ": "JWT"
}

Trong đó:

  • alg: thuật toán được sử dụng để tạo Signature.
  • typ: loại Token, thường là JWT.

Payload

Payload chứa các Claims, tức là những thông tin được đưa vào Token.

Ví dụ:

{
  "sub": "123",
  "role": "USER",
  "exp": 1690003600
}

Một số Claim phổ biến:

  • sub: Subject, thường dùng để xác định User.
  • iat: thời điểm Token được tạo.
  • exp: thời điểm Token hết hạn.
  • iss: bên phát hành Token.
  • aud: đối tượng nhận Token.

Application cũng có thể có custom claims như role, userId, permission… Tuy nhiên không nên đưa thông tin nhạy cảm vào Payload.

Signature

Signature được dùng để kiểm tra JWT có bị thay đổi hay không và Token có được ký bằng key hợp lệ hay không.

Có thể hiểu đơn giản:

Header + Payload
      ↓
   Secret/Key
      ↓
   Signature

Khi Server nhận JWT, Server kiểm tra Signature. Nếu Payload bị thay đổi nhưng không thể tạo Signature hợp lệ tương ứng, Token sẽ bị từ chối.

4. Access Token

Access Token là Token được sử dụng để truy cập các API được bảo vệ. access token được sinh ra khi user đăng nhập để có quyền truy cập các api còn phân quyền sẽ là của authorization.

Ví dụ:

Authorization: Bearer <access-token>

Access Token thường có thời gian sống tương đối ngắn.

Lý do là nếu Token bị lộ, thời gian kẻ khác có thể sử dụng Token sẽ bị giới hạn.

Access Token hết hạn thì Server sẽ không chấp nhận Token đó nữa.

5. Refresh Token

Để User không phải đăng nhập lại mỗi khi Access Token hết hạn, hệ thống có thể sử dụng Refresh Token.

Refresh Token được dùng để yêu cầu một Access Token mới.

Access Token
→ Dùng để gọi API

Refresh Token
→ Dùng để lấy Access Token mới

Flow:

Login
  ↓
Access Token + Refresh Token
  ↓
Access Token hết hạn
  ↓
Gửi Refresh Token
  ↓
Server xác thực Refresh Token
  ↓
Access Token mới

Access Token thường ngắn hạn hơn Refresh Token.

Refresh Token cần được bảo vệ cẩn thận vì nếu bị đánh cắp, hacker có thể sử dụng nó để lấy Access Token mới tùy thiết kế hệ thống. Và Refresh Token thường được lưu ở nơi an toàn hơn, chẳng hạn HttpOnly + Secure cookie trong web app, đồng thời server có thể áp dụng rotation/revocation để giảm rủi ro khi token bị đánh cắp.

6. JWT và Authorization

JWT chủ yếu giúp Server thực hiện Authentication — xác định User là ai.

Sau đó hệ thống mới thực hiện Authorization — kiểm tra User được phép làm gì.

Ví dụ Token chứa:

{
  "sub": "123",
  "role": "USER"
}

Server có thể xác định:

User = 123
Role = USER

Sau đó kiểm tra User có quyền thực hiện API hay không.

Vì vậy:

JWT
 ↓
Authentication
 ↓
Xác định User
 ↓
Authorization
 ↓
Kiểm tra Role / Permission

Không nên hiểu rằng chỉ cần có JWT là User có toàn quyền truy cập API. vì đây chỉ là token để có thể sử dụng các api của user còn chưa tới phần phân quyền role.

7. JWT và Stateless Authentication

Một ưu điểm thường được nhắc đến của JWT là có thể hỗ trợ mô hình stateless authentication.

Server có thể xác thực request dựa trên Token mà không cần lưu một authentication session riêng cho từng Client.

Request
  ↓
JWT
  ↓
Verify
  ↓
Claims
  ↓
User

Điều này có thể thuận tiện khi hệ thống có nhiều API Server.

Tuy nhiên JWT không có nghĩa hệ thống luôn hoàn toàn stateless. Nếu hệ thống có Refresh Token, Token Revocation, Blacklist hoặc các cơ chế quản lý trạng thái khác thì vẫn có thể cần lưu state ở Server.

 

Bài viết khác

JWT Token Theft & Payload Tampering

Ở bài JWT & Token Authentication, ta đã biết JWT được sử dụng để xác thực user sau khi đăng nhập: Login ↓ Server xác thực username/password ↓ Access Token + Refresh Token ↓ Client lưu token ↓ Gửi Access Token trong mỗi request Ví dụ: GET /api/profile Authorization: Bearer <access-token> Server nhận token, verify […]

Test Types(Các loại kiểm thử phần mềm)

1. Lời mở đầu và vai trò định hình phạm vi của Test Types trong kiểm thử phần mềm: Trong quy trình phát triển và kiểm định chất lượng phần mềm, nếu như Testing Levels (Các cấp độ kiểm thử như Unit, Integration, System, Acceptance) giải quyết câu hỏi kiểm thử được thực hiện ở […]

PHP & Laravel Fundamentals

1. PHP là gì? PHP là ngôn ngữ lập trình phía server, thường dùng để xây dựng backend và web application. Flow cơ bản: Client ↓ HTTP Request PHP / Laravel ↓ Business Logic ↓ Database ↓ HTTP Response Laravel được xây dựng trên PHP, nên muốn học Laravel cần nắm những nền tảng PHP […]

Series 1 — Web Fundamentals: DNS – Browser

Series 1 — Web Fundamentals   Internet → HTTP/HTTPS → DNS → Browser   Bài 3 :DNS & Domain   DNS & Domain – Làm thế nào Domain được chuyển thành IP? Ở hai bài trước, chúng ta đã tìm hiểu: Internet là gì? Client và Server là gì? IP Address là gì? HTTP/HTTPS dùng […]

Authentication & Authorization

1. Authentication & Authorization là gì? Hai khái niệm này thường đi cùng nhau nhưng khác nhau hoàn toàn. Authentication – Xác thực trả lời cho câu hỏi bạn là ai Ví dụ: Đăng nhập bằng: – Username + Password – Access Token – JWT – OAuth 2.0 Server xác định danh tính của User. […]

API Error Handling – Xử lý lỗi trong API

1. API Error Handling là gì? API Error Handling là cách API phát hiện, xử lý và trả về lỗi một cách nhất quán khi request không thể thực hiện thành công. Ví dụ: Client ↓ API ↓ Có lỗi? ├── Không → Success Response └── Có → Error Handling → Error Response mục tiêu […]

Leave a Reply

Your email address will not be published. Required fields are marked *