0

Introduction to JWT: Understanding the Basics

JSON Web Token (JWT) là gì? Trong bài viết này chúng ta sẽ cùng tìm hiểu về khái niệm JWT. Bạn có thể xem chi tiết về lý thuyết được định nghĩa bởi RFC 7519 (https://www.rfc-editor.org/rfc/rfc7519)

Introduction

JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.

Đại khái, JSON Web Tokens, thường được gọi là JWT, là một phương pháp phổ biến để truyền thông tin giữa các bên một cách an toàn. JWT bao gồm ba phần: header, payload, và signature. Trong bài viết này, chúng ta sẽ tìm hiểu về cấu trúc của JWT và tìm hiểu các thuật toán có thể được sử dụng để khởi tạo và xác minh JWT.

  • Header: chứa thông tin về loại JWT và thuật toán được sử dụng để ký trong JWT
  • Payload: chứa dữ liệu được truyền, chẳng hạn như thông tin người dùng, bên phát hành JWT .v..v
  • Signature: được sử dụng để xác minh rằng JWT không bị giả mạo.

jwt-la-gi.jpeg

Tại sao JWT lại quan trọng?

JWT đã trở thành một phần quan trọng của bảo mật web hiện đại vì nó cung cấp cách truyền thông tin an toàn hơn so với các phương pháp truyền thống như cookie. Với cookie, thông tin nhạy cảm như thông tin đăng nhập của người dùng được lưu trữ ở phía máy khách, khiến nó dễ bị tấn công như tạo kịch bản chéo trang (XSS) và giả mạo yêu cầu giữa các trang (CSRF). Với JWT, thông tin nhạy cảm được lưu trữ ở phía server, giúp giảm nguy cơ bị tấn công như vậy.

Ngoài ra, JWT có thể được sử dụng trên các domains khác nhau, khiến chúng trở thành một công cụ hữu ích để triển khai single sign-on (SSO) trên nhiều ứng dụng web.

Cách JWT được sử dụng để xác thực và ủy quyền trong các ứng dụng web

JWT thường được sử dụng để xác thực (authentication) và ủy quyền (authorization) trong các ứng dụng web. Sau đây là một ví dụ về cách nó hoạt động:

1. Authentication: Khi người dùng đăng nhập vào ứng dụng web, server sẽ tạo JWT chứa thông tin về người dùng, chẳng hạn như tên người dùng và vai trò của họ đối với ứng dụng. Sau đó, server sẽ gửi JWT đến client, nơi lưu trữ nó có thể là local storage hoặc cookie.

2. Authorization: Khi client đưa ra yêu cầu tới server về tài nguyên được bảo vệ, nó sẽ gửi JWT cùng với request. Sau đó, máy chủ xác minh chữ ký của JWT để đảm bảo chữ ký không bị giả mạo và kiểm tra thông tin trong tải trọng để xác định xem người dùng có các quyền cần thiết để truy cập tài nguyên hay không.

Nếu JWT hợp lệ và người dùng có các quyền cần thiết, thì server sẽ phản hồi với tài nguyên được yêu cầu. Nếu JWT không hợp lệ hoặc người dùng không có các quyền cần thiết, thì server sẽ phản hồi bằng một lỗi.

JWT Structure

Header

Header chứa thông tin về JWT, chẳng hạn như thuật toán (algorithm) được sử dụng để ký JWT, nó cũng là một đối tượng JSON được mã hóa base64Url. Xem ví dụ sau đây:

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

Trong ví dụ này, thuộc tính alg chỉ định thuật toán được sử dụng để ký JWT (trong trường hợp này là HMAC với SHA-256) và thuộc tính "typ" chỉ định rằng mã thông báo này là JWT.

Payload

Payload của JWT chứa thông tin được truyền đi, chẳng hạn như thông tin người dùng hoặc dữ liệu ủy quyền, nó cũng là một đối tượng JSON được mã hóa base64Url. Xem ví dụ sau đây:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

Trong ví dụ này, thuộc tính sub chứa ID của người dùng, thuộc tính name chứa tên của người dùng và thuộc tính iat là thời gian mà JWT được phát hành.

Signature

Chữ ký của JWT được sử dụng để xác minh rằng mã thông báo không bị giả mạo. Chữ ký được tạo bằng cách lấy headerpayload được mã hóa, kết hợp chúng với khóa bí mật (secret key) và áp dụng thuật toán được chỉ định. Xem ví dụ sau đây:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

Trong ví dụ này, thuật toán HMAC-SHA256 được sử dụng để tạo chữ ký và khóa bí mật được sử dụng để ký vào mã thông báo (JWT).

JWT Algorithms

JWT hỗ trợ một số thuật toán khác nhau để tạo và xác minh mã thông báo. Các thuật toán phổ biến nhất là:

  • HMAC với SHA-256 (HS256): Thuật toán này sử dụng secret key để ký mã thông báo. Nó là một thuật toán đối xứng, nghĩa là cùng một khóa được sử dụng cho cả việc ký và xác minh mã thông báo.
  • RSA với SHA-256 (RS256): Thuật toán này sử dụng cặp public key và private key để ký mã thông báo. Đây là một thuật toán bất đối xứng, nghĩa là một khóa khác được sử dụng để ký và xác minh mã thông báo.
  • Thuật toán chữ ký số đường cong elip với SHA-256 (ES256): Thuật toán này sử dụng mật mã đường cong elip để ký mã thông báo. Nó cũng là một thuật toán bất đối xứng.

Việc sử dụng thuật toán nào tùy thuộc vào trường hợp sử dụng cụ thể và mức độ bảo mật được yêu cầu. Các thuật toán đối xứng như HS256 thường nhanh hơn và dễ triển khai hơn, trong khi các thuật toán bất đối xứng như RS256 và ES256 mang lại sự đảm bảo an toàn mạnh mẽ hơn.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.