为什么使用JWT不用session?
基于session认证的缺点:
1.session是存储在服务器端的内存,每次经过一次认证之后,都要在服务端做一次记录,以方便用户下次请求的鉴别,如果认证用户增加,服务器的开销会很大。
2.用户认证以后,服务端做认证记录,下次请求必须要在这台这台服务器上请求,才能拿到授权资源,这样在分布式的应用中,相应的限制了负载均衡器的能力,也就限制了应用的扩展能力。
3.CSRF因为基于cookie来进行用户识别的,cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
JWT是什么?
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
JWT的构成
第一部分我们称它为头部(header),
承载两部分信息:
声明类型:jwt
声明加密算法:通常为HMAC SHA256
第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),
有效信息包含两部分:
标准中的注册声明
公共的声明
私有的声明
第三部分是签证(signature).
这个签证信息有三部分:
header(base64后的)
payload(base64后的)
secret
JWT的优点
由于json的通用性,所以JWT是可以跨语言支持的
因为有payload部分,所以JWT可以在自身存储一些其他的业务逻辑必要的非敏感信息便于传输,jwt的构成非常简单,字节占用很小,所以它非常便于传输的。
不需要再服务端保存会话信息,所以它易于应用的扩展
JWT是用来做什么的?
JWT是用来做身份认证的。
流程上是这样的:
- 用户使用用户名密码来请求服务器
- 服务器进行验证用户的信息
- 服务器通过验证发送给用户一个token
- 客户端存储token,并在每次请求时附送上这个token值
- 服务端验证token值,并返回数据
这个token必须在每次请求时传递给服务端,他应该保存在请求头里
服务端要支持CORS(跨来源资源共享)策略