Jwt
Cookie和Session的区别和联系
Cookie的定义
Cookie是服务器在本地机器上存储的小段文本并随每一个请求发送至同一服务器。Cookies保存在客户端,主要内容包括:名字,值,过期时间,路径等等。
会话cookie和持久cookie的区别
会话cookie:不设置过期时间,只要关闭浏览器窗口cookie就消失了。会话cookie不保存在硬盘上,保存在内存里。
持久cookie:设置过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
Session定义
Session是在服务器端保存用户数据。浏览器第一次发送请求时,服务器自动生成了Session ID来唯一标识这个并将其通过响应发送到浏览器。浏览器第二次发送请求会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户的信息。一般这个Session ID会有个时间限制,默认30分钟超时后毁掉这次Session ID。
Session和Cookie有一定关系,Session id存在Cookie中,每次访问的时候将Session id传到服务器进行对比。
Cookie和Session区别:
- cookie的值由服务端生成,客户端(浏览器、易伪造、不安全)保存,存储在客户端的头信息中
- session在服务端存储(会消耗服务器资源),文件、数据库都可以。
数字签名
如果发送者A和接收者B使用不同的密钥,例如A发送消息的时候使用私钥对消息进行加密,B接收消息的时候使用公钥对消息进行解密。因为消息只能由A的私钥进行加密,所以这个签名一定是由A签发的,这样就没有否认的问题了。这个就是数字签名(digital signature)。
签名和加密作用不同,签名并不是为了保密,而是为了保证这个签名是由特定的某个人签名的,而不是被其它人伪造的签名,所以私钥的私有性就适合用在签名用途上。
私钥签名后,只能由对应的公钥解密,公钥又是公开的(很多人可持有),所以这些人拿着公钥来解密,解密成功后就能判断出是持有私钥的人做的签名,验证了身份合法性。
签名验证
签名: 私钥加密,公钥验证 —— 保证签名不被冒充
加密:公钥加密,私钥解密 —— 保证信息不被窃取
通常我们使用jwt时候采用RS256 私钥/公钥 方式进行签名的 加密/解密,因为RS256是非对称加密,比较安全。
因为jwt是由服务端生成并发放的,其中签名是由服务端的私钥加密而成的,只要保证了私钥的安全,就能保证签名是安全的。
当别人拿着jwt访问我们的服务时,可以有两种验证方式:
(1)我们服务端拿到header和payload的信息,通过header里的加密算法拿着我们自己的私钥对payload生成一个签名对比jwt传过来的签名,如果签名一致,说明payload的信息没有被修改。
(2)我们利用公钥对签名解密,解密出来的header和payload的信息是否和传过来的一致。
非对称加密
公有密钥用于上锁(加密)。
私有密钥用于解锁(解密)。
举例:Alice要给Bob传递消息(Bob)
因为Alice只需要上锁,所以她只需要公有密匙就够了。私有密匙只有Bob拥有。Alice会先通知Bob:我要告诉你一件事。然后Bob接着就会生成一把锁,并制作两种钥匙:公有密钥和私有秘钥。Bob会把公有密钥发给Alice,然后Alice会用公有密钥加密信息。Alice把上锁的密文发回来后,Bob再用自己的私有密钥解密,并得到明文。
非对称加密参考:
https://www.zhihu.com/question/304030251/answer/543201982
非对称加密参考