XÁC THỰC QUYỀN TRUY CẬP VỚI JSON WEB TOKEN (JWT)

JWT là một chuẩn mở của RFC 7519. Nó định nghĩa một cách thức truyền tin tin cậy giữa các bên liên quan bằng một đối tượng JSON được mã hóa.các bên liên quan có thể tin tưởng và xác minh Token này vì nó được ký bằng chữ ký số.

2. Khi nào thì dùng JWT

Ủy quyền (authorization): JWT được sử dụng chủ yếu trong việc Ủy quyền cho người dùng. Một khi người dùng đã đăng nhập với tài khoản và mật khẩu họ sẽ được cấp một JWT bới server, các request tới các domain, subdomain có liên quan sau đó sẽ kèm theo JWT này, server sẽ xác minh JWT này và cho phép người dùng truy cập vào các dịch vụ, tài nguyên mà được cấp phép theo JWT đó. Trao đổi thông tin: Do đối tượng JSON chứa thông tin được mã hóa và kí nên nó là một phương pháp tốt để trao đổi thông tin giữa các bên liên quan. Nó có thể được kí với chữ ký số sử dụng thuật toán HMAC hay RSA, ECDSA nên ta có thể xác minh bên gửi có thực sự là người đã gửi hay không, hay tài liệu có bị giả mạo thay đổi trong quá trình truyền tải không

3. Cấu trúc của JSON Web Token

cấu trúc json web token
Dưới đây là một JWT nhìn có vẻ rối rắm tuy nhiên nó có cấu trúc cụ thể như sau
cấu trúc chung
Nó bao gồm 3 phần được mã hóa và nối với nhau bằng dấu chấm (.) . Ba phần chính là:
  • header: Phần header là một đối tượng Json. Nó điển hình thường bao gồm 2 trường “typ” khai báo loại Token và “alg” khai báo loại thuật toán dùng để ký ngoài ra còn có thêm một số trường khác
header
Như ta thấy ở trên “alg” là thuật toán ký HMAC SHA256, “typ” là loại token JWT. Cuối cùng Json này được mã hóa Base64Url để thành phần đầu tiên của JWT.
  • Payloadphần payload này bao gồm các “Claim”. “Claim” này mô tả thông tin về một thực thể điển hình là User ngoài ra còn chứa một số thông tin thêm. Claim có 3 loại là registered, public và private claim:
  • registered: là một tập các khóa được định nghĩa sẵn tại  IANA JSON Web Token Claims registry nhằm cung cấp thêm thông tin cho JWT hay là metadata của JWT. Nó bao gồm các trường sau:
  • iss (issuer): tổ chức phát hành token
  • sub (subject): chủ đề của token
  • aud (audience): đối tượng sử dụng token
  • exp (expired time): thời điểm token sẽ hết hạn
  • nbf (not before time): token sẽ chưa hợp lệ trước thời điểm này
  • iat (issued at): thời điểm token được phát hành, tính theo UNIX time
  • jti: JWT ID trong trường hợp sử dụng nhiều JWT lồng nhau
  • Public: Có thể là một tập các khóa được định nghĩa sẵn hoặc khóa do người sử dụng tự định nghĩa tuy nhiên không nên trùng lặp với khóa định nghĩa sẵn. các khóa này thường được cộng đồng công nhận và sử dụng rộng rãi.
  • Private: Nó bao gồm các khóa tự định nghĩa được sử dụng bởi các bên liên quan.
private
Sau đó Payload được mã hóa Bởi Base64URL để tạo thành phần thứ 2 trong JWT.
  • Signature: phần Signature được tạo ra bằng cách kết hợp encode của phần header và payload lại sau đó mã hóa bằng một giải thuật phức tạp hay còn gọi là kí. do trong phân này bao gồm cả header và payload nên ta có thể kiểm tra thông tin có bị giả mạo không bằng cách decode signature và so sánh với hai phần trước.
signature
Cuối cùng ta kết hợp 3 phần theo cấu trúc header.payload.signature lại để thành một JWT.

4. JSON Web Token làm việc như thế nào?

Ở đây, với bài toán Authorization – khi user đăng nhập thành công (Browser sẽ post username và mật khẩu về Server), Server sẽ trả về một chuỗi JWT về Browser, và Token JWT này cần được lưu lại trong Browser của người dùng (thường là LocalStorage hoặc Cookies), thay vì cách truyền thống là tạo một session trên Server và trả về Cookie. Bất cứ khi nào mà User muốn truy cập vào Route được bảo vệ (mà chỉ có User đã đăng nhập mới được phép), Browser sẽ gửi token JWT này trong Header Authorization, Bearer schema của request gửi đi.
bearer schema
Đây là cách mà stateless (phi trạng thái) authentication làm việc, trạng thái của user không được lưu trong bộ nhớ của Server mà được đóng gói hẳn vào trong JWT. Server sẽ kiểm tra Token JWT này có hợp lệ hay không (Bởi vì JWT có tính chất self-contained, mọi thông tin cần thiết để kiểm tra JWT đều đã được chứa trong Token JWT). Do tính chất stateless nên chúng ta không còn phải lo lắng về domains nào được sử dụng cho API của bạn, như không còn gặp rắc rối với CORS (Cross-Origin Resource Sharing) vì nó không sử dụng cookies. Sơ đồ dưới đây cho thấy quá trình này
sơ đồ quá trình