关于JWT与cookie和token的区别说明
一. cookie
a)cookie如何认证
1.用户输入用户名与密码,发送给服务器。
2.服务器验证用户名和密码,正确的就创建一个会话(session),同时会把这个会话的id保存到客户端浏览器中,因为保存的地方是浏览器的cookie,所以这种认证方式叫做基于cookie的认证方式。
3.后续的请求中,浏览器会发送会话id到服务器,服务器上如果能找到对应的id的会话,那么服务器就会返回需要的数据给浏览器。
4.当用户退出登录,会话会同时在客户端和服务器端被销毁。
b)cookie认证方式的不足之处
1.服务器要为每个用户保留session信息,连接用户过多会造成服务器内存压力过大。
2.适合单一域名,不适合第三方请求。
二. token
a)token的认证过程
1.用户输入用户名和密码,发送给服务器。
2.服务器验证用户名和密码,正确的话就返回一个签名过的token(token 可以认为就是个长长的字符串),浏览器客户端拿到这个token。
3.后续每次请求中,浏览器会把token作为http header发送给服务器,服务器验证签名是否有效,如果有效那么认证就成功,可以返回客户端需要的数据。
4.一旦用户退出登录,只需要客户端销毁token即可,服务器端不需要任何操作。
b)token认证方式的特点
这种方式的特点就是客户端的token中自己保留有大量信息,服务器没有存储这些信息,而只负责验证,不必进行数据库查询,执行效率大大提高。
三. jwt
a)jwt介绍
1.jwt是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
2.优点是在分布式系统中,很好地解决了单点登录问题,很容易解决了session共享的问题。jwt长度较小,且可以使用url传输(urlsafe)。不想cookies只能在web环境起作用。 jwt可以同时使用在web环境和restfull的接口。
缺点是无法作废已颁布的令牌/不易应对数据过期。
b)jwt组成
jwt包含三个部分: header头部,payload负载和signature签名。由三部分生成token,三部分之间用“.”号做分割。
列如 :
eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9.eyjzdwiioiixmjm0nty3odkwiiwibmftzsi6ikpvag4grg9liiwiawf0ijoxnte2mjm5mdiyfq.sflkxwrjsmekkf2qt4fwpmejf36pok6yjv_adqssw5c
1.header
在header中通常包含了两部分:type:代表token的类型,这里使用的是jwt类型。 alg:使用的hash算法,例如hmac sha256或rsa.
{ “alg”: “hs256”, “typ”: “jwt” }
这会被经过base64url编码形成第一部分
2.payload
token的第二个部分是荷载信息,它包含一些声明claim(实体的描述,通常是一个user信息,还包括一些其他的元数据)
声明分三类:
1)reserved claims,这是一套预定义的声明,并不是必须的,这是一套易于使用、操作性强的声明。包括:iss(issuer)、exp(expirationtime)、sub(subject)、aud(audience)等
2)plubic claims,
3)private claims,交换信息的双方自定义的声明
{ “sub”: “1234567890”, “name”: “john doe”, “admin”: true }
同样经过base64url编码后形成第二部分
3.signature
使用header中指定的算法将编码后的header、编码后的payload、一个secret进行加密。
例如使用的是hmac sha256算法,大致流程类似于: hmacsha256( base64urlencode(header) + “.” + base64urlencode(payload), secret)
这个signature字段被用来确认jwt信息的发送者是谁,并保证信息没有被修改
c)为什么要使用jwt
相比xml格式,json更加简洁,编码之后更小,这使得jwt比saml更加简洁,更加适合在html和http环境中传递。
在安全性方面,swt只能够使用hmac算法和共享的对称秘钥进行签名,而jwt和saml
token则可以使用x.509认证的公私秘钥对进行签名。与简单的json相比,xml和xml数字签名会引入复杂的安全漏洞。
因为json可以直接映射为对象,在大多数编程语言中都提供了json解析器,而xml则没有这么自然的文档-对象映射关系,这就使得使用jwt比saml更方便
java json web token工具类
d)jwt的maven引入
<dependency> <groupid>io.jsonwebtoken</groupid> <artifactid>jjwt</artifactid> <version>0.9.0</version> </dependency>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
推荐阅读
-
关于执行作用域和定义作用域的区别与联系
-
关于JWT与cookie和token的区别说明
-
基于params、@PathVariabl和@RequestParam的用法与区别说明
-
关于@JSONField和@JsonFormat的使用区别说明
-
关于C# 中的布尔运算符 "&" "|” 与 其类似的条件布尔运算符 "&&" "||" 区别说明。
-
ASP.NET MVC传递Model到视图的多种方式总结(二)__关于ViewBag、ViewData和TempData的实现机制与区别
-
关于python类中super()和__init__()的区别说明
-
cookie和session机制之间的区别与联系
-
JAVA类与对象(实例变量与类变量的区别)(实例方法和类方法的区别 )说明
-
关于绝对定位与相对定位的区别和用法