Cookie、Session、Token区分

一开始接触这三个东西,肯定会被绕的不知道都是干什么的。

1、为什么要有它们?

首先,由于HTTP协议是无状态的,所谓的无状态,其实就是 客户端每次想要与服务端通信,都必须重新与服务端连接,这就意味着,请求一次,客户端和服务端就连接一次。并且这些请求之间是没有任何关系的。

那这种情况就会造成一个问题:“我”怎么区分这些请求是不是来自于同一个人?

举个例子就是:一个用户在页面A发起了一个请求获取个人信息,然后呢,在另一个页面同样有一个请求要获取个人信息,这要如何确定这两个请求是不是同一个人发的?

为了解决这种问题,首先要解决的就是,知道发起请求的客户端是谁! 这就引出了 cookie、token、session,他们可以解决客户端标识的问题,顺便还能解决一下权限问题。

2、什么是Cookie?

Cookie,有时候也用复数形式Cookies,类型是小型文本文件。是保存在客户端或者说浏览器中的一小块数据,大小限制大致在4KB左右,在以前经常用来存储各种数据,但随着更多浏览器存储方案的出现,cookie存储数据的方式逐渐被取代,主要原因是:

  • cookie有存储大小的限制,4KB左右

  • 浏览器每次请求会携带cookie在请求头中

  • 字符编码为Unicode,不支持直接存储中文

  • 数据可以被轻易查看

cookie 主要有以下属性:

属性名称

属性含义

name

cookie 的名称

value

cookie 的值

comment

cookie 的描述信息

domain

可以访问该 cookie 的域名

expires

cookie 的过期时间,具体某一时间

maxAge

cookie 的过期时间,比如多少秒后 cookie 过期。

path

cookie 的使用路径

secure

cookie 是否使用安全协议传输,比如 SSL 等

version

cookie 使用的版本号

isHttpOnly

指定该 Cookie 无法通过 JavaScript 脚本拿到,比如 Document.cookie 属性、XMLHttpRequest 对象和 Request API 都拿不到该属性。这样就防止了该 Cookie 被脚本读到,只有浏览器发出 HTTP 请求时,才会带上该 Cookie

如何通过cookie来实现用户确定或权限确定呢?

通常的登陆操作及后续操作大致过程如下:

  1. 客户端发送请求到服务端(比如登录请求)。

  1. 服务端收到请求后生成一个 session 会话。

  1. 服务端响应客户端,并在响应头中设置 Set-Cookie。Set-Cookie 里面包含了 sessionId。其中 sessionId 就是用来标识客户端的。

  1. 客户端收到该请求后,如果服务器给了 Set-Cookie,那么下次浏览器就会在请求头中自动携带 cookie。

  1. 客户端发送其它请求,自动携带了 cookie,cookie 中携带有用户信息等。

  1. 服务端接收到请求,检测到客户端发送的cookie与其保存的cookie的值保持一致时,直接信任该连接,不再验证,比如通过 sessionId 来判断是否存在会话,存在则正常响应。

cookie 主要有以下特点:

  • cookie 存储在客户端

  • cookie 不可跨域,但是在如果设置了 domain,那么它们是可以在一级域名和二级域名之间共享的

3、什么是Session?

在上面所提到的Cookie实现用户权限确认时,提到了session,其实就是会话的意思,session主要是由服务端创建,主要作用就是保存sessionId。 而用户与服务端之间的权限确认主要就是通过sessionId

session 由服务端创建,当一个请求发送到服务端时,服务器会检索该请求里面有没有包含 sessionId 标识。
如果包含了 sessionId,则代表服务端已经和客户端创建过 session,然后就通过这个 sessionId 去查找真正的 session。
如果没找到,则为客户端创建一个新的 session,并生成一个新的 sessionId 与 session 对应,然后在响应的时候将 sessionId 给客户端,通常是存储在 cookie 中。
如果在请求中找到了真正的 session,验证通过,正常处理该请求。

总之每一个客户端与服务端连接,服务端都会为该客户端创建一个 session,并将 session 的唯一标识 sessionId 通过设置 Set-Cookie 头的方式响应给客户端,客户端将 sessionId 存到 cookie 中。

通常情况下,我们 cookie 和 session 都是结合着来用,当然你也可以单独只使用 cookie 或者单独只使用 session,这里我们就将 cookie 和 session 结合着来用。

