文档章节

Cookie,Session和Token的故事

Mr_Qi
 Mr_Qi
发布于 04/18 13:24
字数 1717
阅读 623
收藏 8

背景

上一篇聊了一些session在分布式场景的使用分布式架构下的session

我们讲到了cookie和session的本质用途 实质上都是为了区分客户。

至于http本身设计的时候是无状态的 事实上在互联网初期也都是静态页面确实也不需要各种用户信息

随着“羊毛出在猪身上”这一广告模式的盛行 互联网模式察觉到了需要区分用户行为。不同的用户访问频度和行为

决定了用户是否是商品的潜在客户等,那么想要区别不同的用户必然要考虑如何带上用户信息。

互联网初期遇到的第一个问题就是如何解决终端用户的身份问题【毕竟访问过网页之后再次深入点击如果不能“记住“客户的状态的话那就没办法处理业务逻辑了】

也正是因为如此asp.net jsp php等动态网页技术

作为普通开发想必碰到这个问题假如让我们设计大概很容易想到一个方案

方案

普通方案

在http的无状态协议中增加url参数呗。

我们可以在比如所有的form表单里面等等隐藏一个域

或者在所有的连接中增加一个url参数比如用户名之类的参数

这样就很容易在服务端区分对应客户是谁了。

但是这样的话需要开发在前端拼接各种url 容易出错

网景方案

网景公司当时一名员工Lou Montulli,在1994年将“cookies”的概念应用于网络通信,用来解决用户网上购物的购物车历史记录,目前所有浏览器都支持cookies。

cookie翻译就是曲奇 小饼干 现在在网络中随处可见 由于浏览器的支持 很快大家都开始使用了cookie

cookie分两种 持久化cookie和会话cookie 其中会话cookie也就是session

会话cookie和持久cookie。会话cookie是一种临时cookie,用户退出浏览器,会话Cookie就会被删除了,持久cookie则会储存在硬盘里,保留时间更长,关闭浏览器,重启电脑,它依然存在,

通常是持久性的cookie会维护某一个用户周期性访问服务器的配置文件或者登录信息。

那么我们作为用开发者完全可以根据cookie来判断用户是谁了 至于cookie和session的使用区别可以看 再析Cookie&Session

下半场

互联网都喜欢用下半场这个词

有了这个cookie确实方便了许多 但是事实上cookie也是一种header

HTTP/1.1 200 OK
Server: Play! Framework;1.2.7.2;prod
Content-Type: text/html; charset=utf-8
Date: Thu, 22 Mar 2018 03:53:48 GMT
Set-Cookie: PLAY_FLASH=; Expires=Thu, 22-Mar-2018 03:53:48 GMT; Path=/
Set-Cookie: PLAY_ERRORS=; Expires=Thu, 22-Mar-2018 03:53:48 GMT; Path=/
Set-Cookie: PLAY_SESSION="100130bfbf3ec4ce9341db32d31aef4296a8057d-_st=F6%E6%99%BA%E4%BF%AE%E7%B3%BB%E7%BB%9F&stationCode=CHS201608241008&appId=wx529a05fde2f62479&accountId=1404&wxAppName=%E8%BE%BD%E5%AE%81%E6%94%BF%E5%AE%9D%E6%B1%BD%E8%BD%A6%E9%94%80%E5%94%AE&activeDate=null&stationId=1162&parentAccountId=null&_d=f6car&password=96e79218965eb72c92a549dd5a330112&isSystem=1&accountName=&flag=&account=f6car"; Path=/
Cache-Control: no-cache
Content-Length: 21844

那么如果我们不是使用浏览器呢?当然同样可以自己把cookie保留了使用

小伙伴设计了一整套方案用来控制权限 

用来给权限(或者说用户)来给服务端判断具体的身份。那么小伙伴实现的这套方案看似完全和cookie无关了,似乎也不需要session?

