Làm cách nào để mã hóa mã thông báo JWT?

người hướng dẫn. [0. 00] Gọi hàm mã hóa JWT, hàm này sẽ trả về JWT nếu chúng tôi phân tích dữ liệu người dùng sẽ được mã hóa dưới dạng bí mật. Bạn có thể sử dụng bất kỳ chuỗi nào làm bí mật, nhưng tôi đã chọn mã thông báo người dùng là bí mật duy nhất cho mỗi người dùng

[0. 18] Gửi lại JWT dưới dạng phản hồi cho khách hàng. Tạo hàm mã hóa JWT, sau đó tạo một tải trọng JWT có thể thay đổi để chỉ trích xuất thông tin quan trọng từ dữ liệu người dùng để mã hóa. Chúng tôi chỉ cần tên người dùng, ID và URL hình đại diện

[0. 44] Cuối cùng, mã hóa mã thông báo bằng phương thức ký hiệu từ thư viện mã thông báo web JSON. Bây giờ, hãy tiếp tục và nhập thư viện. Sau đó phân tích trọng tải và mã thông báo dưới dạng bí mật đối với dấu hiệu được đo. Thêm thời gian hết hạn. Một giờ là một giá trị phổ biến

[1. 07] Quay trở lại chỉ mục. js trong máy khách. Vì chúng tôi đang nhận JWT từ máy chủ dưới dạng phản hồi, nên chúng tôi có thể lưu trữ JWT trong bộ nhớ cục bộ của người dùng. Điều này sẽ cho phép chúng tôi sử dụng JWT để xác định người dùng do đó phục vụ cùng một mục đích mà giao thức OpenID phục vụ. Đi tới trình duyệt và nhấp vào liên kết được ủy quyền

[1. 31] Mã thông báo sẽ được in trong thiết bị đầu cuối. Nhấp vào tab ứng dụng và xác nhận rằng JWT được lưu trữ trong bộ nhớ cục bộ của bạn. Mã thông báo web JSON không phải là bí mật. Bất cứ ai có nó đều có thể sử dụng dữ liệu được mã hóa trong đó

[1. 48] Chúng tôi có thể xác nhận điều này bằng cách truy cập JWT. io và nếu chúng tôi dán mã thông báo mà chúng tôi có trong bộ nhớ cục bộ của mình, chúng tôi sẽ nhận được cùng một dữ liệu mà chúng tôi đã mã hóa. Nếu bạn muốn đảm bảo rằng mã thông báo không bị thay đổi, hãy xác minh mã thông báo đó trên máy chủ trước khi xử lý yêu cầu

Mã thông báo web JSON [JWT] là phương tiện đại diện cho các yêu cầu được chuyển giữa hai bên. Các yêu cầu trong JWT được mã hóa dưới dạng một đối tượng JSON được ký điện tử bằng Chữ ký web JSON [JWS] và/hoặc được mã hóa bằng Mã hóa web JSON [JWE]

Cách phát âm được đề xuất của JWT giống như từ tiếng Anh "jot"

Yêu cầu ngôn ngữ

Các từ khóa "PHẢI", "KHÔNG PHẢI", "BẮT BUỘC", "SẼ", "SẼ KHÔNG", "NÊN", "KHÔNG NÊN", "KHUYẾN NGHỊ", "CÓ THỂ" và "TÙY CHỌN" trong tài liệu này là . , “Các từ khóa được sử dụng trong RFC để chỉ ra các mức yêu cầu,” tháng 3 năm 1997. ] [RFC2119]

Tình trạng của Bản ghi nhớ này

Bản nháp trên Internet này được gửi hoàn toàn tuân thủ các quy định của BCP 78 và BCP 79

Internet-Drafts là tài liệu làm việc của Internet Engineering Task Force [IETF]. Lưu ý rằng các nhóm khác cũng có thể phân phối tài liệu làm việc dưới dạng Internet-Drafts. Danh sách Internet-Drafts hiện có tại http. // trình theo dõi dữ liệu. vietf. org/bản nháp/hiện tại/

Internet-Drafts là các tài liệu dự thảo có giá trị tối đa sáu tháng và có thể được cập nhật, thay thế hoặc lỗi thời bởi các tài liệu khác bất cứ lúc nào. Việc sử dụng Internet-Drafts làm tài liệu tham khảo hoặc trích dẫn chúng ngoài mục đích “đang tiến hành” là không phù hợp. ”

Bản thảo Internet này sẽ hết hạn vào ngày 15 tháng 6 năm 2012

Thông báo bản quyền

Bản quyền [c] 2011 IETF Trust và những người được xác định là tác giả tài liệu. Đã đăng ký Bản quyền

