Bạn có bao giờ tự hỏi mỗi lần đăng nhập vào một ứng dụng, “mảnh token” nhỏ xíu ấy thực sự chứa gì bên trong không? JSON Web Token (JWT) là chuẩn mở RFC 7519 giúp truyền thông tin xác thực một cách nhẹ nhàng và an toàn giữa hai bên.

Tiêu chuẩn Internet: RFC 7519 ·
Năm công bố: 2015 ·
Định dạng: JSON, nhỏ gọn, URL-safe ·
Cơ chế bảo mật: Chữ ký số hoặc mã hóa ·
Công cụ phổ biến: npm jwt, jwt.io

Tổng quan nhanh

1Sự thật đã xác nhận
2Điều chưa rõ
  • Liệu JWT có phù hợp cho mọi hệ thống xác thực? (phụ thuộc ngữ cảnh – OWASP khuyến cáo đánh giá theo từng trường hợp)
  • Hiệu quả thực tế của PASETO so với JWT vẫn đang được đánh giá (PASETO official).
3Tín hiệu dòng thời gian
  • 2010: JWT được đề xuất trong cộng đồng OAuth (jwt.io).
  • 2015: RFC 7519 được chuẩn hóa bởi IETF (IETF).
4Điều tiếp theo
  • Các giải pháp thay thế như PASETO và opaque token đang gia tăng (Curity khuyến nghị dùng token sống ngắn).
  • Nhiều cảnh báo bảo mật từ OWASP và Curity khuyến nghị dùng token sống ngắn. (Curity)
Thông số chính của JWT (RFC 7519)
Thông số Giá trị
Tiêu chuẩn RFC 7519 (IETF)
Ngày công bố Tháng 5 năm 2015
Kích thước tối đa Phụ thuộc vào payload, thường dưới 2KB
Thuật toán chữ ký HS256, RS256, ES256
Sử dụng phổ biến Xác thực API, SSO, authentication flows

JWT được sử dụng để làm gì?

Định nghĩa JSON Web Token

JWT là một chuẩn mở theo RFC 7519, được các tổ chức như IETF (cơ quan chuẩn hóa Internet) thiết lập. Nó cho phép truyền thông tin xác thực dưới dạng JSON gọn nhẹ và tự chứa.

Theo jwt.io (trang giới thiệu chính thức), JWT là chuỗi gồm ba phần: header, payload và signature, tách bởi dấu chấm.

Cấu trúc của JWT: header, payload, signature

RFC 7519 quy định JWT có thể là payload của JWS để được ký hoặc của JWE để được mã hóa.

  • Header: chứa loại token và thuật toán ký.
  • Payload: chứa dữ liệu (claims) – OWASP (tổ chức an toàn ứng dụng web) khuyến cáo không đặt thông tin nhạy cảm trong payload.
  • Signature: xác thực tính toàn vẹn và nguồn gốc.

Điểm mạnh: nhờ chữ ký, JWT không thể bị giả mạo nếu không biết bí mật.

Tóm lại: JWT là chuẩn truyền thông tin xác thực nhẹ, tự chứa, có chữ ký. Payload mã mặc định gốc, cần thận trọng.
Tại sao quan trọng

Người phát triển thường lầm tưởng JWT đã mã hóa toàn bộ. Theo OWASP, payload là mã mở, vì vậy phải coi nó như một bản không bí mật.

Sự khác biệt giữa OAuth và JWT là gì?

OAuth là framework ủy quyền, JWT là định dạng token

OAuth 2.0 (giao thức ủy quyền do IETF) là một giao thức ủy quyền. JWT lại là định dạng token có thể được dùng làm access token trong OAuth 2.0.

Cách OAuth và JWT hoạt động cùng nhau

OAuth không bắt buộc JWT; nó có thể dùng opaque token (chỗ dữ liệu ngẫu nhiên). Xuất hiện phổ biến: JWT là access token trong OAuth + OpenID Connect (như trong Curity (nền tảng bảo mật OAuth) đề xuất).

