cookie,session,token的区别和作用

1.cookie,session,token的出现的背景
很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记住是谁刚刚发了HTTP请求, 每个请求对我来说都是全新的。这段时间很嗨皮

但是随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等等,马上就面临一个问题,那就是要管理会话,必须记住哪些人登录系统, 哪些人往自己的购物车中放商品, 也就是说我必须把每个人区分开,这就是一个不小的挑战,因为HTTP请求是无状态的,所以想出的办法就是给大家发一个会话标识(session id), 说白了就是一个随机的字串,每个人收到的都不一样, 每次大家向我发起HTTP请求的时候,把这个字符串给一并捎过来, 这样我就能区分开谁是谁了

所以cookie,session,token在这个背景下就出现的,cookie,session,token出现就是为了解决http请求无状态和无用户认证的问题。

2.什么是session
上面我们介绍了cookie,session,token的出现的背景,那么这个时候我们就会有这个问题,这三个到底有什么作用和区别呢。这里我们先来介绍什么是session。

1)不要混淆 session 和 session 实现
这里我们要讲的就是,session 是一个抽象概念,是一种方法,并不是具体的某一个东西。很多协议中都会有Session的概念,比如PPPoE(基于以太网的点对点通讯协议)。能实现session这个概率功能的我们都把他们称为session。那么session这个概率到底是要实现什么功能呢?

开发者为了实现中断和继续等操作,将 user agent 和 server 之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。

session 是另一种记录服务器和客户端会话状态的机制
session 是基于 cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中
通俗点讲就是为了保存用户和服务之间的一种会话状态的一种概念。这个概念目前在http协议中应用较为广泛。

2)基于http介绍session概念
session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。

session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。

session 认证流程:
用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的 Session
请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器
浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名
当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。
根据以上流程可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。

3.什么是cookie
1).什么是cookie
HTTP是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。而这个状态需要通过 cookie 或者 session 去实现。
cookie 存储在客户端: cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
cookie 是不可跨域的: 每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(靠的是 domain)。
2).cookie的作用
cookie主要用于以下三个方面:
a).会话状态管理(如用户登录状态,购物车,游戏分数或其它需要记录的信息)
b).个性化设置(如用户自定义设置,主题等)
c).浏览器行为跟踪(如跟踪分析用户行为等)
3).cookie的现状
cookie曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,cookie渐渐被淘汰。由于服务器指定cookie后,浏览器每次请求都会携带cookie数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器API已经允许开发者直接将数据存储到本地,如使用Web storage API (本地存储和会话存储)或IndexdDB。

4.什么是token
Acesss Token
访问资源接口(API)时所需要的资源凭证
简单 token 的组成: uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)
特点:
服务端无状态化、可扩展性好
支持移动端设备
安全
支持跨程序调用
token 的身份验证流程:
1)客户端使用用户名跟密码请求登录
2)服务端收到请求,去验证用户名与密码
3)验证成功后,服务端会签发一个 token 并把这个 token 发送给客户端
4)客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者 localStorage 里
5)客户端每次向服务端请求资源的时候需要带着服务端签发的 token
6)服务端收到请求,然后去验证客户端请求里面带着的 token ,如果验证成功,就向客户端返回请求的数据
每一次请求都需要携带 token,需要把 token 放到 HTTP 的 Header 里
基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库
token 完全由应用管理,所以它可以避开同源策略
Refresh Token
另外一种 token——refresh token
refresh token 是专用于刷新 access token 的 token。如果没有 refresh token,也可以刷新 access token,但每次刷新都要用户输入登录用户名与密码,会很麻烦。有了 refresh token,可以减少这个麻烦,客户端直接用 refresh token 去更新 access token,无需用户进行额外的操作。

Access Token 的有效期比较短,当 Acesss Token 由于过期而失效时,使用 Refresh Token 就可以获取到新的 Token,如果 Refresh Token 也失效了,用户就只能重新登录了。
Refresh Token 及过期时间是存储在服务器的数据库中,只有在申请新的 Acesss Token 时才会验证,不会对业务接口响应时间造成影响,也不需要向 Session 一样一直保持在内存中以应对大量的请求。

5.Token和Session的区别
1)Session 是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。而 Token 是令牌,访问资源接口(API)时所需要的资源凭证。Token 使服务端无状态化,不会存储会话信息。
2)Session 和 Token 并不矛盾,作为身份认证 Token 安全性比 Session 好,因为每一个请求都有签名还能防止监听以及重放攻击,而 Session 就必须依赖链路层来保障通讯安全了。如果你需要实现有状态的会话,仍然可以增加 Session 来在服务器端保存一些状态。
3)所谓 Session 认证只是简单的把 User 信息存储到 Session 里,因为 SessionID 的不可预测性,暂且认为是安全的。而 Token ,如果指的是 OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对 App 。其目的是让某 App 有权利访问某用户的信息。这里的 Token 是唯一的。不可以转移到其它 App上,也不可以转到其它用户上。Session 只提供一种简单的认证,即只要有此 SessionID ,即认为有此 User 的全部权利。是需要严格保密的,这个数据应该只保存在站方,不应该共享给其它网站或者第三方 App。所以简单来说:如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。如果永远只是自己的网站,自己的 App,用什么就无所谓了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值