谈谈cookie、session、token的区别

文章探讨了session和cookie的区别,以及token在用户验证、防止重复提交、安全性、可扩展性和跨域方面的优势。强调了token作为无状态凭证在现代Web开发中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录​​​​​​​

一、区分session和session的实现方式

二、 cookie和session使用的场景

三、关闭浏览器,session和cookie会被销毁吗

四、token的作用

1.用于用户身份的验证

2.防止表单重复提交

五、token较session的优势

1.占用空间

2.无状态

3.安全性

4.可扩展性

5.多平台跨域

六、总结


一、区分session和session的实现方式

本来 session 是一个抽象概念,开发者为了实现中断和继续等一系列操作,将 user agent (客户端)和 server(服务端) 之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。

而 cookie 是一个实际存在的东西,存放于客户端,http 协议中定义在 header 中的字段。可以认为是 session 的一种后端无状态实现。

而我们今天常说的 “session”,通常是指session的实现方式,是为了绕开 cookie 的各种限制,通常借助 cookie 本身和服务端存储(默认是文件,数据库和内存也可以)实现的,是一种更高级的会话状态实现。该session实现方式是把session存放于服务端,再把session id保存在cookie中。

二、 cookie和session使用的场景

一般是用户验证的场景,如用户登录状态的维持,用户在某个Web网站登录后,关闭网页后,再打开相同的网页不用重新进行登录


三、关闭浏览器,session和cookie会被销毁吗

关闭浏览器,再打开浏览器,再访问之前的Web网站,一次新的会话就开始了

而cookie的两种存放方式:一种是存在于浏览器的进程中,一种是存在于硬盘上 我们知道session存放在服务端,而当我们关闭浏览器时,cookie若是存在于浏览器的进程中(这种cookie称为会话cookie),该会话cookie立马被销毁

而此时服务器不知道客户端浏览器关闭了还是没有关闭,所以原先的session不会立马被销毁,通常是到了默认的时间才会被销毁。

新的会话开始后,服务器从HttpServletRequest对象(服务器是用Java开发有该对象)中没有检查到session id,服务器会再发送一个新的存有session id的cookie到客户端的浏览器中,此时对应的是一个新的会话

对于相同和不同session(会话)的分类 当在同一个浏览器中同时打开多个标签,发送同一个请求或不同的请求,仍是同一个session 当不同windows窗口中打开相同浏览器时,发送请求,仍是同一个session 当使用不同浏览器时,发送请求,即使发送相同的请求,是不同的session 当把当前某个浏览器的窗口全关闭,再打开,发起相同的请求时,就是本文所阐述的,是不同的session,但是它和session的生命周期(session何时被销毁)是没有关系的。

总结:关闭浏览器再打开某个web应用网站,对应于新的会话,session通常到默认时间才会被销毁,而存放于浏览器进程的cookie会立马销毁。维持一个会话的核心就是客户端的唯一标识,即 session id。

四、token的作用

先了解一下token是什么,token就是服务端生成的一串字符串,生成后返回给客户端,客户端下次请求时会直接在http header字段或者cookie中(注:客户端请求时cookie也是位于http header中)携带token。


token主要有两方面的作用:

1.用于用户身份的验证

先看第一种用法,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

那么token里面的内容是什么呢?token里面可以存放设备的MAC地址,这种情况下,缺点需要在服务器在数据库存储token,优点是用户登录一次后无需再次登录。 也可以存放session id,如果token里面是session id,为了防止伪造token,服务器可以用只有自己知道的密钥和签名算法hmac-sha256做一个签名,加在session id 后面,这样token=session id+ 签名,构造好token发给客户端,客户端发请求时携带该token,服务端收到客户端发来的token后,再用相同的密钥和签名算法对token中的session id做一次签名,验证该token后的签名和自己做的签名是否一致即可。对于token还有许多种验证方法,也有很多标准,其中一套标准,叫做JWT。这种情况服务端无需存放token,但是会话结束或者超时后,需要重新登录才能访问数据。

2.防止表单重复提交

这种token的使用场景,需要与session进行配合 防止表单重复提交一般还是使用前后端都限制的方式,比如:在前端点击提交之后,将按钮置为灰色,不可再次点击,然后客户端和服务端的token各自独立存储,客户端存储在Cookie或者Form的隐藏域,放在Form隐藏域中的时候,需要放在每个表单中,服务端存储在Session(单机系统中可以使用)或者其他缓存系统(分布式系统可以使用)中。

具体的流程如下: 客户端初始化的时候,一般就是刚刚进入表单页面页面的时候就调用后端代码,后端代码生成一个token并将该token写入session中,然后将该token返回给客户端,客户端储存token(可以在前台使用Form表单中使用隐藏域来存储这个Token,也可以使用cookie),当客户端提交表单时,就将request(请求)中的token与(session)中的token进行比较,如果一致就把token写入到数据库中(应用于表单更新的场景,方便查询),若表单只需提交一次,则在验证通过后,把session中token进行删除,这时如果有重复的请求到来,需要判断如果用户提交的表单数据中没有token或者session会话没有token,或者存储在session中的token(令牌)与表单提交的token(令牌)不同,则用户是重复提交了表单。由于表单已经成功提交了一次,session中的token已经被删除,所以一定会提示用户重复提交。

五、token较session的优势

1.占用空间

token和session都可以用于用户验证场景,但是session必须要存放于服务端,而token可以不用存放在服务端。

2.无状态

并且客户端存放token是无状态。基于无状态和不存储session,负载均衡器能将用户信息从一个服务器传到其他服务器上

而如果将已经验证的用户信息保存在session中,则每次请求都需要向已经验证的服务器发送验证消息,用户量大会发送拥堵

3.安全性

请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。

即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。

token是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效。

4.可扩展性

Tokens能够创建与其它程序共享权限的程序。 例如,能将一个随便的社交帐号和自己的大号(Fackbook或是Twitter)联系起来。

当通过服务登录Twitter(我们将这个过程Buffer)时,我们可以将这些Buffer附到Twitter的数据流上(we are allowing Buffer to post to our Twitter stream)。

使用tokens时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,我们可以通过建立自己的API,得出特殊权限的tokens。

5.多平台跨域

我们提前先来谈论一下CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。

Having our API just serve data, we can also make the design choice to serve assets from a CDN. This eliminates the issues that CORS brings up after we set a quick header configuration for our application.

只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。

六、总结

Session 是一种能力:是服务器见鬼说鬼话,见人说人话的能力。
Token 是一个字符串凭证:和你的各种证件一样功能的凭证,JWT 恰好是其中一种格式。
Cookie 是一种载体,装载着你的个人物品,是浏览器中的一个存储技术:历史很久了,不用这个也可以。

以上连起来就是,你从自己的小钱包(Cookie) 里掏出了身份证(Token),递给了窗口(服务器)里面,从而达成了一种Session 能力。

### 回答1: Cookie Session 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身份认证。不同的应用场景可以选择适合的认证方式,以确保用户信息身份的安全性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值