Tài liệu này tuân theo BCP 78 và các Điều khoản pháp lý của IETF Trust liên quan đến các tài liệu của IETF [http. // người được ủy thác. vietf. org/license-info] có hiệu lực vào ngày xuất bản tài liệu này. Vui lòng xem kỹ các tài liệu này vì chúng mô tả các quyền và hạn chế của bạn đối với tài liệu này. Các Thành phần Mã được trích xuất từ ​​tài liệu này phải bao gồm văn bản Giấy phép BSD Đơn giản hóa như được mô tả trong Phần 4. e của Điều khoản pháp lý ủy thác và được cung cấp mà không có bảo hành như được mô tả trong Giấy phép BSD đơn giản hóa


Mục lục

1. Giới thiệu
2. Thuật ngữ
3. Tổng quan về mã thông báo web JSON [JWT]
    3. 1. Ví dụ JWT
4. Khiếu nại JWT
    4. 1. Tên xác nhận quyền sở hữu dành riêng
    4. 2. Tên Khiếu nại Công khai
    4. 3. Tên Khiếu nại Cá nhân
5. Tiêu đề JWT
6. JWT thuần túy
    6. 1. Ví dụ về bản rõ JWT
7. Quy tắc tạo và xác thực JWT
8. Thuật toán mật mã
9. Cân nhắc IANA
10. Cân nhắc về bảo mật
    10. 1. Các vấn đề bảo mật so sánh Unicode
11. Các vấn đề mở và những việc cần làm [TBD]
12. Tài liệu tham khảo
    12. 1. Tài liệu tham khảo quy chuẩn
    12. 2. Thông tin tham khảo
Phụ lục A. Mối quan hệ của JWT với Mã thông báo SAML
Phụ lục B. Mối quan hệ của JWT với Mã thông báo web đơn giản [SWT]
Phụ lục C. Lời cảm ơn
Phụ lục D. Lịch sử tài liệu
§  Địa chỉ của tác giả



1. Giới thiệu

Mã thông báo web JSON [JWT] là định dạng mã thông báo nhỏ gọn dành cho các môi trường bị giới hạn về không gian, chẳng hạn như tiêu đề Ủy quyền HTTP và tham số truy vấn URI. Các tuyên bố mã hóa JWT sẽ được truyền dưới dạng đối tượng JSON [như được định nghĩa trong RFC 4627 [Crockford, D. , “Loại phương tiện ứng dụng/json cho Ký hiệu đối tượng JavaScript [JSON],” Tháng 7 năm 2006. ] [RFC4627]] được mã hóa base64url và ký điện tử và/hoặc mã hóa. Việc ký được thực hiện bằng Chữ ký Web JSON [JWS] [JWS] [Jones, M. , Balfanz, D. , Bradley, J. , Goland, Y. , xe tăng, J. , Sakimura, N. , và P. Tarjan, “Chữ ký web JSON [JWS],” tháng 12 năm 2011. ]. Quá trình mã hóa được thực hiện bằng Mã hóa Web JSON [JWE] [JWE] [Jones, M. , Rescorla, E. và J. Hildebrand, “Mã hóa web JSON [JWE],” Tháng 12 năm 2011. ]

Cách phát âm được đề xuất của JWT giống như từ tiếng Anh "jot"


2. Thuật ngữ

JSON Web Token [JWT]Một chuỗi bao gồm ba phần. Tiêu đề JWT được mã hóa, Phần thứ hai JWT và Phần thứ ba JWT, theo thứ tự đó, với các phần được phân tách bằng dấu chấm ['. '] ký tự và mỗi phần chứa nội dung được mã hóa base64url. JWT HeaderMột chuỗi đại diện cho một đối tượng JSON mô tả các hoạt động mã hóa được áp dụng cho JWT. Khi JWT được ký, JWT Header là JWS Header. Khi JWT được mã hóa, Tiêu đề JWT là Tiêu đề JWE. Header Parameter NamesTên của các thành viên trong JWT Header. Header Parameter ValuesCác giá trị của các thành viên trong JWT Header. Phần thứ hai của JWTKhi JWT được ký, Phần thứ hai của JWT là Tải trọng JWS được mã hóa. Khi JWT được mã hóa, Phần thứ hai của JWT là Khóa mã hóa JWE được mã hóa. Phần thứ ba của JWTKhi JWT được ký, Phần thứ ba của JWT là Chữ ký JWS được mã hóa. Khi JWT được mã hóa, Phần thứ ba của JWT là Bản mã JWE được mã hóa. Xác nhận quyền sở hữu JWT Một chuỗi đại diện cho một đối tượng JSON chứa các xác nhận quyền sở hữu do JWT chuyển tải. Khi JWT được ký, các byte của biểu diễn UTF-8 của Tập xác nhận quyền sở hữu JWT được mã hóa base64url để tạo Tải trọng JWS được mã hóa. Khi JWT được mã hóa, các byte của biểu diễn UTF-8 của Tập yêu cầu JWT được sử dụng làm Bản rõ JWE. Tên yêu cầu Tên của các thành viên của đối tượng JSON được đại diện bởi Bộ yêu cầu JWT. Giá trị xác nhận Các giá trị của các thành viên của đối tượng JSON được đại diện bởi Tập xác nhận quyền sở hữu JWT. Mã hóa JWT HeaderBase64url mã hóa các byte của UTF-8 RFC 3629 [Yergeau, F. , “UTF-8, định dạng chuyển đổi của ISO 10646,” tháng 11 năm 2003. ] [RFC3629] đại diện cho Tiêu đề JWT. Mã hóa Base64urlVới mục đích của thông số kỹ thuật này, thuật ngữ này luôn đề cập đến mã hóa Base64 an toàn cho URL và tên tệp được mô tả trong RFC 4648 [Josefsson, S. , “Mã hóa dữ liệu Base16, Base32 và Base64,” tháng 10 năm 2006. ] [RFC4648], Phần 5, với các ký tự đệm '=' [không an toàn cho URL] được bỏ qua, như được Phần 3 cho phép. 2. [Xem Phụ lục C của [JWS] [Jones, M. , Balfanz, D. , Bradley, J. , Goland, Y. , xe tăng, J. , Sakimura, N. , và P. Tarjan, “Chữ ký web JSON [JWS],” tháng 12 năm 2011. ] để biết các ghi chú về cách triển khai mã hóa base64url mà không cần đệm. ]

3. Tổng quan về mã thông báo web JSON [JWT]

JWT đại diện cho một tập hợp các xác nhận quyền sở hữu dưới dạng đối tượng JSON được mã hóa base64url và ký điện tử và/hoặc mã hóa. Bộ yêu cầu JWT đại diện cho đối tượng JSON này. Theo RFC 4627 [Crockford, D. , “Loại phương tiện ứng dụng/json cho Ký hiệu đối tượng JavaScript [JSON],” Tháng 7 năm 2006. ] [RFC4627] Phần 2. 2, đối tượng JSON bao gồm 0 hoặc nhiều cặp tên/giá trị [hoặc thành viên], trong đó tên là chuỗi và giá trị là giá trị JSON tùy ý. Những thành viên này là những tuyên bố được đại diện bởi JWT

Tên thành viên trong Bộ yêu cầu JWT được gọi là Tên yêu cầu. Các giá trị tương ứng được gọi là Giá trị Yêu cầu

Các byte của biểu diễn UTF-8 của Tập xác nhận quyền sở hữu JWT được ký theo cách được mô tả trong JSON Web Signature [JWS] [JWS] [Jones, M. , Balfanz, D. , Bradley, J. , Goland, Y. , xe tăng, J. , Sakimura, N. , và P. Tarjan, “Chữ ký web JSON [JWS],” tháng 12 năm 2011. ] và/hoặc được mã hóa theo cách được mô tả trong JSON Web Encryption [JWE] [JWE] [Jones, M. , Rescorla, E. và J. Hildebrand, “Mã hóa web JSON [JWE],” Tháng 12 năm 2011. ]

Nội dung của Tiêu đề JWT mô tả các hoạt động mã hóa được áp dụng cho Tập xác nhận quyền sở hữu JWT. Nếu Tiêu đề JWT là Tiêu đề JWS, các yêu cầu được ký. Nếu Tiêu đề JWT là Tiêu đề JWE, các xác nhận quyền sở hữu sẽ được mã hóa

JWT được biểu diễn dưới dạng nối của Tiêu đề JWT được mã hóa, Phần thứ hai JWT và Phần thứ ba JWT, theo thứ tự đó, với các phần được phân tách bằng dấu chấm ['. '] nhân vật. Khi được ký, ba phần của JWT là ba phần của JWS được sử dụng để đại diện cho JWT. Khi được mã hóa, ba phần của JWT là ba phần của JWE được sử dụng để đại diện cho JWT


3. 1. Ví dụ JWT

Ví dụ sau Tiêu đề JWT tuyên bố rằng đối tượng được mã hóa là Mã thông báo web JSON [JWT] và JWT được ký bằng thuật toán HMAC SHA-256

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

Base64url mã hóa các byte của biểu diễn UTF-8 của Tiêu đề JWT tạo ra giá trị Tiêu đề JWS được mã hóa này, giá trị này được sử dụng làm Tiêu đề JWT được mã hóa

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9

Sau đây là một ví dụ về Tập xác nhận quyền sở hữu JWT

{"iss":"joe",
 "exp":1300819380,
 "//example.com/is_root":true}

Base64url mã hóa các byte của biểu diễn UTF-8 của Bộ xác nhận quyền sở hữu JSON mang lại Tải trọng JWS được mã hóa này, được sử dụng làm Phần thứ hai của JWT [với các ngắt dòng chỉ dành cho mục đích hiển thị]

eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly
9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ

Ký Tiêu đề JWS được mã hóa và Tải trọng JWS được mã hóa bằng thuật toán HMAC SHA-256 và base64url mã hóa chữ ký theo cách được chỉ định trong [JWS] [Jones, M. , Balfanz, D. , Bradley, J. , Goland, Y. , xe tăng, J. , Sakimura, N. , và P. Tarjan, “Chữ ký web JSON [JWS],” tháng 12 năm 2011. ], mang lại Chữ ký JWS được mã hóa này, được sử dụng làm Phần thứ ba của JWT

dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

Nối các phần này theo thứ tự Header. Thứ hai. Thứ ba với các ký tự dấu chấm giữa các phần tạo ra JWT hoàn chỉnh này [với các ngắt dòng chỉ dành cho mục đích hiển thị]

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
.
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
cGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

Tính toán này được minh họa chi tiết hơn trong [JWS] [Jones, M. , Balfanz, D. , Bradley, J. , Goland, Y. , xe tăng, J. , Sakimura, N. , và P. Tarjan, “Chữ ký web JSON [JWS],” tháng 12 năm 2011. ], Phụ lục A. 1


4. Khiếu nại JWT

Bộ xác nhận quyền sở hữu JWT đại diện cho một đối tượng JSON có các thành viên là các xác nhận quyền sở hữu do JWT chuyển tải. Tên Yêu cầu trong đối tượng này PHẢI là duy nhất. Tuy nhiên, xin lưu ý rằng tập hợp các yêu cầu mà JWT phải có để được coi là hợp lệ phụ thuộc vào ngữ cảnh và nằm ngoài phạm vi của thông số kỹ thuật này. Khi được sử dụng trong ngữ cảnh liên quan đến bảo mật, việc triển khai PHẢI hiểu và hỗ trợ tất cả các yêu cầu hiện tại;

Có ba loại tên yêu cầu JWT. Tên Khiếu nại Dành riêng, Tên Khiếu nại Công khai và Tên Khiếu nại Riêng tư


4. 1. Tên Khiếu nại Dành riêng

Các tên yêu cầu sau đây được bảo lưu. Không có tuyên bố nào được xác định trong bảng dưới đây nhằm mục đích bắt buộc, nhưng thay vào đó, cung cấp điểm khởi đầu cho một tập hợp các tuyên bố hữu ích, có thể tương tác. Tất cả các tên đều ngắn vì mục tiêu cốt lõi của JWT là làm cho các mã thông báo trở nên nhỏ gọn


Tên yêu cầu Giá trị JSON Loại yêu cầu Cú pháp yêu cầu Ngữ nghĩaexpnumberIntDateYêu cầu hết hạn [thời gian hết hạn] xác định thời gian hết hạn vào hoặc sau đó mã thông báo KHÔNG ĐƯỢC chấp nhận để xử lý. Quá trình xử lý yêu cầu hết hạn yêu cầu ngày/giờ hiện tại PHẢI trước ngày/thời gian hết hạn được liệt kê trong yêu cầu hết hạn. Người triển khai CÓ THỂ cung cấp một số khoảng thời gian nhỏ, thường không quá vài phút, để tính đến độ lệch của đồng hồ. Yêu cầu này là TÙY CHỌN. nbfnumberIntDateYêu cầu nbf [không phải trước] xác định thời gian trước đó mã thông báo KHÔNG ĐƯỢC chấp nhận để xử lý. Việc xử lý khiếu nại nbf yêu cầu ngày/giờ hiện tại PHẢI sau hoặc bằng ngày/giờ không trước được liệt kê trong khiếu nại nbf. Người triển khai CÓ THỂ cung cấp một số khoảng thời gian nhỏ, thường không quá vài phút, để tính đến độ lệch của đồng hồ. Yêu cầu này là TÙY CHỌN. iatnumberIntDateYêu cầu iat [được phát hành tại] xác định thời điểm JWT được phát hành. Yêu cầu này có thể được sử dụng để xác định tuổi của mã thông báo. Yêu cầu này là TÙY CHỌN. issstringStringOrURIYêu cầu iss [nhà phát hành] xác định người ủy thác đã phát hành JWT. Việc xử lý khiếu nại này nói chung là ứng dụng cụ thể. Giá trị iss phân biệt chữ hoa chữ thường. Yêu cầu này là TÙY CHỌN. audstringStringOrURIYêu cầu aud [đối tượng] xác định đối tượng mà JWT dành cho. Hiệu trưởng dự định xử lý JWT PHẢI được xác định bằng giá trị của yêu cầu đối tượng. Nếu xử lý chính yêu cầu không xác định chính nó với mã định danh trong giá trị yêu cầu aud thì JWT PHẢI bị từ chối. Việc giải thích giá trị đối tượng nói chung là ứng dụng cụ thể. Giá trị aud phân biệt chữ hoa chữ thường. Yêu cầu này là TÙY CHỌN. prnstringStringOrURIYêu cầu prn [chính] xác định chủ đề của JWT. Việc xử lý khiếu nại này nói chung là ứng dụng cụ thể. Giá trị prn phân biệt chữ hoa chữ thường. Yêu cầu này là TÙY CHỌN. jtistringStringYêu cầu jti [JWT ID] cung cấp một mã định danh duy nhất cho JWT. Giá trị định danh PHẢI được gán theo cách đảm bảo rằng có một xác suất không đáng kể rằng cùng một giá trị sẽ vô tình được gán cho một đối tượng dữ liệu khác. Yêu cầu jti có thể được sử dụng để ngăn JWT được phát lại. Giá trị jti phân biệt chữ hoa chữ thường. Yêu cầu này là TÙY CHỌN. typstringStringYêu cầu typ [type] được sử dụng để khai báo một loại cho nội dung của Bộ yêu cầu JWT này. Giá trị typ là trường hợp nhạy cảm. Yêu cầu này là TÙY CHỌN.
 Bảng 1. Định nghĩa xác nhận quyền sở hữu dành riêng 

Tên xác nhận quyền sở hữu dành riêng bổ sung CÓ THỂ được xác định thông qua cơ quan đăng ký Khiếu nại mã thông báo web IANA JSON, theo Mục 9 [Những cân nhắc của IANA]. Các giá trị cú pháp được sử dụng ở trên được định nghĩa như sau.



 Bảng 2. Định nghĩa cú pháp yêu cầu 

4. 2. Tên Khiếu nại Công khai

Tên yêu cầu có thể được xác định theo ý muốn bởi những người sử dụng JWT. Tuy nhiên, để tránh xung đột, mọi tên yêu cầu mới NÊN được xác định trong sổ đăng ký Yêu cầu mã thông báo web IANA JSON hoặc được xác định là URI chứa không gian tên chống xung đột. Ví dụ về không gian tên chống va chạm bao gồm

  • Tên miền,
  • Mã định danh đối tượng [OID] như được định nghĩa trong ITU-T X. 660 và X. 670 Loạt khuyến nghị, hoặc
  • Mã định danh duy nhất toàn cầu [UUID] như được định nghĩa trong RFC 4122 [Leach, P. , Bữa ăn, M. và R. Salz, “Không gian tên URN của mã định danh duy nhất toàn cầu [UUID],,” tháng 7 năm 2005. ] [RFC4122]

Trong mỗi trường hợp, người xác định tên hoặc giá trị cần thực hiện các biện pháp phòng ngừa hợp lý để đảm bảo rằng họ kiểm soát được phần không gian tên mà họ sử dụng để xác định tên xác nhận quyền sở hữu


4. 3. Tên Khiếu nại Cá nhân

Nhà sản xuất và người tiêu dùng JWT có thể đồng ý với bất kỳ tên khiếu nại nào không phải là Tên dành riêng Phần 4. 1 [Tên Khiếu nại Dành riêng] hoặc Tên Công khai Phần 4. 2 [Tên Khiếu nại Công khai]. Không giống như Tên công khai, những tên riêng này có thể bị xung đột và nên thận trọng khi sử dụng


5. Tiêu đề JWT

Các thành viên của đối tượng JSON được đại diện bởi Tiêu đề JWT mô tả các hoạt động mã hóa được áp dụng cho JWT và các thuộc tính bổ sung tùy chọn của JWT. Tên thành viên trong Tiêu đề JWT được gọi là Tên tham số tiêu đề. Những tên này PHẢI là duy nhất. Các giá trị tương ứng được gọi là Giá trị tham số tiêu đề

Việc triển khai PHẢI hiểu toàn bộ nội dung của tiêu đề;

Có hai cách để phân biệt JWT là JWS hay JWE. Đầu tiên là bằng cách kiểm tra giá trị tiêu đề alg [thuật toán]. Nếu giá trị đại diện cho thuật toán chữ ký, thì JWT là JWS; . Phương pháp thứ hai là xác định xem có tồn tại thành viên enc [phương thức mã hóa] hay không. Nếu thành viên enc tồn tại, thì JWT là JWE; . Cả hai phương pháp sẽ mang lại kết quả như nhau

Tham số tiêu đề JWS được xác định bởi [JWS] [Jones, M. , Balfanz, D. , Bradley, J. , Goland, Y. , xe tăng, J. , Sakimura, N. , và P. Tarjan, “Chữ ký web JSON [JWS],” tháng 12 năm 2011. ]. Tham số tiêu đề JWE được xác định bởi [JWE] [Jones, M. , Rescorla, E. và J. Hildebrand, “Mã hóa web JSON [JWE],” Tháng 12 năm 2011. ]. Thông số kỹ thuật này chỉ định thêm việc sử dụng các tham số tiêu đề sau trong cả hai trường hợp JWT là JWS và đó là JWE


Tham số tiêu đề TênJSON Giá trị TypeTham số Header Cú phápHeader Tham số SemanticstypestringStringTham số tiêu đề typ [type] được sử dụng để khai báo thông tin cấu trúc về JWT. Trong trường hợp thông thường khi các hoạt động ký hoặc mã hóa lồng nhau không được sử dụng, việc sử dụng tham số tiêu đề này là TÙY CHỌN và nếu có, KHUYẾN NGHỊ rằng giá trị của nó là "JWT" ​​hoặc "http. // openid. mạng/thông số kỹ thuật/jwt/1. 0". Trong trường hợp các bước mã hóa hoặc ký lồng nhau được sử dụng, việc sử dụng tham số tiêu đề này là BẮT BUỘC; .
 Bảng 3. Cách sử dụng tham số tiêu đề dành riêng 

6. JWT bản rõ

Để hỗ trợ các trường hợp sử dụng mà nội dung JWT được bảo mật bằng phương tiện khác với chữ ký và/hoặc mã hóa có trong mã thông báo [chẳng hạn như chữ ký trên cấu trúc dữ liệu chứa mã thông báo], JWT cũng CÓ THỂ được tạo mà không cần chữ ký hoặc mã hóa. Các JWT thuần túy PHẢI sử dụng giá trị alg không có và được định dạng giống hệt với JWT đã ký với chữ ký trống. Điều này có nghĩa là mã hóa base64url của các byte đại diện cho mã hóa UTF-8 của Tập xác nhận quyền sở hữu JWT là Phần thứ hai của JWT và chuỗi trống là Phần thứ ba của JWT


6. 1. Bản rõ ví dụ JWT

Ví dụ sau JWT Header tuyên bố rằng đối tượng được mã hóa là JWT thuần túy

Base64url mã hóa các byte của biểu diễn UTF-8 của Tiêu đề JWT tạo ra Tiêu đề JWT được mã hóa này

Sau đây là một ví dụ về Tập xác nhận quyền sở hữu JWT

{"iss":"joe",
 "exp":1300819380,
 "//example.com/is_root":true}

Base64url mã hóa các byte của biểu diễn UTF-8 của Bộ xác nhận quyền sở hữu JSON mang lại Tải trọng JWS được mã hóa này, được sử dụng làm Phần thứ hai của JWT [với các ngắt dòng chỉ dành cho mục đích hiển thị]

eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
cGxlLmNvbS9pc19yb290Ijp0cnVlfQ

Phần thứ ba của JWT là chuỗi rỗng

Nối các phần này theo thứ tự Header. Thứ hai. Thứ ba với các ký tự dấu chấm giữa các phần tạo ra JWT hoàn chỉnh này [với các ngắt dòng chỉ dành cho mục đích hiển thị]

________số 8


7. Quy tắc tạo và xác thực JWT

Để tạo JWT, người ta PHẢI thực hiện các bước sau

  1. Tạo Tập xác nhận quyền sở hữu JWT chứa các yêu cầu mong muốn. Lưu ý rằng khoảng trắng được cho phép rõ ràng trong biểu diễn và không thực hiện chuẩn hóa trước khi mã hóa
  2. Đặt Thông báo là byte của biểu diễn UTF-8 của Bộ yêu cầu JWT
  3. Tạo Tiêu đề JWT chứa bộ tham số tiêu đề mong muốn. Nếu JWT được ký hoặc mã hóa, chúng PHẢI tuân thủ [JWS] [Jones, M. , Balfanz, D. , Bradley, J. , Goland, Y. , xe tăng, J. , Sakimura, N. , và P. Tarjan, “Chữ ký web JSON [JWS],” tháng 12 năm 2011. ] hoặc [JWE] [Jones, M. , Rescorla, E. và J. Hildebrand, “Mã hóa web JSON [JWE],” Tháng 12 năm 2011. ] thông số kỹ thuật, tương ứng. Mặt khác, nếu JWT là bản rõ, giá trị alg none PHẢI được sử dụng. Lưu ý rằng khoảng trắng được cho phép rõ ràng trong biểu diễn và không thực hiện chuẩn hóa trước khi mã hóa
  4. Base64url mã hóa các byte của biểu diễn UTF-8 của Tiêu đề JWT. Hãy để đây là Tiêu đề JWT được mã hóa
  5. Tùy thuộc vào việc JWT sẽ được ký, mã hóa hay văn bản gốc, có ba trường hợp
    • Nếu JWT được ký, hãy tạo JWS bằng cách sử dụng Tiêu đề JWT làm Tiêu đề JWS và Thông báo làm Tải trọng JWS; . , Balfanz, D. , Bradley, J. , Goland, Y. , xe tăng, J. , Sakimura, N. , và P. Tarjan, “Chữ ký web JSON [JWS],” tháng 12 năm 2011. ] để tạo JWS PHẢI tuân theo. Đặt Phần thứ hai của JWT là Tải trọng JWS được mã hóa và để Phần thứ ba của JWT là Chữ ký JWS được mã hóa
    • Nếu JWT được mã hóa, hãy tạo JWE bằng cách sử dụng Tiêu đề JWT làm Tiêu đề JWE và Thông báo làm Bản rõ JWE; . , Rescorla, E. và J. Hildebrand, “Mã hóa web JSON [JWE],” Tháng 12 năm 2011. ] để tạo JWE PHẢI tuân theo. Đặt Phần thứ hai JWT là Khóa mã hóa JWE được mã hóa và để Phần thứ ba JWT là Bản mã JWS được mã hóa
    • Mặt khác, nếu JWT là văn bản gốc, hãy để Phần thứ hai của JWT là mã hóa base64url của Thông báo và để Phần thứ ba của JWT là chuỗi trống
  6. Nối Tiêu đề JWT được mã hóa, Phần thứ hai JWT và Phần thứ ba JWT theo thứ tự đó, phân tách từng phần theo dấu chấm ['. '] nhân vật
  7. Nếu một thao tác ký hoặc mã hóa lồng nhau sẽ được thực hiện, hãy để Tin nhắn là phần nối này và quay lại Bước 3, sử dụng giá trị loại là "JWS" hoặc "JWE" tương ứng trong Tiêu đề JWT mới được tạo ở bước đó
  8. Mặt khác, hãy để kết quả JWT là phép nối này

