
JWT là gì? Hướng dẫn toàn diện về JSON Web Token cho người mới
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
- JWT là tiêu chuẩn RFC 7519 do IETF (cơ quan chuẩn hóa Internet) ban hành.
- JWT gồm ba phần: header, payload, signature, tách bởi dấu chấm (jwt.io).
- 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).
| 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.
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).
| 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.
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.
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.
- B1: Tách chuỗi thành 3 phần.
- B2: Giải mã base64 phần header và payload.
- B3: Kiểm tra chữ ký bằng thư viện.
- 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.
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.
| 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
chs.us, toolsbase.dev, dl.acm.org, noze.it, youtube.com, youtube.com, docs.authlib.org