https://www.jianshu.com/p/e1121d4d7084

引言

由于 HTTP 协议是无状态的,完成操作关闭浏览器后,客户端和服务端的连接就断开了,所以我们必须要有一种机制来保证客户端和服务端之间会话的连续性,也称为认证,最常见的应用场景就是保持用户的登录态。

最基本的认证方式,就是使用 Sesson-Cookie。

30s 图解 Sesson-Cookie 认证

以保持用户登录态为例,Sesson-Cookie 认证的具体步骤如下:

 

1)客户端(浏览器): 向服务器发送登录信息(用户名和密码)来请求登录校验;

2)服务端: 验证登录信息,验证通过后服务器(比如 Tomcat)会自动为此次请求开辟一块内存空间(一个 Session 对象),可以手动将用户信息(比如登录保持时间是否过期)存在 Session 对象中。然后,服务器会自动为这个 Sesson 对象生成一个唯一的标识 sessionID ,并在 HTTP 响应头(Header)的 Set-Cookie:JSESSIONID=XXXXXXX 中设置这个 seesionID。

所以说,Session 的实现是依赖于 Cookie 的

3)客户端: 收到服务端的响应后会解析响应头,从而根据 set-Cookie 将 sessonId 保存在本地 Cookie 中,这样,客户端(浏览器)在下次 HTTP 请求时请求头会自动附上该域名下的 Cookie 信息;

4)服务端: 接收客户端请求时会去解析请求头 Cookie 中的 sessonId,然后根据这个 sessonId 去找 Sesson 对象,从而获取到用户信息;

可以通过拦截器在每次请求前尝试获取 Sesson 对象:Session 存活期间,我们认为客户端一直处于活跃状态(用户处于登录态),一旦 Session 超期过时,那么就可以认为客户端已经停止和服务器进行交互了(用户退出登录)。

如果遇到禁用 Cookie 的情况,一般的做法就是把这个 sessionID 放到 URL 参数中。这也是经常在面试中会被问到的问题。

可能会有同学问为啥不直接把数据全部存在 Cookie 中,还整个 Session 出来然后把 sessionID 存在 Cookie 中的?

  1. Cookie 长度的限制:首先,最基本的,Cookie 是有长度限制的,这限制了它能存储的数据的长度
  2. 性能影响:Cookie 确实和 Session 一样可以让服务端程序跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些 Cookie,那如果 Cookie 中存储的数据比较多的话,这无疑增加了客户端与服务端之间的数据传输量,增加了服务器的压力。
  3. 安全性:Session 数据其实是属于服务端的数据,而 Cookie 属于客户端,把本应在 Session 中存储的数据放到客户端 Cookie,使得服务端数据延伸到了外部网络及客户端,显然是存在安全性上的问题的。当然我们可以对这些数据做加密,不过从技术来讲物理上不接触才是最安全的。

附加阅读

Sesson-Cookie 认证伪代码

登录:

 

拦截器:每次请求前去找 Sesson 对象,从而获取到用户信息

 

可以看出来,在一次会话当中,两个请求获取到的 Session 对象实际上是同一个对象。

上面已经提到,服务器是根据 cookie 中的 sessionID 来找到 Session 对象的,但以上代码中我们只是手动将用户数据设置到了 Session 中,并没有出现任何关于 Cookie 的代码(将 SessionId 设置到 Cookie 中)

很明显,这些肯定都是服务器(比如 Tomcat)自动完成的了。在第一次获取 Session 即调用 request.getSession() 的时候,服务器会自动创建一个 Session 对象(Session 是一个集合,并且是一个 Map 集合),并且存入服务器的 Session 集合中以 SessionId 为标识键,也就是说根据 SessionId 即可取到对应 Session 的引用。同时也会创建一个键名为 JSESSIONID 的 Cookie 并且返回给浏览器,该 Cookie 的值即为 SessionId。

这个存储着 SessionId 的 Cookie 会跟着请求上传到服务器,所以说,在同一会话当中,不管哪个请求拿到的都是同一个 Session 对象。