Khi xác thực JWT, các bước sau PHẢI được thực hiện. Nếu bất kỳ bước nào được liệt kê không thành công thì mã thông báo PHẢI bị từ chối để xử lý

  1. JWT PHẢI chứa chính xác hai ký tự dấu chấm
  2. JWT PHẢI được chia thành hai ký tự dấu chấm dẫn đến ba chuỗi. Chuỗi đầu tiên là Tiêu đề JWT được mã hóa;
  3. Tiêu đề JWT được mã hóa PHẢI được giải mã thành công base64url theo giới hạn được đưa ra trong thông số kỹ thuật này rằng không có ký tự đệm nào được sử dụng
  4. Tiêu đề JWT PHẢI là cú pháp JSON hoàn toàn hợp lệ tuân theo RFC 4627 [Crockford, D. , “Loại phương tiện ứng dụng/json cho Ký hiệu đối tượng JavaScript [JSON],” Tháng 7 năm 2006. ] [RFC4627]
  5. Tiêu đề JWT PHẢI được xác thực để chỉ bao gồm các tham số và giá trị có cú pháp và ngữ nghĩa đều được hiểu và hỗ trợ
  6. Xác định xem JWT được ký, mã hóa hay văn bản gốc bằng cách kiểm tra giá trị tiêu đề alg [thuật toán] và tùy chọn, giá trị tiêu đề enc [phương pháp mã hóa], nếu có
  7. Tùy thuộc vào việc JWT đã ký, mã hóa hay bản rõ, có ba trường hợp
    • Nếu JWT được ký, tất cả các bước được chỉ định trong [JWS] [Jones, M. , Balfanz, D. , Bradley, J. , Goland, Y. , xe tăng, J. , Sakimura, N. , và P. Tarjan, “Chữ ký web JSON [JWS],” tháng 12 năm 2011. ] để xác thực JWS PHẢI tuân theo. Hãy để Tin nhắn là kết quả của việc giải mã base64url Tải trọng JWS
    • Nếu JWT được mã hóa, tất cả các bước được chỉ định trong [JWE] [Jones, M. , Rescorla, E. và J. Hildebrand, “Mã hóa web JSON [JWE],” Tháng 12 năm 2011. ] để xác thực JWE PHẢI tuân theo. Hãy để Tin nhắn là Bản rõ JWE
    • Mặt khác, nếu JWT là bản rõ, hãy để Thông báo là kết quả của việc giải mã base64url Phần thứ hai của JWE. Phần thứ ba PHẢI được xác minh là chuỗi rỗng
  8. Nếu Tiêu đề JWT chứa giá trị loại là "JWS" hoặc "JWE", thì Thông báo chứa JWT tương ứng là đối tượng của các hoạt động ký hoặc mã hóa lồng nhau. Trong trường hợp này, hãy quay lại Bước 1, sử dụng Tin nhắn làm JWT
  9. Nếu không, hãy đặt Tập xác nhận quyền sở hữu JWT là Thông báo
  10. Bộ yêu cầu JWT PHẢI là cú pháp JSON hoàn toàn hợp lệ tuân theo RFC 4627 [Crockford, D. , “Loại phương tiện ứng dụng/json cho Ký hiệu đối tượng JavaScript [JSON],” Tháng 7 năm 2006. ] [RFC4627]
  11. Khi được sử dụng trong ngữ cảnh liên quan đến bảo mật, Bộ yêu cầu JWT PHẢI được xác thực để chỉ bao gồm các yêu cầu có cú pháp và ngữ nghĩa đều được hiểu và hỗ trợ