所以,整个请求过程图,可以粗略分为这么几个过程:

  1. 发送登陆请求

  1. 创建一个session,并将session的唯一标识sessionId,设置在Set-Cookie响应头中,响应给客户端

  1. 发送其他请求并自动携带Cookie,服务端通过sessionId找到session,没找到则重新创建session

  1. Cookie验证通过,正常响应请求

4、Cookie和Session的区别?

在上文中,介绍到它们两者之间主要是通过 sessionId 关联起来的。

所以可以总结为:sessionId 是 cookie 和 session 之间的桥梁。或者可以换个说法,session 是基于 cookie 实现的,它们两个主要有以下特点:

  • session 比 cookie 更加安全,因为session是存在服务端的,cookie 是存在客户端的。

  • cookie 只支持存储字符串数据,session 可以存储任意数据

  • cookie 的有效期可以设置较长时间,session 有效期都比较短。

  • session 存储空间很大,cookie 有限制。

系统想要实现鉴权,可以单独使用 cookie,也可以单独使用 session,但是建议结合两者使用。

5、什么是Token?

既然cookie+session可以实现鉴权认证,那为什么还要有token呢?

主要是因为他们的这种认证方式存在一些缺点:

  • 增加请求体积,浪费性能,因为每次请求都会携带 cookie。

  • 增加服务端资源消耗,因为每个客户端连接进来都需要生成 session,会占用服务端资源的。

  • 容易遭受 CSRF 攻击,即跨站域请求伪造。

为了避免上述缺点,token方式的鉴权诞生

Token 通常叫令牌, 最简单的Token组成 :uid(用户唯一身份标识), time(时间戳), sign(签名),还可以把不变的参数也放进token,避免多次查库。 我们将 token 进行解密就可以拿到诸如 uid 这类的信息,然后通过 uid 来进行接下来的鉴权操作。

token 是如何生成的:

cookie 是服务端设置了 set-cookie 响应头之后,浏览器会自动保存 cookie,然后下一次发送请求的时候会自动把 cookie 携带上。而token 主要是由服务器生成,然后返回给客户端,客户端手动把 token 存下来,比如利用 localstorage 或者直接存到 cookie 当中也行。

Token 的使用流程:

A:当用户首次登录成功(注册也是一种可以适用的场景)之后, 服务器端就会生成一个 token 值,这个值,会在服务器保存token值(保存在数据库中),再将这个token值返回给客户端;

B:客户端拿到 token 值之后,进行本地保存;

C:当客户端再次发送网络请求(一般不是登录请求)的时候,就会将这个 token 值附带到参数中发送给服务器;

D:服务器接收到客户端的请求之后,会取出token值与保存在本地(数据库)中的token值做对比。

Token的身份认证逻辑:

对比一:如果两个 token 值相同, 说明用户登录成功过!当前用户处于登录状态!

对比二:如果没有这个 token 值, 则说明没有登录成功;

对比三:如果 token 值不同: 说明原来的登录信息已经失效,让用户重新登录。

总结

鉴权认证方式

特点

优点

缺点

cookie

1.存储在客户端。2.请求自动携带 cookie。

3.存储大小 4KB。

1.兼容性好,因为是比较老的技术。

2.很容易实现,因为 cookie 会自动携带和存储。

1.需要单独解决跨域携带问题,比如多台服务器如何共享 cookie。

2.会遭受 CSRF 攻击。

3.存储在客户端,不够安全

session

1.存储在服务端。2.存储大小无限制。

1.查询速度快,因为是个会话,相当于是在内存中操作。

2.结合 cookie 后很容易实现鉴权。

3.安全,因为存储在服务端。

1.耗费服务器资源,因为每个客户端都会创建 session。

2.占据存储空间,session 相当于存储了一个完整的用户信息。

token

1.体积很小。

2.自由操作存储在哪里。

1.安全,因为 token 一般只有用户 id,就算被截取了也没什么用。

2.无需消耗服务器内存资源,它相当于只存了用户 id,session 相当于存储了用户的所有信息。

3.跨域处理较为方便,比如多台服务器之间可以共用一个 token。