Sesson-Cookie 认证的缺点与解决方案

这种机制在单体应用时代应用非常广泛,但是,随着分布式时代的到来,Session 的缺点也逐渐暴露出来。

举个例子,比如我们有多个服务器,客户端 1 向服务器发送了一个请求,由于负载均衡的存在,该请求被转发给了服务器 A,于是服务器 A 创建并存储了这个 Session

 

紧接着,客户端 1 又向服务器发送了一个请求,但是这一次请求被负载均衡给了服务器 B,而服务器 B 这时候是没有存储服务器 A 的 Session 的,这就导致 Session 的失效。

 

明明用户在上一个界面还是登录的,跳到下一个界面就退出登录了,这显然不合理。

当然了,对此的解决方法其实也有很多种,其实就是如何解决 Session 在多个服务器之间的共享问题:

  1. Sesson Replication
  2. Sesson Sticky
  3. Sesson 数据集中存储

Session Replication

这个是最容易想到的,既然服务器 B 没有服务器 A 存储的 Session,那各个服务器之间同步一下 Session 数据不就完了。

 

这种方案存在的问题也是显而易见的:

  1. 同步 Session 数据带来了额外的网络带宽开销。只要 Session 数据有变化,就需要将数据同步到所有其他机器上,机器越多,同步带来的网络带宽开销就越大。

  2. 每台Web服务器都要保存所有 Session 数据,如果整个集群的 Session 数据很多(比如很多人同时访问网站的情况),每台服务器用于保存 Session 数据的内存占用会非常严重。

Session Sticky

从名称也能看出来,Sticky,即让负载均衡器能够根据每次的请求的会话标识来进行请求的转发,保证一个会话中的每次请求都能落到同一台服务器上面。

 

存在问题的:

  1. 如果某台服务器宕机或者重启了,那么它上面存储的 Session 数据就丢失了,用户就需要重新进行登陆。

  2. 负载均衡器变为一个有状态的节点,因为他需要保存 Session 到具体服务器的映射,和之前无状态的节点相比,内存消耗会更大,容灾方面会更麻烦。

Session 数据集中存储

将每个服务器的 Session 数据都集中存到外部介质比如 Redis 或者 MySQL 中去,然后所有的服务器都从这个外部介质中拿 Session 就行了

 

存在的问题也很显然:

  • 过度依赖外部存储,如果集中存储 Session 的外部存储机器出问题了,就会直接影响到我们的应用

