JOSE是一个框架,旨在提供一种在各方之间安全地转移声明(如授权信息)的方法。JOSE框架提供了一系列规范来实现此目的。它是由一组规范构成:
本文将介绍JOSE系列规范的各个组件。
JSON Web Token是一种可以签名或加密的标准格式。签名时,它使用JSON Web签名(JWS),加密时,它使用JSON Web加密(JWE)。
JWT规范定义了七个可选的,已注册的声明,并允许公开和私人声明包含在令牌中,七个注册声明是:
声明 | 描述 |
---|---|
iss | JWT的发行人 |
sub | JWT所代表的主题 |
aud | JWT的观众 |
exp | JWT设置过期的时间 |
nbf | JWT有效的时间 |
iat | WT发布时的时间戳(发布时间) |
jti | JWT的唯一标识符(JWT ID) |
公开声明可以通过特定用例进行注册。例如,OpenID Connect 1.0规范定义了诸如auth_time,acr和nonce之类的声明。组织可以使用私有声明来传达有关身份的特定声明(例如first_name,last_name,department)。由于这些索赔名称未注册,因此必须注意避免名称冲突。
使用数字签名签名的JSON Web令牌使用JSON Web签名(JWS)规范。JWS由三个组件组成,即标头,有效负载和数字签名。这三个部分是Base64url编码并以句点分隔。
BASE64URLENCODE(<header>) + "." + BASE64URLENCODE(<payload>) + "." + BASE64URLENCODE(<signature>)
注意:JWT约定以base64 对url编码/解码。这与常规base64编码略有不同。有关Base64与Base64 URL安全编码的详细信息,请参阅RFC4648。
下面包含一个示例JWS:
eyJhbGciOiJSUzI1NiIsImtpZCI6Imkwd25uIn0.eyJzdWIiOiJqb2UiLCJhdWQiOiJpbV9vaWNfY2xpZW50IiwianRpIjoidWY5MFNLNH
dzY0ZoY3RVVDZEdHZiMiIsImlzcyI6Imh0dHBzOlwvXC9sb2NhbGhvc3Q6OTAzMSIsImlhdCI6MTM5NDA2MDg1MywiZXhwIjoxMzk0MDYx
MTUzLCJub25jZSI6ImU5NTdmZmJhLTlhNzgtNGVhOS04ZWNhLWFlOGM0ZWY5Yzg1NiIsImF0X2hhc2giOiJ3Zmd2bUU5VnhqQXVkc2w5bG
M2VHFBIn0.lr4L-oT7DJi7Re0eSZDstAdOKHwSvjZfR-OpdWSOmsrw0QVeI7oaIcehyKUFpPFDXDR0-RsEzqno0yek-_U-Ui5EM-yv0Pia
UOmJK1U-ws_C-fCplUFSE7SK-TrCwaOow4_7FN5L4i4NAa_WqgOjZPloT8o3kKyTkBL7GdITL8rEe4BDK8L6mLqHJrFX4SsEduPk0CyHJS
ykRqzYS2MEJlncocBBI4up5Y5g2BNEb0aV4VZwYjmrv9oOUC_yC1Fb4Js5Ry1t6P4Q8q_2ka5OcArlo188XH7lMgPA2GnwSFGHBhccjpxh
N7S46ubGPXRBNsnrPx6RuoR2cI46d9ARQ
使用JSON Web加密(JWE)规范可以加密JWT。这可以用于令牌内容的附加机密性和安全性(除了在使用传输层安全性的传输期间令牌的安全性)。
JWA规范定义了各方可用于签名或加密的标准算法列表。JWA签名算法包括:
“alg”值 | 签名方法 | 签名密钥 |
---|---|---|
NONE | 没有数字签名 | N / A |
HS256 | HMAC w / SHA-256哈希 | 使用OAuth2客户端的客户端密钥 |
HS384 | HMAC w / SHA-384哈希 | 使用OAuth2客户端的客户端密钥 |
HS512 | HMAC w / SHA-512哈希 | 使用OAuth2客户端的客户端密钥 |
RS256 | RSA PKCS v1.5 w / SHA-256哈希 | 公钥可从JWKS获得 |
RS384 | RSA PKCS v1.5 w / SHA-384哈希 | 公钥可从JWKS获得 |
RS512 | RSA PKCS v1.5 w / SHA-512哈希 | 公钥可从JWKS获得 |
ES256 | ECDSA w / P-256曲线和SHA-256哈希 | 公钥可从JWKS获得 |
ES384 | ECDSA w / P-384曲线和SHA-384哈希 | 公钥可从JWKS获得 |
ES512 | ECDSA w / P-521曲线和SHA-512哈希 | 公钥可从JWKS获得 |
注意:接受使用“none”算法签名的令牌会产生安全隐患。如果令牌通过其他方式保护并且预期“none”算法,则开发人员应仅接受使用“none”算法的JWT。
JSON Web Key规范定义了非对称密钥如何以JSON格式表示,并引入了密钥集集合(JWKS),它为程序提供了发布其签名和加密密钥的方法。
给定以下JSON Web密钥集(JWKS)(OpenID Connect 1.0 JWKS),定义了两个密钥(ECDSA密钥和RSA密钥):
{
"keys":[
{
"kty":"EC",
"kid":"i0wng",
"use":"sig",
"x":"AXYMGFO6K_R2E3RH42_5YTeGYgYTagLM-v3iaiNlPKFFvTh17CKQL_OKH5pEkj5U8mbel-0R1YrNuraRXtBztcVO",
"y":"AaYuq27czYSrbFQUMo3jVK2hrW8KZ75KyE8dyYS-HOB9vUC4nMvoPGbu2hE_yBTLZLpuUvTOSSv150FLaBPhPLA2",
"crv":"P-521"
},
...
{
"kty":"RSA",
"kid":"i0wnn",
"use":"sig",
"n":"mdrLAp5GR8o5d5qbwWTYqNGuSXHTIE6w9HxV445oMACOWRuwlOGVZeKJQXHM9cs5Dm7iUfNVk4pJBttUxzcnhVCRf
9tr20LJB7xAAqnFtzD7jBHARWbgJYR0p0JYVOA5jVzT9Sc-j4Gs5m8b-am2hKF93kA4fM8oeg18V_xeZf11WWcxnW5YZwX
9kjGBwbK-1tkapIar8K1WrsAsDDZLS_y7Qp0S83fAPgubFGYdST71s-B4bvsjCgl30a2W-je9J6jg2bYxZeJf982dzHFqV
QF7KdF4n5UGFAvNMRZ3xVoV4JzHDg4xe_KJE-gOn-_wlao6R8xWcedZjTmDhqqvUw",
"e":"AQAB"
},
...]
}
注意:对于RSA密钥,“n”组件是模数,“e”组件是指数。两者都是base64urlencoded值。