1.查询速度慢,因为 token 只存了用户 id,每次需要去查询数据库。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CookieSession Token 在 Web 应用中都被用来跟踪用户状态。两者的主要区别在于,Cookie 是存储在用户设备上的,而 Session Token 则是存储在服务器端的。 Cookie 是由浏览器自动创建和发送给服务器的,用户可以在浏览器的设置中查看和管理它们。Cookie 中可以存储一些键值对数据,在用户的不同请求之间共享数据。Cookie 适用于存储一些简单的数据,例如用户名和密码等。 Session Token 是在用户登录时在服务器端创建,并在用户与服务器进行交互时发送。服务器端会为每个用户维护一个唯一的 Session TokenSession Token 是在服务器端存储的,用户可以在浏览器中查看,但不能编辑或删除。Session Token 适用于存储用户身份,例如权限、购物车等。 总结,Cookie主要用来存储简单的,不太敏感的数据,且存在浏览器端;而Session token用来标识用户身份,数据都是存在服务器端。 ### 回答2: cookiesessiontoken都是现在常见的认证方式,用于保证Web应用程序的安全性和隐私性。在理解三者的区别之前,需要先了解它们的基本概念含义。 1. Cookie Cookie 是服务器发送给浏览器的小型数据文件,存储在用户的计算机中。浏览器在之后的请求中会将此文件发送到服务器,以便于验证用户的身份和记录用户的行为。 Cookie 的优点在于它可以存储比 Session 更多的信息,并且可以在浏览器关闭后仍然保持数据有效。缺点是 Cookie 可以被恶意软件或黑客轻易窃取。 2. Session Session 指的是服务器创建的一个会话过程,用于在特定时间段内记录某个用户的交互状态。通过 Session,Web应用程序可以在不同的页面之间共享数据,为用户提供个性化服务。 Session 的优点在于它存储在服务器上,保障了比 Cookie 更好的安全性和隐私性。但是, Session 也会消耗服务器的资源,因此需要谨慎管理。 3. Token Token 是一种随机生成的字符串,用于验证用户的身份和权限。在 Web 应用程序中,Token 可以被用来替代 CookieSession,因为它不会存储在用户的计算机中,也不需要服务器存储用户的状态。 Token 的优点在于它们相对更安全,因为它们没有任何销售性的信息存储在用户的浏览器中。另外, Token 机制可以支持无状态应用,也就是应用程序无需保存任何会话信息,更好的支持了分布式架构。 在以上区别基础上,三者的区别主要在于存储地点(客户端或服务器端)、存储内容(数据信息)、安全性和使用场景等。 - Cookie主要存储在客户端,并可以将更多的数据存储在客户端,Session存储于服务端提供了更好的安全性,但会占用更多服务器资源,Token能够将Session信息存储于客户端,也可以保证数据安全。 - Cookie主要用于客户端与服务端的交互;Session更注重用户身份的鉴别与用户状态的维护;Token更多地用于 API 认证。 - 一般情况下Cookie的安全性最低,Session的安全性中等,Token相对而言较为安全。 - 通常情况下,Token方式的应用程序可以跨平台、跨域和分布式部署,更加灵活多变。 综上所述,Cookiesessiontoken都是Web开发中常用的验证方式,它们在存储及应用方式上均有所差别。仔细分析自身需求,选择最适合的认证方式相比盲目跟随更为优合理。 ### 回答3: CookieSessionToken都是web应用中常见的身份认证和信息存储方式,它们之间最大的不同在于其存储的位置和方式Cookie是由服务器在浏览器中生成的,并存储在浏览器中的文件中。当浏览器向服务器发出请求时,会自动通过Cookie中的信息向服务器证明身份。Cookie在用户登录后会保存用户名、密码和一些其他信息,以便下次登录时自动填充,从而提高用户体验。 Session是一个服务器端的解决方案,它可以在服务器端存储用户的会话信息,并且在用户进行请求时将信息传输到客户端。Session的实现依赖于Cookie,服务器通过发送一个包含Session ID的Cookie,来记录用户的会话信息,服务器则将Session信息保存在服务器端的内存或者文件系统中,以确保用户信息的安全性。 Token是一种无状态的身份认证方式,它不同于CookieSession的保存信息方式,而是保存在客户端中。当用户登录时,服务器会生成一个Token并将其返回给客户端,客户端在后续的请求中会带上这个Token,服务器会通过验证Token的合法性来判断用户的身份。 总的来说,Cookie是一种简单且易用的Web身份认证方式Session需要服务器支持,可以更好的保证用户信息的安全性,Token则更适合Web接口/移动端API身份认证。不同的应用场景可以选择适合的认证方式,以确保用户信息和身份的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值