Session Cookie Token

为什么需要Session 、Cookie 、 Token ?

早期的互联网相当于一个文件服务器,访问服务器,只是提供了文件浏览功能。每次请求都是一个 HTTP 协议请求,服务器并不知道是谁访问了互联网,后来随着电子商务,论坛等网站的发展,有了用户登录,服务器需要知道是谁登录了网站。怎么解决这个问题呢?

HTTP 是一个无状态协议,什么是无状态呢?就是说这一次请求和上一次请求是没有任何关联。这种无状态的的好处是快速,坏处是假如我们想要把www.zhihu.com/login.html和www.zhihu.com/index.html关联起来,无关联不能知晓,这次是哪个用户访问了这个网页,页面跳转了,不知道还是不是同一个用户在访问, 因此采用了一些工具和手段将网页关联起来,采用共享信息的办法,让域名下所有网页共享同一个信息,比如说共享用户登录信息。服务器就知道了是谁在访问这个网页了。

Session

Session 和 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态

Session 就是来解决网页共享数据的一种方式,Session 相当于用户的档案库,存储在服务器端,用户的登录信息存储在Session 中,服务器为每个用户分配一个Session ID ,客户端保存这个SessionID就可以了。客户端退出后,清除Session ,但是因此带来了一个问题 ,如果用户小明访问了服务器 a, 服务器 a 保存了用户的信息,此时跳转到另外一个页面,这个页面在服务器 b, 要无缝连接,客户端无感知,只能服务器 b 的 session 保存小明的信息,验证登录用户还能不能访问服务器,否则只能让小明就不能访问服务器 b,用户需要重新登录。

这也是 Session 的缺点,不容易在多台服务器之间共享。

Session 不方便服务器之间的同步,怎么办? 服务器端能不能不保存 Session,客户端保存就可以了,服务器只要验证就行了。

Cookie

Cookie 通俗点说,就是用户通过 HTTP 访问一个服务器时,这个服务器还会将一些 Key/Value 键值对返回给客户端浏览器,客户端浏览器下次访问服务器时,将Cookie 带回给服务器。服务器不存储用户的登录信息,通过验证 Cookie 信息来确认是不是保持着用户和服务器直接的交互状态。

HTTP 访问的过程

  • 首先,客户端会发送一个http请求到服务器端。
  • 服务器端接受客户端请求后,建立一个session,并发送一个http响应到客户端,这个响应头,其中就包含Set-Cookie头部。该头部包含了sessionId。Set-Cookie格式如下:
  Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
  • 在客户端发起的第二次请求,假如服务器给了set-Cookie,浏览器会自动在请求头中添加cookie
  • 服务器接收请求,分解cookie,验证信息,核对成功后返回response给客户端

Cookie 是保存在客户端的,避免了 Session 存储在服务器端带来了资源开销,也避免了服务器之间共享 Session , 但是也有缺点,使用 Cookie 来传递消息,随着 Cookie 数量的增多和访问量的增加。占用网络带宽消耗很大。但是一旦客户端被劫持,Cookie 信息泄露,就可能会出现其他用户盗用 Cookie 信息, 网站登录身份从游客变成了用户登录了,造成用户信息全部泄露。那有什么办法让 访问更加安全一些呢?

Token

Token 和 Cookie 有点类似,用户访问服务器时,服务器返回一个 Token ,用户下次访问时,将这个 Token 信息带回给服务器,这样就能完成验证了。只是和 Cookie 不一样的是,Cookie 携带的是明文信息,Token 对信息进行了处理。

用户访问服务器,服务器返回 Token ,这个Token 是用服务器的密钥进行加密的,对数据进行一个签名,秘钥只有服务器知道,别人就不能伪造 Token 信息了,用户再把 Token 信息带过来时验证就可以了。(是不是想说,用户怎么知道服务器是不是别人伪造了,这就牵扯 公钥私钥了,这里就不深入了),总之,服务器可以确认,用户的请求不是伪造的了。比Cookie 就相对安全了。

Token 访问过程

  • 用户通过用户名和密码发送请求服务器程序验证。
  • 服务器程序返回一个签名的token 给客户端。
  • 客户端储存token,并且每次用于每次发送请求。
  • 服务器验证token并返回数据。

本文分享自微信公众号 - 程序员开发者社区(gh_016ffe40d550)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏无敌码农

Java SPI机制的运行原理是什么?

SPI的全称是(Service Provider Interface)是服务提供接口的意思。如果我们不写框架性代码或者开发插件的话,对于SPI机制可能不会那么熟...

10710
来自专栏机器学习与统计学

各种分类算法的优缺点

二、对于决策树,数据的准备往往是简单或者是不必要的.其他的技术往往要求先把数据一般化,比如去掉多余的或者空白的属性。

16420
来自专栏算法与编程之美

Python应用 | 我喜欢看什么美剧(一)

《权利的游戏》、《天赋异禀》等耳熟能详的美剧,面对如此繁多的美剧,此时不禁会问自己,我喜欢看什么美剧呢?

11730
来自专栏女程序员的日常_Lin

Vue SSR

vue.js是构建客户端应用程序的框架,在默认情况下,在浏览器输出Vue组件,进行生成DOM和操作DOM。Vue SSR 就是实现将组件渲染为服务器端的HTML...

79510
来自专栏天马行空布鲁斯

关于html的input元素,property和attribute的区别

之前在项目中遇到一个很tricky的关于html的input元素的问题,个人觉得挺有意思,于是记录下来。这个问题也是在ui的自动化测试中,可能会碰到的一个问题。

16710
来自专栏开发架构二三事

vue之vue组件component整理

组件是可复用的 Vue 实例,且带有一个名字:在这个例子中是。我们可以在一个通过 new Vue 创建的 Vue 根实例中,把这个组件作为自定义元素来使用:

1K10
来自专栏程序员成长指北

作为一个前端工程师也要掌握的几种文件路径知识

之前在做webpack配置时候多次用到路径相关内容。最近在写项目的时候,有一个文件需要上传到阿里云oss的功能,同时本地服务器也需要保留一个文件备份。多次用到了...

10510
来自专栏程序员成长指北

公司要求会使用框架vue,面试题会被问及哪些?

如果你是一个已经在学习前端开发的初学者亦或者是一名在代码界纵横多年的程序员,那你一定知道现在最火的前端框架之一Vue.js。它相比于React与Angular上...

12230
来自专栏Hk_Mayfly的学习记录

《汇编语言》课程设计2

jz指令:https://zhidao.baidu.com/question/564008138.html

9720
来自专栏大话swift

golang使用实践分享之gin模版引擎使用

最近在看gin,在模版引擎这块被卡克啦----伟大的强啊。今天就来分享一下gin的模版引擎渲染。

20610

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励