So sánh OAuth và JWT
Tiêu chí OAuth 2.0 JWT
Bản chất Giao thức ủy quyền Định dạng token
Chức năng Ủy quyền, cấp token Mang thông tin xác thực
Có bắt buộc JWT? Không, có thể dùng token opaque Là một lựa chọn
Lĩnh vực dùng Xác thực API, SSO Giải token trong OAuth/OpenID

Điểm cốt lõi: OAuth và JWT không đối thủ. JWT có thể là phần con của OAuth, nhưng cũng có thể độc lập.

Điều cần ghi nhớ

Theo Curity, không nên dùng access token và ID token thay thế cho nhau – dù có cùng định dạng JWT.

Tại sao nhiều người không khuyến nghị sử dụng JWT?

Vấn đề bảo mật với JWT

Một lỗi phổ biến là dùng thuật toán “none” cho phép kẻ tấn công. PortSwigger (học viện bảo mật web) đã ghi nhận nhiều kỹ thuật tấn công JWT trong tài liệu của họ.

  • Dễ bị tấn công nếu secret yếu hoặc dùng thuật toán không an toàn.
  • Không thể thu hồi token trước khi hết hạn.

Khó thu hồi token

Khảo sát từ Curity: nên ưu tiên token có thời gian sống ngắn và sử dụng một revocation list.

Kích thước token lớn

JWT chứa toàn bộ payload trong chuỗi, dẫn đến kích thước lớn hơn. Đối với môi trường tốc độ cao, điều này có thể gây ảnh hưởng.

Cảnh báo đáng chú ý

OWASP cảnh báo: không để lộ thông tin nhạy cảm trong payload JWT, đặc biệt khi nó đi qua ranh giới tổ chức.

Làm thế nào để đọc một token JWT?

Giải mã header và payload base64

Ví dụ: “eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9” giải mã thành {“alg”:”HS256″,”typ”:”JWT”}. Trên jwt.io (trang giới thiệu chính thức) có thể thực hiện dễ dàng.

Sử dụng jwt.io hoặc thư viện npm

Thư viện npm jwt cho phép tạo token, kiểm tra chữ ký. Thư viện khuyên dùng RS256 hoặc ES256 hơn HS256.

  1. B1: Tách chuỗi thành 3 phần.
  2. B2: Giải mã base64 phần header và payload.
  3. B3: Kiểm tra chữ ký bằng thư viện.
  4. B4: Xác thực iss, aud và thời gian hết hạn.

Thứ tự kiểm tra theo Kusari (nền tảng bảo mật API): cấu trúc, chữ ký, thuật toán, issuer, audience, expiration.

Tóm lại: Đọc JWT là việc giải mã base64 hai phần đầu. Chữ ký là phần bảo mật nhất – đừng tin tưởng vào thông báo từ header.

Giải pháp thay thế tốt hơn cho JWT là gì?

Session cookie truyền thống

Cookie phiên bảo mật, dễ thu hồi, phù hợp cho ứng dụng không cần SSO.

Token opaque (PASETO, Branca)

PASETO được PASETO (thủ tướng thế hệ an toàn hơn JWT) thiết kế để dùng thuật toán mã hóa hiện đại, không cho phép chọn thuật toán “none”.

Mã hóa đầu cuối

Đối với dữ liệu siêu nhạy, hãy sử dụng JWE.

So sánh các giải pháp thay thế
Giải pháp Ưu điểm Nhược điểm
Session cookie Dễ thu hồi, đã hỗ trợ ứng dụng truyền thống Khó mở rộng SSO, dễ làm tổn hiệu năng
PASETO An toàn hơn, thiết kế chặt chẽ Độ hiểu rộng; chưa phổ biến bằng JWT
Opaque token Không lộ dữ liệu, quản lý tập trung Cần máy chủ để tra cứu và xác thực

Thực tế: khuyến cáo hiện tại từ Curity và OWASP dùng OAuth 2.0 kết hợp opaque token hoặc JWT sống ngắn – mỗi thứ đều có chỗ của nó.

Ưu điểm

  • Nhẹ gọn, tự chứa thông tin
  • Chuẩn hóa tốt từ IETF
  • Dễ dùng trong OAuth/OpenID Connect

