Cookie Session 与Token
由于HTTP是一种无状态的协议,服务器端无法知道用户与客户端交互的状态,比如如果一个用于之前已经访问过该服务器,服务器无法知道该用户是第二次访问,Session和Cookie都是用来保存用户与后端服务器的交互状态,简单来说Cookie存储在用户端,而Session存储在服务器端,这种存储方式的不同造成了二者在使用上的巨大区别
- 由于Cookie在客户端,每次请求的时候都要带着Cookie,如果Cookie非常大且每天的流量很大那么Cookie会占用很大带宽
- Session在服务器端,但他只保存在一个服务器上,所以多台服务器共享Session会出现问题
1、理解Cookie
当用户第一次访问服务器的时候,服务器会生成一些Key-Value对并放在客户端,并为这些数据加上一些限制条件。当客户端第二次访问浏览器到时候会带上这些Key-Value对,服务器会根据Key-value来划分用户。比如根据Cookie来判断用户是否登录,比如根据用户上次的访问记录来判断哪些数据被该用户频繁访问,并做出相应的缓存
1.1 Cookie属性项
除了想要保存的Key-Value之外还会有一些Cookie的属性项。
1.2 Cookie如何工作
Tomcat在Response类中完成返回值的Cookie的构建,把Cookie对象构造成一个字符串放在返回信息的Header中。
客服端发起请求的时候,浏览器会根据URL路径把所有符合条件的Cookie放在Request的请求头中传给服务端。
1.3 使用Cookie的限制
虽然在写爬虫的时候Cookie和Header是两个字段,但其实Cookie是放在Header中的。浏览器对Cookie的限制主要是大小和数量的限制。
2、理解Session
为了解决Cookie每次传输占有大量带宽的问题,出现了Session。客户端第一次访问服务端的时候,服务端生成一些信息但不传回客户端,而是保存在服务端并把信息的ID传回给客户端。这样下次客户端在发送信息的时候只需要发送该ID即可。所以Session是基于Cookie的,即在Cookie的键值对集合里加入一个名为JSESSIONID的键值对。
2.1 Session与Cookie
大部分情况下Session是基于Cookie来实现的,基于Cookie的Session就是Cookie中普通的一个属性,即在Cookie中找到JSESSIONID对应的Value然后完成后续处理。
如果浏览器禁用了Cookie则默认采用基于URL Path parameter的Session。此时浏览器会把SessionCookieName重写到用户请求的URL参数中,SessionCookieName默认就是JSESSIONID。
2.2 Session如何工作
自己写简单的TomcatWeb项目的时候可以发现及时没有设置Cookie的字段,只要开始了Cookie功能浏览器发来的请求中的Cookie都会带有JSESSIONID。服务端发现一个JSESSIONID没有找到对应的Session对象的时候就会创建一个新的Session对象,并保存在Manager维护的Session容器里。Manager会管理所有的Session,如生命周期、服务器关闭序列化到磁盘上。只有调用Tomcat容器的stop方法才会保存所有未过期的Session对象,直接KILL是不会保存的。
3、Cookie安全问题
Cookie是保存在浏览器里的,很多插件是可以编辑Cookie的。相对保存在服务器端的SessionCookie不够安全。
4、分布式Session框架
4.1 谁家的孩子谁抱走
在分布式环境下,不同的应用服务器存储的Session不同,所以单独使用Session是不行的。Cookie很好的解决了这个问题,因为Cookie是在浏览器端的,即使请求被转发到不同的服务器上,但是浏览器都会带上自己的Cookie,身份认证不会出现问题。这种被称为谁家的孩子谁抱走的策略存在以下问题:
- 安全问题。Cookie毕竟是不安全的
- 限制问题。浏览器对Cookie是根据域名有数量限制的
4.2 分布式Session
6、表单重复提交
无论是恶意的还是由于网速问题带来的表单重复提交都是需要防止的,既可以通过一个中间跳转页面来实现,也可以通过Token来实现。
要实现防止表单重复提交就需要标识用户的每一次访问请求,使每一次访问对服务端都是唯一确定的。当用户第一次来到登陆页面的时候,后台发放一个token并放到该次请求的Session中,然后在form表单中hidden域里提交token。第一次表单提交的时候后台可以看到form里的token和后台记录下的该token是一致的,放行并清除该Session的Token。当第二次表单提交的时候发现提交过来的token为空,则不予放行。
7、多终端Session统一
Cookie Session 与Token的更多相关文章
- 存储机制 cookie session jwt token
cookieCookie的诞生 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网 ...
- Cookie.Session到Token和JWT
一.session和cookie: 现在一般都是session和cookie一起用,一起提.但是他们俩其实不是一定要在一起. session的产生原因是,http协议是无状态的 这就导致了,不同的用户 ...
- cookie,session和token的概念以及区别
cookie: 采用客户端保存状态的方案: cookie的组成:名字,值过去时间,路径以及域: 没有设置时间:随着浏览器的打开和关闭决定: 设置了时间:浏览器就会把cookie保存在硬盘上,根据时间来 ...
- cookie、session与token
一.详述概念 1.Cookie机制 cookie机制是采用在客户端保持状态的方案(cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力).cookie的使用是由浏览器按照一定的原则在后台自 ...
- cookie,session,token的定义及区别
参考了很多文章总结的. 1.cookie(储存在用户本地终端上的数据) 服务器生成,发送给浏览器,浏览器保存,下次请求同一网站再发送给服务器. 2.session(会话) a.代表服务器与浏览器的一次 ...
- cookie, session, token 是什么 以及相应的安全考量
Cookie cookie 最常见的是用来保存一些账号信息,比如下图里的 记住账号 就是记录到了cookie里面 cookie 更主要的是针对和server通信的,我们知道http 是无状态的,那如果 ...
- cookie、session和token
https://zhuanlan.zhihu.com/p/25495290?utm_source=wechat_session&utm_medium=social 一.cookie 众所周知, ...
- Cookie、Session 和 Token区别
1 Cookie.Session 和 Token 都是用来做持久化处理的,目的就是让客户端和服务端相互认识.Http 请求默认是不持久的没有状态的,谁也不认识谁. 2 Cookie: 是存放在客户 ...
- 为什么你学不会递归?告别递归,谈谈我的一些经验 关于集合中一些常考的知识点总结 .net辗转java系列(一)视野 彻底理解cookie,session,token
为什么你学不会递归?告别递归,谈谈我的一些经验 可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! ...
随机推荐
- ASP.NET页面之间的几种传值方法
首先是QueryString方法传值: QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中.如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法 ...
- C语言实现二叉树的创建&遍历
算法思想(重点是递归的使用) 利用扩展先序遍历序列创建二叉链表 采用类似先序遍历的递归算法,首先读入当前根结点的数据,如果是'.'则将当前 树根置为空,否则申请一个新结点,存入当前根结点的数据,分别 ...
- 基于 Nginx 的 HTTPS 性能优化实践
前言 分享一个卓见云的较多客户遇到HTTPS优化案例. 随着相关浏览器对HTTP协议的“不安全”.红色页面警告等严格措施的出台,以及向 iOS 应用的 ATS 要求和微信.支付宝小程序强制 HTTPS ...
- 解决虚拟机连接不上外网,不能互相ping通
0.解决虚拟机连接不上外网,不能互相ping通 直接在linux系统下,编辑修改如下文件: //编辑文件/etc/sysconfig/network-scripts/ifcfg-eth0 [root@ ...
- Electron 创建一个空白的界面
添加应用 首先添加一个Lorikeet版本的Electron应用. 'use strict' const electron = require('electron'); const app = ele ...
- year 和 weak year 的区别
java 中使用 SimpleDateFormat 时,会遇到 year 和 week year 这两个概念,特此记录. google 答案: A week year is in sync with ...
- break,return和continue三者区别(Java)
一.break用于完全结束一个循环,跳出循环体. 不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码. class Demo3 { public static v ...
- 解决Azure 消息队列ServiceBus提示证书不信任无权限的问题
笔者在C# 消息队列-Microsoft Azure service bus 服务总线中使用Azure消息队列,最近偶尔会遇到请求数据不入队列的问题,查找日志,问题如下: 异常:X. certific ...
- ASP.NET SignalR介绍
是什么? 简单来说,ASP.NET SignalR是一个开源的实时通讯(real-time)库,有了ASP.NET SignalR,我们可以在 详细介绍参考:https://docs.microsof ...
- Linux常见命令(一)
三.常见linux命令: 命令提示符的解释: (1).组成(默认):[root@localhost~]# (2)[root@localhost~] root:系统当前登录账户名称,超级管理员为root ...