摘要:最近,项目的安全认证机制全面采用。为了伸缩性考虑,采用机制,必然面临着应用状态的问题,而且必然牵涉到的复制。为了安全性考虑,机制仅验证时天然对免疫。若有可能,使用标志。采用来防止这是因为,在站点上发起向站点的请求时,站点的同样会被发送给。
最近,项目的安全认证机制全面采用JWT。现在,趁整个工作基本告一段落之际,将一些知识点总结一下发布出来。
为什么要迁移?原因很简单,就以下几点:
为了迁移到微服务架构,由于服务分拆之后,单一的登录入口点消失了,采用Token是必然之选。
为了伸缩性考虑,采用Cookie + Session机制,必然面临着应用状态的问题,而且必然牵涉到session的复制。采用Token,天然避免这一点。这里并非是指完全无Session化,但起码可以降至最少。
为了移动端考虑,Token更适合移动端,比Cookie更灵活了。
为了安全性考虑,Token机制【仅验证request header时】天然对CSRF免疫。
JWT为何物?JWT由三部分组成:header + payload + signature,每部分是一个Json表示。最终的Token对这三部分进行编码之后的字符串,中间用“.”分割:
token = encodeBase64(header) + "." + encodeBase64(payload) + "." + encodeBase64(signature) # token is now: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
在应用与服务器之间传递的就是上述字符串形式的Token。
如何使用JWT?使用JWT的应用基本都遵循下面的使用流程:
访问登录点。
登录服务验证之后,签发证书返回给客户端。
客户端保存证书,并在每次请求时将其附在request header中,表示已经登录。
服务器接收请求之后,通过签名和时戳,验证Token的有效性。
若有效,则响应客户端。
对应的request header如下:
Authorization:Bearer
整个过程如下图:
在一般的应用中,验证成功之后,服务器可能会在Cookie或Session中保留一些用户相关的额外信息,简化后续的编程,同时避免反复读取数据库。
在JWT,同样可以实现这样的功能:只需将相应的内容放入payload即可。这样,下次从客户端发送的token中便可以解码得出。
验证JWT的有效性时,会考虑至少下面两点:
签名是否正确?
Token是否到期?
整个过程的编码其实并不复杂,请参见文后的链接,这里不再啰嗦。
使用中的注意事项出于安全性,注意以下几点:
签名证书需要安全存放
不要将敏感信息放置于token中
请结合SSL使用
如果要在Cookie中保存Token【此时,服务器要同时验证cookie或header中是否有token】
留意Token的大小超过Cookie的限制
请使用HttpOnly标志。若有可能,使用Secure标志。
采用Synchronize Token来防止CSRF【这是因为,在A站点上发起向B站点的请求时,B站点的Cookie同样会被发送给B。若不使用另一个Token来防护,则无法得知cookie中的JWT是否属于从A->B,还是从B->B。目前,大部分现有的框架已经支持】。
为了防止replay attack,可加上jti、exp和iat声明
以上是对JWT的旋风式说明,其他的内容,请参见参考文献。
参考文献Get Started with JSON Web Tokens
Introduction to JSON Web Tokens
维基百科上的JWT
Vert.x Web的JWT例子
Where to Store your JWTs – Cookies vs HTML5 Web Storage
Use JWT The Right Way!
Authentication: Cookies vs JWTs and why you’re doing it wrong
How to store a JWT token inside an HTTP only cookie?
Cookies vs Tokens: The Definitive Guide
管理JWT的生命周期
JWT规范
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/11225.html
摘要:通过请求和响应的交换达成通信协议中已经规定了请求是从客户端发出,最后由服务端响应这个请求并返回。随后的字符串指明了请求访问的资源对象。协议自身不对请求和响应之间的通信状态进行保存,也就是说这个级别。从前发送请求后需等待并受到响应。 showImg(https://segmentfault.com/img/bVbmDsG?w=1024&h=538); http协议用户客户端和服务器之间的...
摘要:报文用于协议交互的信息被称为报文。现在出现的各种首部字段及状态码稍后会阐述。状态码响应报文包含了多个范围的内容使用。如果服务器无法响应范围请求,则会返回状态码和完整的实体内容。 showImg(https://segmentfault.com/img/bVbthNL?w=900&h=500); http报文 用于HTTP协议交互的信息被称为HTTP报文。请求端的http报文叫做请求报文...
SSL,Secure Sockets Layer,安全Socket层TLS,Transport Layer Security,传输层安全协议 package network.secure; import java.io.*; import javax.net.ssl.*; public class HTTPSClient { public static void main(Strin...
阅读 2027·2019-08-30 15:52
阅读 2390·2019-08-29 18:37
阅读 770·2019-08-29 12:33
阅读 2812·2019-08-29 11:04
阅读 1497·2019-08-27 10:57
阅读 2066·2019-08-26 13:38
阅读 2739·2019-08-26 12:25
阅读 2409·2019-08-26 12:23