Nhược điểm

  • Không thể thu hồi token
  • Payload không mã hóa mặc định
  • Dễ bị tấn công nếu không đúng

Dòng thời gian

  • : JWT được đề xuất trong cộng đồng OAuth (jwt.io)
  • : RFC 7519 được chuẩn hóa bởi IETF (IETF)
  • : JWT trở thành định dạng token phổ biến trong OAuth 2.0 và OpenID Connect
  • : Các cảnh báo bảo mật về JWT gia tăng; nhiều giải pháp thay thế ra đời

Điều đã xác nhận và điều chưa rõ

Sự thật đã xác nhận

  • JWT là tiêu chuẩn RFC 7519 (IETF)
  • JWT gồm 3 phần: header, payload, signature (jwt.io)
  • JWT không mã hóa payload mặc định (OWASP)
  • JWT có thể bị tấn công nếu dùng thuật toán ‘none’ (PortSwigger)
  • OWASP khuyến nghị dùng thư viện an toàn và cập nhật (OWASP)

Điều chưa rõ

  • Liệu JWT có phù hợp cho tất cả hệ thống xác thực? (tùy ngữ cảnh)
  • Hiệu quả của PASETO so với JWT trong thực tế vẫn đang được đánh giá
  • Tác động của JWT đến hiệu suất ứng dụng quy mô lớn vẫn chưa được định lượng
  • Khả năng thay thế JWT bằng PASETO trong tương lai vẫn chưa rõ ràng
  • Tác động của việc lưu trữ JWT trên client so với server-side session vẫn chưa được đánh giá đầy đủ

Trích dẫn từ chuyên gia

“JWT (JSON Web Token) là một chuẩn mở cho phép truyền thông tin dưới dạng JSON một cách gọn nhẹ và tự chứa”

— RFC 7519, IETF (IETF)

“Cần đảm bảo chữ ký hợp lệ và đúng thuật toán mong đợi”

— OWASP Web Security Testing Guide (OWASP)

“Không nên đặt dữ liệu nhạy cảm hoặc dữ liệu kinh doanh trong JWT, đặc biệt khi đi qua ranh giới tổ chức”

— Curity (Curity JWT Security Best Practices)

Kết luận

JWT vẫn là công cụ hữu ích cho xác thực API và SSO, nhưng không phải “thần dược”. Những điểm cần lưu ý: payload không mã hóa, khó thu hồi, và nguy cơ tấn công. Các chuyên gia như OWASP và Curity khuyên dùng token sống ngắn, luôn xác thực signature, và không trusted payload. Đối với nhà phát triển tiếng Việt, cách dùng JWT đúng là: dùng JWT có chữ ký mạnh (RS256), luôn kiểm tra iss + aud, và ưu tiên session cookie cho ứng dụng quy mô vừa không cần SSO.

Người phát triển nên cân nhắc: JWT chỉ an toàn khi biết rõ giới hạn của nó.

Câu hỏi thường gặp

JWT có an toàn không?

JWT an toàn khi được ký đúng và quản lý cẩn thận. Tuy nhiên payload là mã mở, không đặt dữ liệu nhạy cảm. (OWASP hướng dẫn dùng thư viện an toàn.)

JWT hoạt động như thế nào?

Khi đăng nhập, hệ thống tạo JWT với secret và gửi về client. Client gửi JWT trong mỗi yêu cầu, server giải mã để kiểm tra.

Làm sao để tạo JWT?

Dùng thư viện như jsonwebtoken (npm) hoặc jwt.io để tạo token. Nên dùng RS256 và tạo secret mạnh.

JWT có thể bị giả mạo không?

Nếu attacker không biết secret hoặc khai thác lỗi thuật toán ‘none’ thì có thể giả mạo. Luôn kiểm soát thuật toán trên server.

JWT có hỗ trợ mã hóa không?

JWT có thể là payload của JWE để được mã hóa. Mặc định JWT không mã hóa nội dung.

JWT khác gì so với session cookie?

Session cookie dễ thu hồi hơn, JWT thì không. Session cookie lưu ở server, JWT lưu ở client, phù hợp cho SSO.

Bài đọc liên quan