Trong thời đại số hiện nay, việc bảo mật thông tin là rất quan trọng, đặc biệt là trong các ứng dụng web. JSON Web Tokens (JWT) đã trở thành một giải pháp phổ biến cho xác thực và truyền tải dữ liệu giữa các bên một cách an toàn. Trong bài viết này, VietnamWorks inTECH sẽ giúp bạn hiểu rõ hơn về JWT, cũng như các thành phần chính của nó.

1. JSON Web Tokens là gì?

JSON Web Tokens (JWT) là một chuẩn mở (RFC 7519) cho phép truyền tải thông tin một cách an toàn dưới dạng chuỗi JSON giữa các bên. Thông tin này có thể được xác thực và tin cậy thông qua chữ ký số. JWT thường được sử dụng để xác thực người dùng trong các ứng dụng web, giúp xác nhận danh tính mà không cần phải lưu trữ thông tin trên server sau mỗi yêu cầu.

2. Tại sao chúng ta lại cần JWT?

JWT cho phép xác thực mà không cần server lưu trữ thông tin về phiên làm việc của người dùng. Trước khi có JWT, cách xác thực phổ biến là dựa trên phiên làm việc, nghĩa là server phải lưu trữ thông tin để theo dõi xem ai đã đăng nhập.

Một ứng dụng hay của JWT là Single Sign-On (SSO), nơi một token duy nhất có thể dùng để đăng nhập vào nhiều trang web hoặc dịch vụ khác nhau. Vì JWT có định dạng chuẩn, nên các nền tảng và dịch vụ khác nhau đều có thể sử dụng dễ dàng.

3. Cấu trúc của JWT

JSON Web Tokens (JWT) là một cách thức chuẩn hóa để truyền tải dữ liệu an toàn giữa hai bên.

3.1. Phần thứ 1 là header

Nhìn kỹ vào ví dụ của một token, ta có thể thấy nó có 3 phần, mỗi phần chứa một số dữ liệu, được ngăn cách bởi dấu chấm và được mã hóa bằng Base64. Phần đầu tiên là header, nếu chúng ta giải mã, sẽ thấy một chuỗi JSON mô tả về chính token đó.

{

 “alg”: “HS256”,

 “typ”: “JWT”

}

Phần header cung cấp thông tin về cách chúng ta nên đọc và xác thực dữ liệu cũng như chữ ký của token. Ví dụ, header ở trên cho biết rằng chữ ký của token cần được xác thực bằng thuật toán HS256.

3.2. Phần thứ 2 là payload.

{

 “sub”: “1234567890”,

 “name”: “John Doe”,

 “admin”: true

}

Payload là nội dung chính của token, là đối tượng JSON mà bạn đang bảo vệ và truyền tới một bên khác. Dữ liệu trong payload bao gồm các "claims" (yêu cầu), là những tuyên bố về một thực thể nào đó do người tạo token đưa ra. Thực thể này có thể là một người dùng mà JSON Web Token đại diện, hoặc là dịch vụ yêu cầu.

Có ba loại "claims":

  • Registered claims: Đây là một tập hợp các yêu cầu được định nghĩa trước, không bắt buộc nhưng được khuyến khích sử dụng để đảm bảo tính tương thích. Một số ví dụ là: iss (issuer - người phát hành), exp (expiration time - thời gian hết hạn), sub (subject - đối tượng), aud (audience - đối tượng nhận).

  • Public claims: Là những yêu cầu có thể được định nghĩa tự do bởi những người sử dụng JWT.

  • Private claims: Là những yêu cầu tùy chỉnh được tạo ra để chia sẻ thông tin giữa các bên đã thống nhất việc sử dụng chúng, và không thuộc nhóm registered hay public claims.

3.3. Phần thứ 3 là Chữ ký (Signature)

Phần chữ ký của JWT đóng vai trò quan trọng trong việc đảm bảo tính toàn vẹn và xác thực của token. Nó xác minh rằng token không bị thay đổi và được phát hành bởi một nguồn đáng tin cậy. Khi các token được ký bằng cặp khóa public/private, chữ ký cũng chứng minh rằng chỉ có bên giữ khóa bí mật (private key) mới là bên đã ký token đó.

Để tạo phần chữ ký, bạn cần kết hợp header đã mã hóa, payload đã mã hóa, một chuỗi bí mật (secret), thuật toán được chỉ định trong header, và ký chúng lại. Ví dụ, nếu bạn muốn sử dụng thuật toán HMAC SHA256, chữ ký sẽ được tạo ra theo cách sau:

HMACSHA256( base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret)

Chữ ký được sử dụng để xác minh rằng thông điệp không bị thay đổi trong quá trình truyền tải. Trong trường hợp token được ký bằng khóa private, nó cũng có thể xác minh rằng người gửi của JWT chính xác là người mà họ nói.

Cách Sử Dụng Chữ Ký

Khi server nhận một JWT, nó cần xác thực token đó. Các bước thực hiện như sau:

  • Tái Tạo Chữ Ký: Server sẽ sử dụng cùng một thuật toán và khóa private (hoặc khóa public nếu sử dụng mã hóa bất đối xứng) để tái tạo chữ ký bằng cách ký lại header và payload.

  • So Sánh Chữ Ký: Server so sánh chữ ký mà nó vừa tái tạo với chữ ký có trong JWT đã nhận. Nếu chúng giống nhau, token được coi là hợp lệ và không bị thay đổi.

  • Kiểm Tra Claims: Server sẽ kiểm tra các claims trong payload để đảm bảo chúng đáp ứng các điều kiện cần thiết (chẳng hạn như chưa hết hạn, đúng đối tượng nhận, v.v.).

4. Ví dụ về quy trình tạo token

Xem xét một JWT với các phần sau:

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

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

4.1. Base64Url Encode:

  • Encoded Header: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

  • Encoded Payload: eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

4.2. Tạo chữ ký (sử dụng HMACSHA256 và một secret someSecret):

HMACSHA256( secret, encodedHeader + “.” + encodedPayload )

Kết quả chữ ký:

QUwp8Yc679Jv0sIMLALlmwnVRzHps9sihKw9qtDqWds

4.3. Kết quả — JWT hoàn chỉnh

Khi người dùng đăng nhập thành công, một JSON Web Token sẽ được trả về. Mỗi lần họ muốn truy cập vào một đường dẫn hoặc tài nguyên được bảo vệ, trình duyệt hoặc ứng dụng sẽ gửi JWT, thường nằm trong phần tiêu đề Authorization.

Các đường dẫn được bảo vệ trên server sẽ kiểm tra xem có một JWT hợp lệ trong tiêu đề Authorization hay không. Nếu có, người dùng sẽ được phép truy cập vào các tài nguyên bảo vệ đó.

Lời kết

Tóm lại, JSON Web Tokens là một công cụ mạnh mẽ giúp bảo mật thông tin và xác thực người dùng trong các ứng dụng hiện đại. Với cấu trúc đơn giản và khả năng linh hoạt, JWT không chỉ giúp tăng cường tính bảo mật mà còn tối ưu hóa trải nghiệm người dùng. Hy vọng bài viết đã cung cấp cho bạn cái nhìn tổng quan hữu ích về JWT và các thành phần của nó.

VietnamWorks inTECH

TẠO TÀI KHOẢN MỚI: XEM FULL “1 TÁCH CODEFEE” - NHẬN SLOT TƯ VẤN CV TỪ CHUYÊN GIA - CƠ HỘI RINH VỀ VOUCHER 200K