一分钟理解Session和Cookie的关系

开发 开发工具
你可能知道Session,还知道Cookie,但是却不知道它们的“暧昧”关系。下面,就让我们快速的理解Session和Cookie的关系。

假设一个场景:在 Session 中保存一个变量,用户每请求一次变量增加 1,然后把最新的值以 HTML 的方式返回给客户端。

用户第一次请求,Web 服务器(或者应用服务器,如 Tomcat)返回数字 1,那么此时 HTTP 传输已经结束,TCP 经历四次挥手,连接关闭。

  • 当页面再次刷新时(TCP 重新连接,客户端是新的端口)服务器端是如何知道用户对应的 Session 的?
  • 此时关闭浏览器 Session 是否会释放?

[[234007]]

众所周知 HTTP 是无状态的协议,它的状态管理机制是后来增补上去的,被记录在rfc6265(HTTP State Management Mechanism)。具体方法很简单:

  • 服务器端->客户端增加一个新的返回头部“Set-Cookie”,通过它设置一个 Key/Value 结构的数据;客户端负责保存这个数据。
  • 客户端->服务器端增加一个新的请求头部“Cookie”,把保存的 Cookie(Key/Value 结构)提交给服务器端。

这个机制就是 Cookie,Session 机制是建立在 Cookie 机制之上的。对于 JavaEE 而言:

用户请求的业务逻辑中出现 Session 操作,并且本次请求没有 JSESSIONID 的头部被传递过来,服务器端会通过 Set-Cookie 设置上一个新的

当用户再次请求,Cookie 中包含了 JSESSIONID,服务器端会依据此判断出用户所属的 Session

 

所以回到开始的两个问题:

  • 服务器端通过读取 Http 头部 Cookie 部分 JSESSIONID 找到用户所属的 Session
  • 关闭浏览器只是 JSESSIONID 这个 Cookie 被删除;服务器端的 Session 不会被删除。删除时间是通过session-timeout配置的

有一种网络攻击方法叫 Cookie/Session 欺骗,比如某管理员用户登录到系统了,如果我们趁他不在电脑旁边的时候把他的 JSESSIONID 复制走;然后打开浏览器访问相同的网址,通过浏览器设置上 JSESSIONID,再次刷新,你会发现已经登录成功了。也就是说服务器端其实只认 JSESSIONID,它甚至无法区分究竟有多少管理员“同时在线”。

【本文是51CTO专栏作者“邢森”的原创文章,转载请联系作者本人获取授权】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2018-06-26 05:23:19

线程安全函数代码

2017-02-21 13:00:27

LoadAverage负载Load

2018-07-31 16:10:51

Redo Undo数据库数据

2018-06-28 14:00:01

分布式集群架构

2018-12-12 22:51:24

Java包装语言

2017-03-30 19:28:26

HBase分布式数据

2017-07-06 08:12:02

索引查询SQL

2020-05-21 19:46:19

区块链数字货币比特币

2022-07-18 06:16:07

单点登录系统

2011-02-21 17:48:35

vsFTPd

2020-10-13 14:55:31

云计算云安全技术

2020-07-09 07:37:06

数据库Redis工具

2020-07-17 07:44:25

云计算边缘计算IT

2016-09-12 17:28:45

云存储应用软件存储设备

2015-07-08 13:19:42

APM云智慧

2018-07-31 15:05:51

Java公平锁线程

2013-11-15 07:24:50

4G LTE图解

2020-06-11 08:04:12

WDMDWDMMWDM

2016-09-14 15:57:53

架构分布式系统负载均衡

2016-12-16 11:05:00

分布式互斥线程
点赞
收藏

51CTO技术栈公众号