Việc xử lý JWT chắc chắn yêu cầu so sánh các chuỗi đã biết với các giá trị trong mã thông báo. Ví dụ: khi kiểm tra thuật toán là gì, mã hóa chuỗi Unicode alg sẽ được kiểm tra đối với tên thành viên trong Tiêu đề JWT để xem liệu có tên tham số tiêu đề khớp không. Quá trình tương tự xảy ra khi xác định xem giá trị của tham số tiêu đề alg có đại diện cho thuật toán được hỗ trợ hay không

So sánh giữa các chuỗi JSON và các chuỗi Unicode khác PHẢI được thực hiện như quy định bên dưới

  1. Xóa mọi thoát JSON được áp dụng để tạo một mảng các điểm mã Unicode
  2. Chuẩn hóa Unicode [Davis, M. , Người huýt sáo, K. , và M. Dürst, “Các biểu mẫu chuẩn hóa Unicode,” 09 2009. ] [USA15] KHÔNG ĐƯỢC áp dụng tại bất kỳ điểm nào đối với chuỗi JSON hoặc chuỗi mà nó sẽ được so sánh với
  3. So sánh giữa hai chuỗi PHẢI được thực hiện dưới dạng mã Unicode so sánh bằng điểm mã

8. thuật toán mật mã

JWT sử dụng Chữ ký Web JSON [JWS] [JWS] [Jones, M. , Balfanz, D. , Bradley, J. , Goland, Y. , xe tăng, J. , Sakimura, N. , và P. Tarjan, “Chữ ký web JSON [JWS],” tháng 12 năm 2011. ] và Mã hóa Web JSON [JWE] [JWE] [Jones, M. , Rescorla, E. và J. Hildebrand, “Mã hóa web JSON [JWE],” Tháng 12 năm 2011. ] để ký và/hoặc mã hóa nội dung của JWT

