谈谈Cookie、Session、基于JWT的Token认证

41 篇文章 5 订阅
2 篇文章 0 订阅

本文通过文章和视频学习总结
转载:点击跳转至学习文章
转载:视频学习地址

一、Cookie与Session

在这里插入图片描述

1.1、Session的概念

Cookie数据保存在客户端,Session是存放在服务端的。

1.2、会话

浏览器访问服务器就是会话的开始,比较模糊的就是会话结束的时间。因为当你关掉网页,或许只是你按错了,导致会话的结束。因此不同的网站对于每个用户的会话都设定了时间以及唯一的ID。这个时间就是会话结束的时间,ID就是SessionID。

1.3、Session的概念

Session是存放在服务器的,类似于Session结构来存放用户数据,当浏览器第一次发送请求时,服务器自动生成了一个Session和一个SessionID用来唯一标识这个Session,并将其通过响应发送到浏览器。
当浏览器发送第二次请求,会将前一次服务器响应中的SessionID放在请求中一起发送到服务器上,服务器从请求中提取SessionID,和保存的所有SessionID进行对比,找到这个用户对应的Session。

1.4、服务器验证Session

(1)服务器会把用户第一次请求得到的Session信息序列化后保存起来,以后服务器通过用户请求得到的SessionID,直接和数据库中所有的SessionID进行对比,找到这个用户对应的Session。这样的好处是没了时间的限制,坏处是随着时间的增加,这个数据 库会急速膨胀,特别是访问量增加的时候。一般还是采取后一种方式,以减轻服务器压力。
(2)浏览器第一次访问服务器的时候,程序员可以将用户的一些数据以Key和Value的形式暂时存放在这个Session。以后服务器通过浏览器请求的Session中设定的数据来判断用户是否是登录状态。

下面代码截屏于视频学习中
在这里插入图片描述
测试:第一次登陆可以看到服务器生成的sessionID
在这里插入图片描述
但是第一次登陆的时候,请求的时候是没有cookie的
在这里插入图片描述
当我们再次登录,请求中就携带了cookie
在这里插入图片描述

1.5、Session的客户端实现形式(即Session ID的保存方法)

一般浏览器提供了两种方式来保存,一种是Cookie,还有一种是程序员使用html隐藏域的方式自定义实现:
(1)使用Cookie来保存,这是最常见的方法。服务器通过设置Cookie的方式将SessionID发送到浏览器。如果我们不设置这个过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个SessionID就丢失了。
如果我们设置这个时间为若干天后,那么这个Cookie会保存在客户的硬盘中,即使关闭了这个浏览器,这个值仍然存在,下次我们访问相应网站时,同样会发送到服务器上。

(2)使用URL附加信息的方式,也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIONID=*一样的。这种方式和第一种方式里面不设置Cookie过期时间是一样的。

(3) 第三种方式是在页面表单里面增加隐藏域,这种方式实际上和第二种方式一样,只不过前者通过GET方式发送数据,后者使用POST方式发送数据。但是明显后者比较麻烦。

1.6、Session和Cookie区别

(1)cookie数据保存在客户端,session数据保存在服务器端。

(2)如果web服务器端使用的是Session,那么所有的数据都保存在服务器上面,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一SessionID提交到服务器端,服务器根据当前sessionID判断相应的用户数据标志,以确定用户是否登录,或者具有某种权限。
由于数据是存储在服务器上面,所以你不能伪造,但是如果你能够获取某个登录用户的sessionID,用特殊的浏览器伪造该用户的请求也是能够成功的。sessionid是服务 器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性。

(3)如果浏览器使用的是cookie,那么所有的数据都保存在浏览器端,比如你登录以后,服务器设置了cookie用户名(username),那么当你再次请求服务器的时候,浏览器会将username一块发送给服务器,这些变量有一定的特殊标记。服务器会解释为cookie变量。所以只要不关闭浏览器,那么cookie变量便一直是有效的,所以能够保证长时间不掉线。
如果你能够截获某个用户的 cookie变量,然后伪造一个数据包发送过去,那么服务器还是认为你是合法的。所以,使用 cookie被攻击的可能性比较大。
如果设置了的有效时间,那么它会将 cookie保存在客户端的硬盘上,下次再访问该网站的时候,浏览器先检查有没有 cookie,如果有的话,就读取该 cookie,然后发送给服务器。
如果你在机器上面保存了某个论坛 cookie,有效期是一年,如果有人入侵你的机器,将你的 cookie拷走,然后放在他的浏览器的目录下面,那么他登录该网站的时候就是用你的的身份登录的。所以 cookie是可以伪造的。当然,伪造的时候需要主意,直接copy cookie文件到 cookie目录,浏览器是不认的,他有一个index.dat文件,存储了 cookie文件的建立时间,以及是否有修改,所以你必须先要有该网站的 cookie文件,并且要从保证时间上骗过浏览器。

(4)如果使用Cookie方式,一旦客户端禁用Cookie,那么Session也会失效。

(5)服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。

(6)可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。

1.7、Cookies与Session的应用场景

(1)Cookies是属于Session对象的一种。但有不同,Cookies不会占服务器资源,是存在客服端内存或者一个cookie的文本文件中;而“Session”则会占用服务器资源。

(2)Cookies的安全性能一直是倍受争议的。虽然Cookies是保存在本机上的,但是其信息的完全可见性且易于本地编辑性,往往可以引起很多的安全问题。所以Cookies到底该不该用,到底该怎样用,就有了一个需要给定的底线。

(3)使用Cookies改有个底线。这个底线一般来说,遵循以下原则:
- 不要保存私人信息。
- 任何重要数据,最好通过加密形式来保存数据(最简单的可以用URLEncode,当然也可以用完善的可逆加密方式,遗憾的是,最好不要用md5来加密)。
- 是否保存登陆信息,需有用户自行选择。
- 长于10K的数据,不要用到Cookies。
- 也不要用Cookies来玩点让客户惊喜的小游戏。

(4)“购物车”中类的处理和设计。用户可能在一段时间内在同一家网站的不同页面选择不同的商品,可以将这些信息都写入cookie,在最后付款时从cookie中提取这些信息,当然这里面有了安全和性能问题需要我们考虑了。

二、基于JWT的Token认证

JWT(JSON Web Token)

2.1、简介:
	浏览器第一次登陆服务器后,服务器会生成JWT,服务器不会保存JWT,只会保存JWT签名的密文。接着把JWT发送给浏览器,可以让浏览器以Cookie或者Storage的形式存储。
	假设以cookie的形式存储,以后浏览器每次发送请求都会把JWT发送给服务器,用户就不用重新输入账户和密码了,和session很类似,只不过Token存储在浏览器而已,

在这里插入图片描述

2.2、token组成:

在这里插入图片描述

header.payload.signature
header:header部分声明需要用什么算法来生成签名
payload:是一些特定的数据,比如有效期之类的
signature:签名信息

header和payload两部分的内容会经由Base64编码,再通过服务器保存的密码,这段密码要结合着两段编码进行算法(header声明的算法)运算,最终得到签名信息。签名信息也就是signature。这样一个完整的jwt就可以发送给客户端了。
在这里插入图片描述

2.3、编码验证

在这里插入图片描述
浏览器第一次登陆
在这里插入图片描述
浏览器再次访问服务器页面
在这里插入图片描述

总结:

Token是诞生在服务器,但是保存在浏览器这边的,由客户端指导一切,可以放在Cookie或者Storage里面。持有Token就像持有“令牌”一样可以允许访问服务器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值