JJWT

JWT的组成
第一部分我们称它为头部(header)
第二部分我们称其为载荷(payload, 类似于飞机上承载的物品)
第三部分是签证(signature)

header
声明类型,这里是jwt
声明加密的算法 通常直接使用 HMAC SHA256
{
  'typ': 'JWT',
  'alg': 'HS256'
}

然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9


playload
载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分
<1> 标准中注册的声明
<2> 公共的声明
<3> 私有的声明

==标准==中注册的声明 (==建议但不强制使用==) :
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。


==公共==的声明 :
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.
但不建议添加敏感信息,因为该部分在客户端可解密.

==私有==的声明 :
私有声明是提供者和消费者所共同定义的声明,
一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
这个指的就是自定义的claim。比如前面那个结构举例中的admin和name都属于自定的claim。

这些claim跟JWT标准规定的claim区别在于:JWT规定的claim,JWT的接收方在拿到JWT之后,
都知道怎么对这些标准的claim进行验证(还不知道是否能够验证);
而private claims不会验证,除非明确告诉接收方要对这些claim进行验证以及规则才行。\

定义一个payload:
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

然后将其进行base64加密,得到Jwt的第二部分。
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9


signature
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, 'secret'); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ


最终由点分割成三个部分
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,
所以,它就是你服务端的私钥,在任何场景都不应该流露出去。
一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。

应用
JWT如何应用(目前就这两种适用、当然还可以将token添加到cookie中,但是不建议使用)

在请求地址中添加token并验证
CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于Cookie中,
因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的Cookie来通过安全验证。
由此可知,抵御CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,并且该信息不存在于Cookie之中。
鉴于此,系统开发者可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立一个拦截器来验证这个token,
如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。

在HTTP头中自定义属性并验证
自定义属性的方法也是使用token并进行验证,和前一种方法不同的是,
这里并不是把token以参数的形式置于HTTP请求之中,而是把它放到HTTP头中自定义的属性里。
通过XMLHttpRequest这个类,可以一次性给所有该类请求加上csrftoken这个HTTP头属性,并把token值放入其中。
这样解决了前一种方法在请求中加入token的不便,同时,通过这个类请求的地址不会被记录到浏览器的地址栏,
也不用担心token会通过Referer泄露到其他网站。
 
 
posted @ 2019-12-23 22:16  弱水三千12138  阅读(375)  评论(0)    收藏  举报