Trong số các thuật toán ký JWS, chỉ HMAC SHA-256 PHẢI được triển khai bằng cách tuân thủ triển khai JWT. KHUYẾN NGHỊ rằng việc triển khai cũng hỗ trợ các thuật toán RSA SHA-256 và ECDSA P-256 SHA-256. Hỗ trợ cho các thuật toán và kích thước khóa khác là TÙY CHỌN

Nếu một triển khai cung cấp khả năng mã hóa, thì thuật toán mã hóa JWE, chỉ RSA-PKCS1-1. 5 với khóa 2048 bit, AES-128-CBC và AES-256-CBC PHẢI được triển khai bằng cách triển khai tuân thủ. KHUYẾN NGHỊ triển khai cũng hỗ trợ ECDH-ES với khóa 256 bit, AES-128-GCM và AES-256-GCM. Hỗ trợ cho các thuật toán và kích thước khóa khác là TÙY CHỌN


9. Cân nhắc của IANA

Thông số kỹ thuật này yêu cầu

  • Cơ quan đăng ký IANA mới có tên "Xác nhận mã thông báo web JSON" cho các tên xác nhận quyền sở hữu dành riêng được xác định trong Phần 4. 1 [Tên Khiếu nại Dành riêng]. Việc đưa vào sổ đăng ký là RFC Bắt buộc trong RFC 5226 [Narten, T. và H. Alvestrand, “Hướng dẫn viết Phần cân nhắc IANA trong RFC,” tháng 5 năm 2008. ] Ý nghĩa [RFC5226] đối với các tên yêu cầu JWT dành riêng nhằm mục đích có thể tương tác giữa các lần triển khai. Cơ quan đăng ký sẽ chỉ ghi lại tên yêu cầu dành riêng và một con trỏ tới RFC xác định nó. Thông số kỹ thuật này xác định việc bao gồm các tên xác nhận quyền sở hữu được xác định trong Bảng 1 [Định nghĩa xác nhận quyền sở hữu dành riêng]

