JWT是JSON Web Token 的简称,根据https://www.rfc-editor.org/rfc/rfc7519的定义如下:
A string representing a set of claims as a JSON object that is encoded in a JWS or JWE, enabling the claims to be digitally signed or MACed and/or encrypted.
翻译过来大概意思就是:将一组声明表示为通过JWS或者JWE编码的JSON对象的字符串,使声明能够被数字签名或加密方式保护。
总结成一句话就是,它是一串经过数字签名或者加密保护的JSON对象格式的字符串。
下面个是几个关于JWT的概念:
JWT Claims Set:一个包含JWT传递的声明JSON对象。
Claim:关于主题所断言的一条信息。Claim表示为由声明名称和声明值组成的名称/值对。
Claim Name:Claim 声明的名称部分。Claim 名称总是一个字符串。
Claim Value:Claim 声明的值。Claim 值可以是任何JSON值,也就是说它可以是字符串,也可以是一个JSON对象。
通常一个JWT有三个部分组成,他们是头部(Header)、载荷(Payload)和签名(Signature),组成的格式如下:
BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS Signature)
Header:声明编码的对象是JWT的类型以及使用的算法,示例如下:
{"typ":"JWT",
"alg":"HS256"}
通常JWT使用Base64url的编码方式,上述的JSON Header经过编码之后,变成:
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
Payload:上述的JWT Claims Set的部分是JWT的payload,也是经过Base64url进行编码的,例如:
{"username":"test",
"exp":1300819380,
"role":admin}
经过编码的值为:eyJ1c2VybmFtZSI6InRlc3QiLAoiZXhwIjoxMzAwODE5MzgwLAoicm9sZSI6YWRtaW59。
Signature:就是使用Header所描述的算法对Base64url编码之后的Header和Payload进行签名之后的值。JWT Signature称为JWS,有一个专门的标准https://www.rfc-editor.org/rfc/rfc7515。如果使用加密的算法,就称为JWE,由另外一个标准https://www.rfc-editor.org/rfc/rfc7516。根据标准RFC7515可以知道Signature的计算公式是:
HMAC256(ASCII(BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload))),假设得到的Signature:WcPGXClpKD7Bc1C0CCDA1060E2GGlTfamrd8-W0ghBE。
根据JWT的生成公式,就可以得到最终的JWT是:
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.
eyJ1c2VybmFtZSI6InRlc3QiLAoiZXhwIjoxMzAwODE5MzgwLAoicm9sZSI6YWRtaW59.
WcPGXClpKD7Bc1C0CCDA1060E2GGlTfamrd8-W0ghBE
通常当以用户登录之后,应用程序管理用户会话的方法是使用Cookie,将SessionID写入Cookie,当用户连接到应用程序时,它生成一个唯一的会话标识符,该标识符存储在服务器上,然后用“Set-Cookie”头返回给客户端。这样,会话cookie就存储在web浏览器里。cookie被设计成在每次请求时由浏览器自动地发送回服务器。该解决方案是处理普通用户登录和注销场景的好方法。但是随着微服务的发展和API的兴起,这种方式也越来越不能适应新的需求。因为这种机制不允许多个平台或应用程序轻松地使用单个会话对用户进行身份验证。此外,服务器也需要在其内存中保存会话的状态和数据。
JWT令牌是“无状态的”,这意味着会话信息不存储在服务器端。除了在服务器上节省大量内存之外,JWT令牌还可用于对多个应用程序中的用户进行身份验证。为此,不同的应用程序需要共享相同的私钥来签署和验证令牌。因此,用户将能够在管理用户帐户的应用程序上进行一次身份验证,并无缝地使用相同私钥的其他应用程序来验证令牌的有效性。
一个典型的JWT使用流程如下:
JWT token(JSON Web Token)的主要作用如下: