Giải thích về mã thông báo web JSON (JWT)

Tìm hiểu kiến thức cơ bản về JWT và cách sử dụng chúng

Mã thông báo web JSON là một tiêu chuẩn được sử dụng để tạo mã thông báo truy cập cho một ứng dụng.

Nó hoạt động theo cách này: máy chủ tạo mã thông báo xác nhận danh tính người dùng và gửi nó đến máy khách.

Máy khách sẽ gửi mã thông báo trở lại máy chủ cho mọi yêu cầu tiếp theo, do đó máy chủ biết yêu cầu đến từ một danh tính cụ thể.

Kiến trúc này tỏ ra rất hiệu quả trong các Ứng dụng web hiện đại, trong đó sau khi người dùng được xác thực, chúng tôi thực hiện các yêu cầu API đối với REST hoặc API GraphQL.

Ai sử dụng JWT? Google chẳng hạn. Nếu bạn sử dụng các API của Google, bạn sẽ sử dụng JWT.

JWT được ký bằng mật mã (nhưngkhông phảiđược mã hóa, do đó, việc sử dụng HTTPS là bắt buộc khi lưu trữ dữ liệu người dùng trong JWT), vì vậy chúng tôi có thể tin tưởng vào nó khi nhận được, vì không người trung gian nào có thể chặn và sửa đổi nó hoặc dữ liệu mà nó nắm giữ mà không làm mất hiệu lực của nó.

Điều đó nói rằng, JWT thường bị chỉ trích vì lạm dụng chúng, và đặc biệt là chúng được sử dụng khi các giải pháp ít vấn đề hơn có thể được sử dụng.

Bạn cần hình thành ý kiến của mình về chủ đề này. Tôi không ủng hộ công nghệ này hơn công nghệ khác, chỉ trình bày tất cả các cơ hội và công cụ bạn có theo ý của mình.

Chúng giỏi trong việc gì? Chủ yếu là xác thực API và ủy quyền từ máy chủ đến máy chủ.

Mã thông báo JWT được tạo như thế nào?

Sử dụng Node.js, bạn có thể tạo phần đầu tiên của mã thông báo bằng cách sử dụng mã này:

const header = { "alg": "HS256", "typ": "JWT" }
const encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64')

Chúng tôi đặt thuật toán ký thànhHMAC SHA256(JWT hỗ trợ nhiều thuật toán), sau đó chúng tôi tạo một bộ đệm từ đối tượng được mã hóa JSON này và chúng tôi mã hóa nó bằng cách sử dụng base64.

Kết quả một phần làeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.

Tiếp theo, chúng tôi thêm tải trọng, chúng tôi có thể tùy chỉnh với bất kỳ loại dữ liệu nào. Có các khóa dành riêng, bao gồmissexpxác định nhà phát hành và thời gian hết hạn của mã thông báo.

Bạn có thể thêm dữ liệu của riêng mình vào mã thông báo bằng cách sử dụng một đối tượng:

const payload = { username: 'Flavio' }

Chúng tôi chuyển đổi đối tượng này, được mã hóa JSON, thành Bộ đệm và chúng tôi mã hóa kết quả bằng cách sử dụng base64, giống như chúng tôi đã làm trước đây:

const encodedPayload = Buffer.from(JSON.stringify(payload)).toString('base64')

Trong trường hợp này, kết quả một phần làeyJ1c2VybmFtZSI6IkZsYXZpbyJ9.

Tiếp theo, chúng tôi nhận được chữ ký từ nội dung tiêu đề và tải trọng, điều này đảm bảo nội dung của chúng tôi không thể thay đổi ngay cả khi bị chặn vì chữ ký của chúng tôi sẽ bị vô hiệu. Để làm điều này, chúng tôi sẽ sử dụngcryptoMô-đun nút:

const crypto = require('crypto')
const jwtSecret = 'secretKey'

const signature = crypto.createHmac(‘sha256’, jwtSecret).update(encodedHeader + ‘.’ + encodedPayload).digest(‘base64’)

Chúng tôi sử dụngsecretKeykhóa bí mật và tạo một biểu diễn được mã hóa base64 của chữ ký được mã hóa.

Giá trị của chữ ký trong trường hợp của chúng tôi là

MQWECYWUT7bayj8miVgsj8KdYI3ZRVS+WRRZjfZrGrw=

Chúng ta gần như đã hoàn tất, chúng ta chỉ cần nối 3 phần header, payload và signature bằng cách phân tách chúng bằng dấu chấm:

const jwt = `${encodedHeader}.${encodedPayload}.${signature}`

Xác thực API

Đây có lẽ là cách hợp lý duy nhất để sử dụng JWT.

Một tình huống phổ biến là: bạn đăng ký một dịch vụ và tải xuống JWT từ bảng điều khiển dịch vụ. Đây là những gì bạn sẽ sử dụng từ bây giờ để xác thực tất cả các yêu cầu của bạn với máy chủ.

Một trường hợp sử dụng khác, ngược lại, là gửi JWT khi bạn quản lý API và các ứng dụng khách kết nối với bạn và bạn muốn người dùng của mình gửi các yêu cầu tiếp theo chỉ bằng cách chuyển mã thông báo.

Trong trường hợp này, khách hàng cần lưu trữ mã thông báo ở đâu đó. Nơi tốt nhất là ở đâu? Trong mộtHttpOnly cookie. Các phương pháp khác đều có xu hướngXSScác cuộc tấn công và do đó chúng nên được tránh. Cookie HttpOnly không thể truy cập được từ JavaScript và được tự động gửi đến máy chủ gốc theo mọi yêu cầu, vì vậy nó hoàn toàn phù hợp với trường hợp sử dụng.

Chọn thư viện JWT tốt nhất

Tùy thuộc vào ngôn ngữ và môi trường bạn sử dụng, bạn có thể chọn từ một số thư viện. Phổ biến nhất được liệt kê trongjwt.iotrang mạng.

Không sử dụng JWT làm mã thông báo phiên

Bạn không nên sử dụng JWT cho các phiên. Sử dụng cơ chế phiên phía máy chủ thông thường, vì nó hiệu quả hơn nhiều và ít bị lộ dữ liệu hơn.

Tài nguyên

Đọc thêm

Có rất nhiều tài liệu về JWT trên internet.

Bạn có thể mất hàng giờ đọc các bài đăng và ý kiến trên blog. Một số bài viết đó là