JWT
定义
是JSON的基于开放标准(RFC 7519),用于创建访问令牌该断言权利要求中的一些数字。例如,一台服务器可能会生成一个令牌, 声称“以管理员身份登录”并将其提供给客户端。客户端然后可以使用该标记来证明它以管理员身份登录。令牌由服务器密钥签名, 因此客户端和服务器都能够验证令牌是否合法。该令牌被设计为紧凑,URL -safe和可用特别是在网页浏览器 单点登录(SSO) 上下文。JWT声明通常可以用于传递身份提供者和服务提供者之间的身份验证用户的身份,或业务流程所要求的任何其他类型的声明。 令牌也可以被认证和加密。
组成
头部
标识了用于生成签名的算法
header ='{“alg”:“HS256”,“typ”:“JWT”}'
表示该令牌使用HMAC-SHA256进行签名。 对其进行base64加密
负载
添加自定义信息
payload ='{“loggedInAs”:“admin”,“iat”:1422779638}'
对其进行base64加密
签名
通过base64url对头部和有效载荷进行编码并用句点作为分隔符来连接它们来计算
key ='secretkey'
unsignedToken = encodeBase64Url(header)+'.' + encodeBase64Url(有效载荷)
签名= HMAC-SHA256(key,unsignedToken)
对其进行base64加密
这样就得到了签名,完整jwt是"两个点分隔的上面三个base64字符串"
与session的关系
Session认证的弊端: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中, 而随着认证用户的增多,服务端的开销会明显增大。扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话, 这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。 这也意味着限制了应用的扩展能力。CSRF: 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。