[转帖]如何用 30s 给面试官讲清楚什么是 Session-Cookie 认证的更多相关文章

  1. 如何用 30s 给面试官讲清楚什么是 Session-Cookie 认证

    引言 由于 HTTP 协议是无状态的,完成操作关闭浏览器后,客户端和服务端的连接就断开了,所以我们必须要有一种机制来保证客户端和服务端之间会话的连续性,也称为认证,最常见的应用场景就是保持用户的登录态 ...

  2. 如何用 30s 给面试官讲清楚什么是 Token

    引言 前文介绍了 Session-Cookie 的认证过程,简单回顾下基本步骤: 客户端(浏览器)向服务器发送用户名和密码 服务器验证通过后,创建 Session 对象,在 Session 中保存该用 ...

  3. 如何用 30s 给面试官讲清楚什么是 Token?

    引言 前文介绍了 Session-Cookie 的认证过程,简单回顾下基本步骤: 客户端(浏览器)向服务器发送用户名和密码 服务器验证通过后,创建 Session 对象,在 Session 中保存该用 ...

  4. 如何用 30s 给面试官讲清楚跳表

    查找 假设有如下这样一个有序链表: 想要查找 24.43.59,按照顺序遍历,分别需要比较的次数为 2.4.6 目前查找的时间复杂度是 O(N),如何提高查找效率? 很容易想到二分查找,将查找的时间复 ...

  5. 我是如何用 ThreadLocal 虐面试官的?

    我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. Thr ...

  6. [转帖]《吊打面试官》系列-Redis基础

    <吊打面试官>系列-Redis基础 https://www.cnblogs.com/aobing/archive/2019/11/07/11811194.html   你知道的越多,你不知 ...

  7. 如何用json 与jsonp 的区别去回答你的面试官?

    常常 有面试官这样问我们,虽然用过无数次,但是回答不上岂不是尴尬,那我们浅析一下它们的区别? 1. json JSON是一种基于文本的数据交换格式,用于描述复杂的数据,举个例子: var nax=[ ...

  8. iOS开发,这样写简历才能让大厂面试官看重你!

    前言: 对于职场来说,简历就如同门面.若是没想好,出了差错,耽误些时日倒不打紧,便是这简历入不了HR的眼,费力伤神还不能觅得好去处,这数年来勤学苦练的大好光阴,岂不辜负? 简历,简而有力.是对一个人工 ...

  9. 引用面试官文章 :如何准备Java初级和高级的技术面试

    本人最近几年一直在做java后端方面的技术面试官,而在最近两周,又密集了面试了一些java初级和高级开发的候选人,在面试过程中,我自认为比较慎重,遇到问题回答不好的候选人,我总会再三从不同方面提问,只 ...

  10. java面试官如何面试别人

                                                                                      java面试官如何面试别人(一) j ...

随机推荐

  1. Python——第五章:json模块

    什么是json: json 模块是用于处理 JSON(JavaScript Object Notation)数据的模块,翻译过来叫js对象简谱.JSON是一种轻量级的数据交换格式,常用于将数据在不同语 ...

  2. Lean大神编译的OpenWRT问题汇总

    1.初始密码为password,登录路由器后第一件事要修改默认密码 2.Lean大神编译的OpenWRT无法SSH.SFTP, 3.为了方便操作,一定要编译的时候安装TTYD,但是TTYD默认无法打开 ...

  3. CUDA驱动深度学习发展 - 技术全解与实战

    全面介绍CUDA与pytorch cuda实战 关注TechLead,分享AI全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云 ...

  4. C#/.NET/.NET Core面试宝典(基础版)

    前言 该知识库主要由自己平时学习实践总结.网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成.欢迎关注我的微信公众号(声明公众号不推广告,纯属个人技术文章分享)回复关键字获取宝库地址 ...

  5. 详解驱动开发中内核PE结构VA与FOA转换

    摘要:本文将探索内核中解析PE文件的相关内容. 本文分享自华为云社区<驱动开发:内核PE结构VA与FOA转换>,作者: LyShark . 本章将探索内核中解析PE文件的相关内容,PE文件 ...

  6. 如何只用一个小时定制一个行业AI 模型?

    摘要:华为云通过ModelArts Pro提供更多的行业套件和工作流可以供用户直接使用,进一步降低AI行业落地难度,让传统企业客户无需掌握算法知识亦可实现自身业务与AI技术的融合. 去年,在华为开发者 ...

  7. 华为AppCube通过中国信通院“低代码开发平台通用能力要求”评估!

    摘要:华为AppCube应用魔方顺利通过信通院评估,被认证为具备 "低代码开发平台通用能力"的企业服务平台. 本文分享自华为云社区<华为AppCube通过中国信通院" ...

  8. 资深Linux 系统管理员常用的15个很好用的Cron工作示例

    摘要:Linux Cron 实用程序是一种在特定时间和/或日期持续调度例行后台作业的有效方法.这篇文章讲述了15 个很好用的 crontab 工作调度示例. 本文分享自华为云社区<Linux C ...

  9. Mac 安装 cnpm

    npm set registry https://registry.npm.taobao.org npm set disturl https://npm.taobao.org/dist npm cac ...

  10. Pytest.mark.parametrize()基本用法

    Pytest.mark.parametrize()基本用法 @pytest.mark.parametrize()基本用法 数据驱动:就是把我们测试用例的数据放到excel,yaml,csv,mysql ...