但是本质上是重新实现了一套cookie的逻辑【只不过浏览器会自动携带而现在需要客户端手动设置】

cookie通过浏览器自动携带传输到后端 后端服务器根据对应cookie进行验证 验证成功后才执行相关操作。

那么在移动端的情况下也是基于这种方案的话其实和用cookie几乎没有区别。

那么这个时候一个新的词出现了token,token对于我们正常可以理解成为令牌。本质上还是用来验证一个用户。

以前在浏览器端大家使用网页通常随着网页关闭之后下一次用户还是需要登录【当然可以通过cookie的记住密码功能实现重新登录】

但是当使用手机端这个就不太合适了 大量的用户登录完了之后app 都不会关闭 而如果等到第二天再重新登录想必大量的客户会流失吧。

因此归根结底就是互联网伊始发生的问题 如何鉴别用户是用户。

Token

这个时候我们把token提出来。我们考虑两种类型的token

  • RefresnToken
  • AccessToken

我们用户在首次凭借用户名和密码获取一个token 以后每次凭借该token去访问数据

乍看一下是和cookie&session的机制一样 但是这边的token我们可以一种新颖的格式来处理

比如JWT

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

JWT.IO allows you to decode, verify and generate JWT.

我们将用户的id等放入jwttoken中我们称之为自描述===》即jwt可以证明用户是谁 而传统的session机制是凭借sessionId到服务端换取凭证信息

传统的session机制还有一个问题 就是当一个用户一直访问服务的时候session的过期时间一直在延长【譬如session过期时长为6小时意味着当用户关闭浏览器而不是显示点击退出之后session还可以存活6个小时】

而jwt在设置时我们就将时间固定下来 比如3个小时过期那么三个小时之后无论用户是否访问该token都会过期 这样用户必须要重新登录【这样也防止出现一些黑客手段劫持了一个token持续利用该token做一些事情】

重新登录我们可以考虑上文提到的refresntoken

将refreshToken的有效时长设置较长 比如30天

当用户凭借有效身份证明获取授权时同时获得的有两个token 有效期较长的refreshToken和时间较短的accessToken

访问任意服务凭借accessToken 但是accessToken过期了之后凭借RefreshToken去刷新新的accessToken 而这样对于用户来说其实也没有登录的逻辑出现

当这样设置了之后整个系统可以认为几乎是一个无状态的服务【用户凭借accessToken来描述自身的身份】

© 著作权归作者所有

共有 人打赏支持
上一篇: session攻击
Mr_Qi

Mr_Qi

粉丝 280
博文 359
码字总数 369228
作品 0
南京
程序员
私信 提问
权限认证 cookie VS token

权限认证 cookie VS token 我前公司的应用都是 token 授权的,现公司都是维护一个 session 确认登录状态的。那么我在这掰扯掰扯这两种权限认证的方方面面。 工作流程 先说 cookie cookie 登录...

晴天_雨天
02/28
0
0
Session hijacking attack

The Session Hijacking attack consists of the exploitation of the web session control mechanism, which is normally managed for a session token. Because http communication uses ma......

Oscarfff
2016/07/20
9
0
web安全---Token

Token,就是令牌,最大的特点就是随机性,不可预测。一般黑客或软件无法猜测出来。 那么,Token有什么作用?又是什么原理呢? Token一般用在两个地方: 1)防止表单重复提交、 2)anti csrf攻击...

goldfishe
2017/03/20
0
0
session、cookie、token

一、session session的中文翻译是“会话”,当用户打开某个web应用时,便与web服务器产生一次session。服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。...

满头大汉
2015/09/15
5.8K
0
彻底理解cookie,session,token

发展史 很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我...

踏破铁鞋无觅处
09/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

[LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

描述 设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。 如何反序列化或序列化二叉树是没有限制的,你...

honeymose
54分钟前
5
0
java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
23
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
18
0
my.ini

1

architect刘源源
今天
16
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部