FreeCMS商业版

功能强大、开源、代码通俗易懂、注释详细、面向二次开发友好!

承接网站建设、软件开发、微信开发项目,价格从优,欢迎咨询合作!

FreeCMS商业版V2.8已发布!购买请联系客服QQ 124812878 查看更新日志



在线演示 立即购买 下载免费版 下载商业版用户手册
客服QQ: 124812878 联系电话: 18339991503 Email: freeteam@foxmail.com

shiro jwt 构建无状态分布式鉴权体系 - wangjie2016 - ITeye博客

加入收藏夹】     【打印】     【关闭】 来源: 日期:2018-01-11 22:00:18 点击量: 收藏

一:JWT

1、令牌构造

JWT(json web token)是可在网络上传输的用于声明某种主张的令牌(token),以JSON 对象为载体的轻量级开放标准(RFC 7519)。

一个JWT令牌的定义包含头信息、荷载信息、签名信息三个部分:

Header//头信息
{
    "alg": "HS256",//签名或摘要算法
    "typ": "JWT"//token类型
}
Playload//荷载信息
{
    "iss": "token-server",//签发者
    "exp ": "Mon Nov 13 15:28:41 CST 2017",//过期时间
    "sub ": "wangjie",//用户名
    "aud": "web-server-1"//接收方,
    "nbf": "Mon Nov 13 15:40:12 CST 2017",//这个时间之前token不可用
    "jat": "Mon Nov 13 15:20:41 CST 2017",//签发时间
    "jti": "0023",//令牌id标识
    "claim": {“auth”:”ROLE_ADMIN”}//访问主张
}
Signature//签名信息
签名或摘要算法(
    base64urlencode(Header),
    Base64urlencode(Playload),
    secret-key
)

按照JWT规范,对这个令牌定义进行如下操作:

base64urlencode(Header)
+"."+
base64urlencode(Playload)
+"."+
signature(
    base64urlencode(Header)
    +"."+
    base64urlencode(Playload)
    ,secret-key
)

形成一个完整的JWT:
eyJhbGciOiJIUzUxMiIsInppcCI6IkRFRiJ9.eNqqVspMLFGyMjQ1NDA1tTA0NNRRKi5NUrJSKk_MS8_KTFXSUUqtKEAoMDKsBQAAAP__.dGLe7BVECKzQ_utZJqk4hbcBZthNhohuEjjue98vmpQSGn_9cCYHq7lPIfwKubW8M553F8Uhk933EJwgI5vbLQ

需要注意的是:

1:荷载信息(Playload)中的属性可以根据情况进行设置,不要求必须全部填写。

2:由token的生成方式发现,Header和Playload仅仅是base64编码,通过base64解码之后可见,基本相当于是明文传输,所以应避免敏感信息放入Playload。

2、令牌特点

紧凑性:体积较小、意味着传输速度快,可以作为POST参数或放置在HTTP头。

自包含性:有效的负载包含用户鉴权所需所有信息,避免多次查询数据库。

安全性:支持对称和非对称方式(HMAC、RSA)进行消息摘要签名。

标准化:开放标准,多语言支持,跨平台。

3、适用场景

1:无状态、分布式鉴权,比如rest api系统、微服务系统。

2:方便解决跨域授权的问题,比如SSO单点登陆。

3:JWT只是消息协议,不牵涉到会话管理和存储机制,所以单体WEB应用还是推荐session-cookie机制。

4、安全策略

1:重放攻击(Replay Attacks):应保证token只能使用一次,可以将有效期设置极短(这个时间不好控制);如果token只使用一次,可以将token的ID放入缓存(redis、memcached)进行阅后即焚(这个可操作性强);如果一个token需要连续穿梭多个系统进行鉴权,在最后一次使用后将token的ID放入销毁缓存(redis、memcached)。

2:跨站请求伪造(CSRF Cross-site request forgery):由于不依赖Cookie,所以一般情况下不需要考虑CSRF。

3:跨站脚本攻击(XSS Cross Site Scripting):相比较CSRF JWT更容易收到XSS的威胁,可以考虑使用过滤器进行处理,JAVA环境下的XSS HTMLFilter和PHP环境下的TWIG。

4:防止伪造令牌:如果使用公私钥密码体系,请注意公钥也应该保密,只对可信系统开放。

二:典型微服务鉴权架构

本例固定链接: 分享到:
更多