赏金任务每周更新,请持续关注哦
题目
- 模拟面试场景,面试官提问以下问题,你如何回答。
- cookie,session与token区别?
参与方式
- 本帖下方回复你的答案即可
赏金
- 100元京东购物卡
活动时间
- 2023年2月27日 - 2023年3月5日
本周赏金任务汇总:🌈 赏金任务发布 2023-02-27
本问题参与赏金活动,详情点击 赏金活动上线啦 丨做赏金任务挑战千元奖金 查看活动介绍
赏金任务每周更新,请持续关注哦
本周赏金任务汇总:🌈 赏金任务发布 2023-02-27
本问题参与赏金活动,详情点击 赏金活动上线啦 丨做赏金任务挑战千元奖金 查看活动介绍
1.首先,三者的目的是大体相同的,都是为了系统的认证和鉴权的来使用的。
2.它们三者之间的特点、优点和缺点如下图所示
鉴权认证方式 | 特点 | 优点 | 缺点 |
---|---|---|---|
cookie | 1.存储在客户端。2.请求自动携带 cookie。3.存储大小 4KB。 | 1.兼容性好,因为是比较老的技术。2.很容易实现,因为 cookie 会自动携带和存储。 | 1.需要单独解决跨域携带问题,比如多台服务器如何共享 cookie。2.容易遭受 CSRF 攻击。3.存储在客户端浏览器中,不够安全。4.不能跨浏览器。5.不支持中文 |
session | 1.存储在服务端。2.存储大小无限制。 | 1.查询速度快,因为是个会话,相当于是在内存中操作。2.session是依赖于cookie的,结合 cookie 后很容易实现鉴权。3.较cookie安全,因为存储在服务端。 | 1.耗费服务器资源,因为每个客户端都会创建 session。2.占据存储空间,session 相当于存储了一个完整的用户信息。3.默认机制下是不适合分布式部署。4.访问量特别大的网站,尽量不要在session中存储用户数据 |
token | 1.体积很小。2.自由操作存储在哪里。 | 1.最安全,因为 token 一般只有用户 id,就算被截取了也没什么用。2.无需消耗服务器内存资源,它相当于只存了用户 id,session 相当于存储了用户的所有信息。3.很方便,跨域处理较为方便,比如多台服务器之间可以共用一个 token。 | 1.查询速度慢,因为 token 只存了用户 id,每次需要去查询数据库。 |
下面是cookie、session和token的区别:
Cookie | Session | Token | |
---|---|---|---|
存储位置 | 客户端存储 | 服务器端存储 | 客户端或服务器端存储 |
数据存储形式 | 键值对形式存储 | 键值对形式存储 | 字符串或其他形式 |
数据大小 | 有限制 | 无限制 | 一般无限制 |
跨域请求是否支持 | 受浏览器同源策略限制,需要额外设置 | 可以支持跨域请求,需要通过Cookie实现 | 可以支持跨域请求,需要额外设置或使用JWT |
是否安全可靠 | 可能被窃取或篡改,安全性较差 | 相对较安全可靠,但需要注意会话劫持等问题 | 相对较安全可靠,但需要注意令牌泄露等问题 |
作用 | Cookie一般用于实现用户登录、记住密码等功能 | Session一般用于存储用户登录信息、购物车信息等 | Session一般用于存储用户登录信息、购物车信息等 |
例子 | 例如登录状态、用户偏好设置等。当用户访问同一个网站时,浏览器会自动发送该网站对应的Cookie信息。Cookie一般用于实现用户登录、记住密码等功能 | 当用户访问一个网站时,服务器会创建一个Session,并将Session ID发送给浏览器,浏览器将该Session ID保存在Cookie中。当用户进行操作时,浏览器会将该Session ID发送给服务器,服务器根据该Session ID获取对应的Session数据。Session一般用于存储用户登录信息、购物车信息等。 | 当用户进行登录操作时,服务器生成一个Token,并将Token发送给客户端,客户端将该Token保存在本地。当用户进行其他操作时,客户端会将Token发送给服务器,服务器验证Token的有效性,并根据Token获取对应的用户信息。 |
session:
在服务器端记录,每一个会话会产生一个sessionId。当用户打开某个web应用时,便与web服务器产生一次session。服务器使用 sessionId 把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这样服务器就会根据每个人sessionId的不同,区别开谁是谁了,从而返回给用户不同的请求结果。
缺点:
如果使用单个服务器的话,用户过多的话,会造成服务器开销太大。如果我们系统采用分布式的话,我们登录时,响应我们的那台机器会记录我们登录信息,万一下一个请求,响应我们的不是原来那台机器的话,它并没有存储我们之前会话信息,就会认为我们并没有登录。session粘连或者session复制都不是特别好的方案。
cookie
cookie是服务端保存在客户端的临时的少量的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。但是,cookie 这种方式很容易被恶意攻击者入侵,那么又怎么验证客户端发给我的session id 的确是我生成的呢? 如果不去验证,服务器都不知道他们是不是合法登录的用户, 那些不怀好意的家伙们就可以伪造session id , 为所欲为了。
token
token的定义:Token是服务端生成的一串字符串,当作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token并将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
session的原理
(1)服务器在处理客户端请求过程中会创建session,并且为该session生存唯一的session ID。(这个session ID在随后的请求中会被用来重新获得已经创建的session。在session被创建后,就可以调用session相关的方法向session中新增内容,这些内容只会保存在服务器中)
(2)服务器将session ID发送到客户端
(3)当客户端再次请求时,就会带上这个session ID
(4)服务器接收到请求之后就会一句Session ID 找到相应的Session ,完成请求
ps
1、虽然session保存在服务器,但它还是需要客户端浏览器的支持,因为session需要使用cookie作为识别标志。服务器会向客户端发送一个名为JSEDDIONID的cookie,它的值为session ID。
2、当cookie被禁用时,可以使用url重写的方法:将session写在URL中,服务器在进行解析。
cookie的生命周期
cookoe的生存时间是整个会话期间:浏览器会将cookie保存在内存中,浏览器关闭时自动删除这个cookie。
cookie的生存时间是长久有效的:手动将cookie报存在客户端的硬盘中,浏览器关闭的话,cookie页不会清除;下次在打开浏览器访问对应网站内容,这个cookie就会自动再次发送到服务器。
token认证流程
token 的认证流程与cookie很相似
用户登录,成功后服务器返回Token给客户端。
客户端收到数据后保存在客户端
客户端再次访问服务器,将token放入headers中
服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码
token和session对比选型
Token是什么?和session、cookie相比,使用场景有什么区别?
传统的应用是将Session放在应用服务器上,而将生成的JSESSIONID放在用户浏览器的Cookie中,而这种模式在前后端分离中就会出现以下问题
1,开发繁琐。
2,安全性和客户体验差
3,有些前端技术不支持Cookie,如微信小程序
这种情况下,前后端之间使用Token(令牌)进行通信就完美的解决上面的问题。
与session验证项目token的优点:
支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输。
无状态(也称:服务端可扩展行):Token机制在服务端不需要存储session信息,因为Token 自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信息.
去耦: 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在你的API被调用的时候,你可以进行Token生成调用即可。
适用接口跨平台: 当你的客户端是一个原生平台(iOS, Android,Windows 8等)时,Cookie是不被支持的(你需要通过Cookie容器进行处理),这时采用Token认证机制就会简单得多。
CSRF:因为不再依赖于Cookie,所以你就不需要考虑对CSRF(跨站请求伪造)的防范。
基于标准化:你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在多个后端库(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Firebase,Google, Microsoft)
Cookie是存储在客户端的一段小文本文件,用于存储信息;
Session是服务器端存储的一段状态数据,用于存储信息;
Token是一段加密的数据,用于验证客户端的身份。
Cookie、Session和Token都是用来做持久化处理的,目的就是让客户端和服务端互相认识。HTTP请求默认是不持久的,没有状态的,谁也不认识谁的。
1、Cookie
Cookie是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。
Cookie由服务器生成,通过响应头Set-Cookie字段发送给浏览器,浏览器把Cookie以key value形式保存到某个目录下的文本文件里,下一次请求同一网站时会把该Cookie发送给服务器。由于Cookie是存在客户端上的,所以浏览器加入了一些限制确保Cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的Cookie数量是有限的。
2、Session
Session从字面上讲,就是会话。服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,默认采用Cookie的方式。
服务器使用Session把用户的信息临时保存在了服务器上,用户离开网站后Session会被销毁。这种用户信息存储方式相对Cookie来说更安全,可是Session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候Session会丢失。
3、Token
Token意思是“令牌”,用户身份的验证方式,有点类似于Cookie,相对来说更安全。
比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;Cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用Cookie自动登录用户名;Session和Cookie差不多,只是Session是写在服务器端的文件,也需要在客户端写入Cookie文件,但是文件里是你的浏览器编号。Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。
最简单的Token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由Token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接Token请求服务器)。还可以把不变的参数也放进Token,避免多次查库。
Token特点:
1、无状态、可扩展;
2、支持移动设备;
3、跨程序调用;
4、安全。
一般流程:
1、客户端向服务端申请Token;
2、服务端收到请求,会去验证用户信息,签发一个Token给客户端,服务端自己也会保存 Token;
3、客户端收到服务端签发的Token会保存起来,每次请求带上Token;
4、服务器收到其他请求,会去验证客户端的Token,如果成功则返回数据,不成功做其他处理。
cookie:浏览器接受服务器的Set-Cookie指令,并把cookie保存到电脑上,每个网站保存的cookie只作用于自己的网站
session:数据存储到服务端,只把关联数据的一个加密串放到cookie中标记
token:是一个用户请求时附带的请求字段,用于验证身份与权限
session 是空间换时间,token 是时间换空间。session 是基于 cookie 实现的
session 比 cookie 更加安全,因为它是存在服务端的,cookie 是存在客户端的。
cookie 只支持存储字符串数据,session 可以存储任意数据。
cookie 的有效期可以设置较长时间,session 有效期都比较短。
session 存储空间很大,cookie 有限制。
完成的很不错,从多个层次说明了这三种鉴权方式各自的特点,以及应用场景。
完成的也非常不错,相对较而言,如果再多描述一下使用场景,会更好。
再接再励哈~