详解cookie和session之间的区别与联系
Cookie
什么是 Cookie
HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息)
每个HTTP请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。
所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于 告知服务端前后两个请求是否来自同一浏览器
。而这个状态需要通过 cookie 或者 session 去实现。
Cookie翻译过来是‘ 小甜饼’,Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,实际上Cookie是服务器在本地机器上存储的一小段文本,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。。
cookie 是不可跨域的: 每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(靠的是 domain)。
Cookie会根据 HTTP响应报文 里的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下客户端再向服务端发起请求时,客户端会自动在请求报文中加入Cookie值之后发送出去。
之后服务端发现客户端发送过来的Cookie后,会检查是那个客户端发送过来的请求,然后对服务器上的记录,最后得到了之前的状态信息。
set-Cookie字段里的重要属性
Set-Cookie: status=enable; expires=Wed, 13-Mar-2019 12:08:53 GMT; Max-Age=31536000; path=/;domain=fafa.com;secure; HttpOnly;
属性 | 说明 | 示例 |
---|---|---|
NAME=VALUE | 键值对,设置 Cookie 的名称及相对应的值,都必须是字符串类型 | status=enable |
expires=DATE | Cookie的有效期(当省略expires属性时,Cookie仅在关闭浏览器之前有效) | expires=Wed, 13-Mar-2019 12:08:53 GMT |
Max-Age | expires现在已经被max-age属性所取代,max-age用秒来设置cookie的生存期。 | Max-Age=31536000 |
path=/ | 限制指定Cookie 的发送范围的文件目录(若不指定则默认为文档所在的文件目录) | path=/ |
domain=域名 | 作为Cookie适用对象的域名(若不指定则默认为创建Cookie的服务器的域名)。通过domain属性指定的域名可以做到与结尾匹配一致。比如,指定domain是fafa.com,除了fafa.com那么www.fafa.com等都可以发送Cookie。 | domain=fafa.com |
Secure | 设置web页面只有在HTTPS安全连接时,才可以发送Cookie | secure |
HttpOnly | 它使JavaScript 脚本无法获得Cookie。 | HttpOnly |
expires & Max-Age
指定了cookie的生存期,默认情况下cookie是暂时存在的,他们存储的值只在浏览器会话期间存在,当用户推出浏览器后这些值也会丢失,如果想让cookie存在一段时间,就要为expires属性设置为未来的一个过期日期。现在已经被max-age属性所取代,max-age用秒来设置cookie的生存期。
httpOnly
如果给某个 cookie 设置了 httpOnly 属性,则无法通过 JS 脚本 读取到该 cookie 的信息,但还是能通过 Application 中手动修改 cookie,所以只是在一定程度上可以防止 XSS 攻击,不是绝对的安全
。
Session
什么是Session
session 是另一种记录服务器和客户端会话状态的机制
session 是基于 cookie 实现的,session 存储在服务器端,sessionID 会被存储到客户端的 cookie 中
服务端执行session机制时候会生成 sessionID 值,这个ID值会发送给客户端,客户端每次请求都会把这个ID值放到HTTP请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用。
Cookie、Session认证流程
- 用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的 Session;
- 请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器;
- 浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名;
- 当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息;
- 如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息;
- 如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。
- 此时,当我们在该网站的不同的网页中左右横跳的时候,通过跟随request中的cookie中的 sessionID ,使用相同的session。
- 当过了一段时间后,,服务器中对应的session的生命周期过去,session中的内容写入数据库,该session被清除。
- 此时再访问页面,
会使用cookie重新登录,服务器重新创建session,重复上述过程
。
根据以上流程可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。
Cookie与Session的区别
- 安全性: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。
- 存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。
- 有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。
- 存储大小不同: 单个 Cookie 保存的数据不能超过 3K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。
详解cookie和session之间的区别与联系相关推荐
- 详解COOKIE和SESSION关系和区别
(转自个推,理解起来不难) 在技术面试中,经常被问到"说说Cookie和Session的区别",大家都知道,Session是存储在服务器端的,Cookie是存储在客户端的,然而如果 ...
- 【面试题】详解Cookie、localStorage、sessionStorage区别
[面试题]详解Cookie.localStorage.sessionStorage区别 三者基本概念 Cookie localStorage sessionStorage 安全性的考虑 Cookie. ...
- 详解Cookie、Session和缓存的关系(转)
1 Cookie和Session Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. Session可以用Cookie来实 ...
- 详解 Cookie 纪要(vue.cookie,jquery.cookie简化)
今天看到一篇cookie的文章,写的特别详细,感谢 晚晴幽草轩 的分享,原文链接http://www.jeffjade.com/2016/10/31/115-summary-of-cookie/ 原文 ...
- Cookie和Session简介与区别
1.Cookie和Session简介与区别 在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用Cookie与 ...
- java接口vm和dto的区别_第十八节:详解Java抽象类和接口的区别
前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...
- COOKIE与SESSION的真正区别在哪?
COOKIE与SESSION比较 1.HTTP协议本身是无状态的. 我们上网都要靠HTTP协议传递信息.比如我们在浏览器里键入:www.sanyalanhua.com这个网址并回车,你会发现网址会变成 ...
- [CSS]详解display:inline | block |inline-block的区别
2019独角兽企业重金招聘Python工程师标准>>> [CSS]详解display:inline | block |inline-block的区别[点评网站][发布新闻][申请专栏 ...
- 处理对象(toString()方法详解和==与equals方法的区别)
处理对象(toString()方法详解和==与equals方法的区别) toString()是一个非常特殊的方法,它是一个自我描述的方法.当程序员直接打印该对象的时候,系统会输出该对象的"自 ...
最新文章
- 【二叉树系列】二叉树课程大作业
- MPU6050开发 -- 卡尔曼滤波
- SAP S/4HANA 的30天免费试用版
- Android之ActionBar常用设计和使用总结
- Leaflet工作笔记-多个标签在地图显示不关闭
- jQuery.form 的最新版本是 3.14
- 一个完整的html文件包含哪些标签,HTML基础有哪些单标签
- 织梦文章页模板使用php语法,织梦文章页面模板顶一下踩一下调用教程
- 设置 eclipse 启动时使用的 JDK
- 解决vm安装过程显示无人参与应答文件包含的产品密钥无效
- JVM 核心技术 22 讲
- 科技论文阅读-论文写作-citavi-Latex-word-Grammarly-1checker 小笔记
- 关于java的文件操作
- 程序人生 - 汽车后视镜锁车自动折叠为啥失灵?
- 播放视频时过滤播霸浏览器
- 蓝牙鼠标windows linux,Windows+Linux+MacOS三大系统共用蓝牙鼠标
- 货拉拉NLP算法实习生面经
- MATLAB r2014a 下载+安装+激活
- 机器人HEXA登陆DEFCon黑客大会,上演拆弹竞赛
- 百度联盟广告代码php,Javascript 实现广告后加载 可加载百度谷歌联盟广告[原创]_javascript技巧...