本文共 2345 字,大约阅读时间需要 7 分钟。
JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。它定义了一个紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息,因为此信息是经过数字签名的,因此是可以被验证和信任的。
session认证
http协议是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发送的请求,所以为了让我们的应用能识别是哪个用户发出的,我们只能在服务器存储一份用户登陆的信息,这份登陆信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用个就能识别请求来自哪个用户了,这就是传统的基于sessino认证。JWT认证
基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或会话信息。这也就意味着JWT认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。{ "alg": "HS256", "typ": "JWT"}
alg:声明加密的算法,通常直接使用HMAC, SHA256
typ:声明令牌类型,JWT 最后使用Base64 URL算法将上述的JSON对象转换为字符串保存。2,有效载荷(payload),如下:
{ "sub": "1234567890", "name": "Java碎碎念", "iat": 1516239022}
有效载荷是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。指定七个默认字段供选择:
iss:发行人 exp:到期时间 sub:主题 aud:用户 nbf:在此之前不可用 iat:发布时间 jti:JWT ID用于标识该JWT还可以定义私有字段,如下:
{"sub": "1234567890","name": "chongchong","admin": true}
请注意,默认情况下JWT是未加密的,任何人都可以解读内容,因此不要构建隐私信息字段,存放保密信息,以防止信息泄露。
该JSON对象也是使用Base64 URL算法转换为字符串保存。
3,签名(signature),如下:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret);
签名哈希是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。
首先,需要指定一个密码(secret),该密码仅保存在服务器中,并且不能向用户公开。然后使用头部指定的签名算法(HMAV SHA256),根据以上公式生成签名。在计算出签名哈希后,JWT头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用"."分隔,就构成整个JWT对象。
在计算出签名哈希后,JWT头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用".“分隔,就构成整个JWT对象。
作为令牌的JWT可以放在URL中(例如api.example/?token=xxx)。 Base64中用的三个字符是”+","/“和”=",由于在URL中有特殊含义,因此Base64URL中对他们做了替换:"=“去掉,”+“用”-“替换,”/“用”_"替换,这就是Base64URL算法。客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。
此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。 Authorization: Bearer 当跨域时,也可以将JWT被放置于POST请求的数据主体中。1、JWT默认不加密,但可以加密。生成原始令牌后,可以使用改令牌再次对其进行加密。
2、当JWT未加密方法时,一些私密数据无法通过JWT传输。
3、JWT不仅可用于认证,还可用于信息交换。善用JWT有助于减少服务器请求数据库的次数。
4、JWT的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。也就是
说,一旦JWT签发,在有效期内将会一直有效。5、JWT本身包含认证信息,因此一旦信息泄露,任何人都可以获得令牌的所有权限。为了减少盗用,JWT的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证。
6、为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输。
转载地址:http://cwken.baihongyu.com/