10. Cân nhắc về Bảo mật

TBD. Rất nhiều việc phải làm ở đây. Chúng ta cần nhớ xem xét mọi vấn đề liên quan đến bảo mật và phân tích cú pháp JSON. Người ta tự hỏi hầu hết các thư viện phân tích cú pháp JSON an toàn đến mức nào. Họ đã bao giờ được làm cứng cho các tình huống bảo mật chưa? . Chẳng hạn, việc so sánh tên yêu cầu và các tham số khác phải diễn ra sau khi chúng không bị thoát. Cũng cần đưa vào văn bản về. Tầm quan trọng của việc giữ bí mật bí mật. phím xoay. Điểm mạnh và điểm yếu của các thuật toán khác nhau

TBD. Cần đưa vào văn bản về lý do tại sao cần xác thực JSON nghiêm ngặt. Về cơ bản, nếu nhận được JSON không đúng định dạng thì ý định của người gửi là không thể nhận ra một cách đáng tin cậy. Một ví dụ về JSON không đúng định dạng PHẢI bị từ chối là một đối tượng trong đó cùng một tên thành viên xuất hiện nhiều lần. Mặc dù trong bối cảnh không bảo mật, đó là o. k. hào phóng với những gì một người chấp nhận, trong bối cảnh bảo mật, điều này có thể dẫn đến các lỗ hổng bảo mật nghiêm trọng. Ví dụ: JSON không đúng định dạng có thể chỉ ra rằng ai đó đã tìm được lỗ hổng bảo mật trong mã của nhà phát hành và đang tận dụng lỗ hổng đó để khiến nhà phát hành phát hành mã thông báo "xấu" có nội dung mà kẻ tấn công có thể kiểm soát

