由头部、载荷、签名三部分组成。
头部指定使用的签名算法。
载荷携带已认证用户的非敏感信息。
签名就是使用头部指定的签名算法对头部和载荷的签名。
使用token的好处是,服务端可以仅保存一个签名密钥,就可以进行用户认证。
典型的头部:
{
"alg": "HS512",
"typ": "JWT"
}
type可省略,默认值为"JWT"
载荷就是存用户信息的json。
签名就是:
HS512(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret))
最终的token就是对这三部分进行base64url编码,然后通过.拼接成的一个字符串。
eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjhkYmNiODA0LTkxNzAtNDIzOC1iYzhhLTczZGVmYzU3ZTIxNyJ9.HuFST57lj-7N3MSNB8JXEauOhr3BhWb1PxXLWdwqM65MZHDd8eoSAdPdHrxRP2NfPq5MUnucjGYUUKUlqT0bCQ
从JWT设计者的角度看JWT
目标:自包含(JWT本身包含了所有必要的信息,而不需要依赖于外部系统或数据库进行附加查询)
所以这就要求JWT包含所有的必要信息。这些信息的格式需要定义,设计者选择了流行的json格式。这就是JWT中的载荷(payload)。
为了防止必要信息不被篡改,所以加上了签名(signature)。
为了知道使用的签名算法,所以又加了个头部(header),头部也是json格式。
为了支持token能放到URL中使用(比如api.example.com/?token=xxx),所以将三部分都用base64url进行编码。
最后就是把三部分用分隔符连接成一个整体。设计者选择了“.”符号。
网友评论