TBD. Viết về nhu cầu bảo mật nội dung mã thông báo nếu chữ ký không có trong chính JWT


10. 1. Các vấn đề bảo mật so sánh Unicode

Tên yêu cầu trong JWT là chuỗi Unicode. Vì lý do bảo mật, các biểu diễn của những tên này phải được so sánh nguyên văn sau khi thực hiện bất kỳ quá trình xử lý thoát nào [theo RFC 4627 [Crockford, D. , “Loại phương tiện ứng dụng/json cho Ký hiệu đối tượng JavaScript [JSON],” Tháng 7 năm 2006. ] [RFC4627], Phần 2. 5]

Ví dụ, điều này có nghĩa là các chuỗi JSON này phải so sánh là bằng nhau ["JWT", "\u004aWT"], trong khi tất cả các chuỗi này phải so sánh là không bằng với tập hợp đầu tiên hoặc với nhau ["jwt", "Jwt

Các chuỗi JSON CÓ THỂ chứa các ký tự bên ngoài Mặt phẳng đa ngôn ngữ cơ bản Unicode. Chẳng hạn, ký tự khóa của G [U+1D11E] có thể được biểu diễn trong một chuỗi JSON dưới dạng "\uD834\uDD1E". Lý tưởng nhất là việc triển khai JWT NÊN đảm bảo rằng các ký tự bên ngoài Mặt phẳng đa ngôn ngữ cơ bản được giữ nguyên và so sánh chính xác;


11. Các vấn đề mở và những việc cần làm [TBD]

Các mục sau đây vẫn phải được thực hiện trong dự thảo này

  • Cung cấp một ví dụ về JWT được mã hóa
  • Làm rõ khả năng tùy chọn để cung cấp thông tin loại cho JWT và/hoặc các bộ phận của chúng. Cụ thể, hãy làm rõ liệu chúng tôi có cần chỉ định loại Tên Yêu cầu ngoài Tham số Tiêu đề hay không, liệu nó có truyền tải cú pháp hay ngữ nghĩa hay không và liệu đây có phải là cách tiếp cận phù hợp hay không. Đồng thời làm rõ mối quan hệ giữa các giá trị loại này và MIME [Freed, N. và N. Borenstein, “Phần mở rộng thư Internet đa năng [MIME] Phần thứ nhất. Format of Internet Message Body,” tháng 11 năm 1996. ] các loại [RFC2045] [nếu có]
  • Hãy suy nghĩ về cách mô tả tốt nhất khái niệm hiện được mô tả là "các byte của biểu diễn UTF-8 của". Các thuật ngữ có thể sử dụng thay cho "byte of" bao gồm "chuỗi byte", "chuỗi octet" và "chuỗi octet". Ngoài ra, hãy xem xét liệu chúng tôi có muốn thêm một tuyên bố làm rõ tổng thể ở đâu đó trong mỗi thông số kỹ thuật như "mọi nơi chúng tôi nói 'biểu diễn UTF-8 của X', ý chúng tôi là 'các byte của biểu diễn UTF-8 của X'". Điều đó có khả năng cho phép chúng tôi bỏ qua phần "các byte của" ở mọi nơi khác
  • Cân nhắc xem có nên đề xuất một loại phương tiện hay không, chẳng hạn như "application/jwt"
  • Kết thúc phần Cân nhắc bảo mật
  • Có thể viết một đặc tả đi kèm có chứa Tuần tự hóa JSON JWT trước đây

12. Người giới thiệu


12. 1. Tài liệu tham khảo quy chuẩn


12. 2. thông tin tham khảo


Phụ lục A. Mối quan hệ của JWT với Mã thông báo SAML

SAML 2. 0 [Cantor, S. , Kemp, J. , Philpott, R. và E. Maler, “Các xác nhận và giao thức cho ngôn ngữ đánh dấu xác nhận bảo mật OASIS [SAML] V2. 0,” tháng 3 năm 2005. ] [OASIS. saml-core-2. 0‑os] cung cấp tiêu chuẩn để tạo mã thông báo với tính biểu cảm cao hơn nhiều và nhiều tùy chọn bảo mật hơn so với JWT hỗ trợ. Tuy nhiên, cái giá phải trả cho sự linh hoạt và biểu cảm này là quy mô và độ phức tạp. Ngoài ra, việc sử dụng XML của SAML [Cowan, J. , “Ngôn ngữ đánh dấu mở rộng [XML] 1. 1,” tháng 10 năm 2002. ] [W3C. CR‑xml11‑20021015] và XML DSIG [Eastlake, D. , Đại bàng, J. và D. Solo, “[Ngôn ngữ đánh dấu mở rộng] Xử lý và cú pháp chữ ký XML,” Tháng 3 năm 2002. ] [RFC3275] chỉ đóng góp vào kích thước của mã thông báo SAML

JWT nhằm cung cấp định dạng mã thông báo đơn giản, đủ nhỏ để vừa với các tiêu đề HTTP và đối số truy vấn trong URI. Nó thực hiện điều này bằng cách hỗ trợ mô hình mã thông báo đơn giản hơn nhiều so với SAML và sử dụng JSON [Crockford, D. , “Loại phương tiện ứng dụng/json cho Ký hiệu đối tượng JavaScript [JSON],” Tháng 7 năm 2006. ] [RFC4627] cú pháp mã hóa đối tượng. Nó cũng hỗ trợ bảo mật mã thông báo bằng cách sử dụng Mã xác thực thư dựa trên hàm băm [HMAC] và chữ ký số sử dụng định dạng nhỏ hơn [và kém linh hoạt hơn] so với XML DSIG

Do đó, mặc dù JWT có thể thực hiện một số điều mà mã thông báo SAML có thể làm, nhưng JWT không nhằm mục đích thay thế hoàn toàn cho mã thông báo SAML, mà là một định dạng mã thông báo thỏa hiệp được sử dụng khi không gian ở mức cao


Phụ lục B. Mối quan hệ của JWT với Mã thông báo web đơn giản [SWT]

Cả JWT và Mã thông báo web đơn giản SWT [Hardt, D. và Y. Goland, “Mã thông báo web đơn giản [SWT],” tháng 11 năm 2009. ] [SWT], cốt lõi của chúng, cho phép các tập hợp yêu cầu được liên lạc giữa các ứng dụng. Đối với SWT, cả tên yêu cầu và giá trị yêu cầu đều là chuỗi. Đối với JWT, trong khi tên yêu cầu là chuỗi, giá trị yêu cầu có thể là bất kỳ loại JSON nào. Cả hai loại mã thông báo đều cung cấp bảo vệ bằng mật mã cho nội dung của chúng. SWT với HMAC SHA-256 và JWT với lựa chọn thuật toán, bao gồm HMAC SHA-256, RSA SHA-256 và ECDSA P-256 SHA-256


Phụ lục C. Sự nhìn nhận

Các tác giả thừa nhận rằng thiết kế của JWT bị ảnh hưởng có chủ ý bởi thiết kế và tính đơn giản của Mã thông báo web đơn giản [Hardt, D. và Y. Goland, “Mã thông báo web đơn giản [SWT],” tháng 11 năm 2009. ] [SWT] và các ý tưởng về mã thông báo JSON mà Dick Hardt đã thảo luận trong cộng đồng OpenID

Các giải pháp để ký nội dung JSON đã được khám phá trước đây bởi Magic Signatures [Panzer [biên tập viên], J. , Laurie, B. và D. Balfanz, “Chữ ký ma thuật,” Tháng 8 năm 2010. ] [MagicSignatures], Dấu hiệu đơn giản JSON [Bradley, J. và N. Sakimura [biên tập viên], “JSON Simple Sign,” Tháng 9 năm 2010. ] [JSS] và Ứng dụng Canvas [Facebook, “Ứng dụng Canvas,” 2010. ] [CanvasApp], tất cả đều ảnh hưởng đến bản nháp này

JWT sử dụng mã hóa nào?

Lưu ý JWT là về ký kỹ thuật số dữ liệu, không mã hóa dữ liệu. JWE, hoặc JSON Web Encryption, là một chủ đề khác xử lý các khía cạnh mã hóa của JWT. Mã thông báo JWT được mã hóa bằng cách sử dụng mã hóa base64url [hơi khác so với mã hóa base64].

Làm cách nào để mã hóa mã thông báo JWT với base64?

Cấu trúc của mã thông báo JWT .
Bạn tạo một đối tượng tiêu đề, với định dạng JSON, sau đó bạn mã hóa nó dưới dạng base64
Bạn tạo một đối tượng xác nhận quyền sở hữu, với định dạng JSON, sau đó bạn mã hóa nó trong base64
Bạn tạo một chữ ký cho URI [chúng ta sẽ nói về điều đó sau], sau đó bạn mã hóa nó trong base64

URL JWT có được mã hóa không?

Đối với các thuật toán dựa trên HMAC, các hàm JWT yêu cầu khóa phải được url base64 được mã hóa .

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

Mã thông báo JWT được tạo như thế nào? . Kết quả một phần là eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. We set the signing algorithm to be HMAC SHA256 [JWT supports multiple algorithms], then we create a buffer from this JSON-encoded object, and we encode it using base64. The partial result is eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 .

Chủ Đề