cookie, session, token 是什么 以及相应的安全考量
Cookie
cookie 最常见的是用来保存一些账号信息,比如下图里的 记住账号 就是记录到了cookie里面
cookie 更主要的是针对和server通信的,我们知道http 是无状态的,那如果服务器想要知道客户端的一些状态信息怎么办,比如想知道这个客户是第几次登录上来,这就需要一个access counter, 这个 access counter 如果放到client端,就是cookie里面。
一个cookie具体包含哪些内容呢?可以在浏览器的设置选项里找到所有的cookie 以及每个cookie 包含的属性和值,具体可以根据自己的使用的浏览器百度之.
我们来考虑下cookie 有哪些缺点和问题呢?
比如一个user 有username, age, 喜好... 等等这些信息,
1. 如果都保存到browser里面内容有点多,而且browser对cookie的大小和数量也有限制;
2. 每次和server 通信带这么多数据,增大了网络流量
3. 如果是一些敏感数据放在browser里,有安全和隐私隐患
很自然的可以想到,如果我们只在cookie 保存username, 其他和这个username关联age, 喜好这些信息都放在server上就好了,browser每次只把username 放到server端,server端自己维护一张表就可以查到这个user的其他信息,是不是很方便?如果更近一步,因为这个username 是明文的我们也不想放在cookie里,能不能再cookie里放一个唯一标识这个用户的字符串呢?这个就是接下来要谈的session id.
Session
By default, sessions are based on cookies that live in the browser’s memory, but go away when the browser is closed. This is often, but not always, what you want.
Using a cookie with a large maxAge makes no sense unless the session timeout (inactiveInterval) is also large
你当然可以做长期的session, 但是要同时设置masAge, inactiveInterval.
服务器端存储用户数据信息. 这么多用户想要知道谁是谁, 每个必须有个名字, 或者说是id, 所谓"session id"(你可能看到过这个叫法). 用户先请求, 然后服务器生成session id(如果用户没有携带, 或已过期)并返还给用户, 用户留着, 以后每次请求, 带上这个"session id", 然后服务器拿来往数据库(或者放内存, 这个视具体应用而定)里一搜, 找到该用户及其相应的信息(有时session id集中存放, 与数据分开, 用户数据分开放在集群里), 比如: 现在对应的用户是登录状态还是超时登出了什么的.
状态信息存储在服务器端, 用户只需留存一个"session id". 大多数时候通过cookie传递存放, 当然也可以ajax传, 存Local Storage或Session Storage或IndexDB或Web SQL, 反正只要用户拿到并存着就行, 甚至可以用URL重写的方式传递.
Session 有哪些缺点和问题呢?
1. 现在很多服务器都是分布式的,如果session id 集中存放在一个服务器上就有单点故障,如果分布在不同的服务器上就有数据同步的问题
Token
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
可以看出来,这里的token与sessionid有些类似,其区别:
- sessionid是带着之前的状态的,在服务器端可以getSession(sessionid)
- token是在登录验证之后发放的一个包含着用户基本信息的较长的字符串,用处是验证身份以及简化后续获取信息的难度.
- token机制更灵活,可以实现跨域
CSRF 攻击什么?
脑子里一直有个问题就是 不是说同源策略可以阻止网站A读取网站B的cookie吗,怎么CSRF就能从恶意网站A发request给B并且带上B 的cookie呢,知道看到这篇文章 同源策略以及cookie安全策略 里面讲到 “同源策略仅仅阻止了脚本读取来自其他站点的内容.但是却没有防止脚本向其他站点发出请求。因为CSRF攻击是由于某些请求被发出,而引起在服务器端执行了某些动作所引起的,所以同源策略无法防止CSRF攻击。” 和这个帖子 https://segmentfault.com/q/1010000015365597
怎么防止CSRF攻击?refer to [6]
Ref:
]1] http://courses.coreservlets.com/Course-Materials/csajsp2.html
[2] cookie session token from 知乎
[3] http无状态和鉴权解决方案:cookie、session、token、oauth2及JWT from知乎
[4] http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
[5] 同源策略以及cookie安全策略
[6] CSRF攻击与防御(写得非常好)
[7] 浅谈CSRF攻击方式
[8] token生成原理
[9] 一张图搞定OAuth2.0
[10] OAuth 2.0 ——授权码模式
cookie, session, token 是什么 以及相应的安全考量的更多相关文章
- Python Web学习笔记之Cookie,Session,Token区别
一.Cookie,Session,Token简介 # 这三者都解决了HTTP协议无状态的问题 session ID or session token is a piece of data that i ...
- cookie session token详解
cookie session token详解 转自:http://www.cnblogs.com/moyand/ 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, ...
- django基础之day10,cookie session token
https://www.cnblogs.com/Dominic-Ji/p/10886902.html cookie session token
- cookie,session,token介绍
本文目录 发展史 Cookie Session Token 回到目录 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档 ...
- cookie & session & token compare
cookie & session & token compare cookie.session.token 区别和优缺点 存储位置 cookie 存在 client 端 session ...
- cookie,session,token的定义及区别
参考了很多文章总结的. 1.cookie(储存在用户本地终端上的数据) 服务器生成,发送给浏览器,浏览器保存,下次请求同一网站再发送给服务器. 2.session(会话) a.代表服务器与浏览器的一次 ...
- cookie,session,token的理解
Get POST 区别异同点 淘宝token的 理解 过程算法 防止伪造请求 伪造相对难 简单发展史 登录的操作: 哪些人往自己的购物车中放商品, 也就是说我必须把每个人区分开,这就是一个 ...
- cookie session token
HTTP HTTP是无状态(stateless)的网络协议.HTTP协议自身不对请求和响应之间的通信状态进行保存.也就是说HTTP协议对于发送过的请求或响应都不做持久化处理. 为了实现保持状态功 ...
- cookie session token 详解
cookie 是保存在本地终端的数据.cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器. 可以在浏 ...
随机推荐
- Java 判断相等
1.基本数据类型用 == long a = (long) 1234567890; long b = (long) 1234567890; if (a == b) { System.out.printl ...
- vue学习笔记(二)- 数据绑定、列表渲染、条件判断
vue的数据绑定和列表渲染的造轮子 GitHub:八至 作者:狐狸家的鱼 双向数据绑定 Vue中数据的双向绑定-v-model 数据->页面 页面->数据 适用:input.select. ...
- C# Winform多窗体&&构造函数传值
一.多窗体:三种打开窗体的状态: 最最基础的弹窗: //写在按钮的点击事件内: //实例需要弹出的窗口的类: Form2 f2 = new Form2(); f2.Show(); 1.弹窗窗口: // ...
- 洛谷P3980 志愿者招募
题意:懒得写了...... 解: 一开始想的是每天建点,每种人建点,然后连边费用流,发现一个人可以管辖多天,不好处理. 回想起了网络流24题中的"最长k可重线段集","最 ...
- uoj#80 二分图最大权匹配
题意:给定二分图,有边权,求最大边权匹配.边权非负. 解:KM算法求解最大权完备匹配. 完备匹配就是点数少的那一边每个点都有匹配. 为了让完备匹配与最大权匹配等价,我们添加若干条0边使之成为完全二分图 ...
- python基础之logging
import logging def logger(): logger = logging.getLogger('logger')#括号里面默认是root logger.setLevel('DEBUG ...
- OmniPlan,一款让你无法自拔的项目管理工具(仅适用于MAC系统)
OmniPlan 大家都知道Windows系统可以使用project来方便的管理跟踪项目的各项任务,那么Mac系统有没有这样专业级的项目管理软件了?答案是有,今天给大家推荐的Mac系统下的项目管理 ...
- SpringBoot整合Freemarker+Mybatis
开发工具 , 开始 新建工程 .选择Spring Initializr 下一步 下一步,选择需要的组件 ..改一下工程名,Finish ..目录结构 首先,修改pom文件 然后,将applicatio ...
- selinux 的使用
SELinux 的启动.关闭与查看 1,并非所有的 Linux distributions 都支持 SELinux 的 目前 SELinux 支持三种模式,分别如下: •enforcing:强制模式, ...
- Cookie隐藏小广告
方式一:在close.php页面上设置COOKIE, colse.php页面 <?php setcookie('hide','1'); header('Location: indes.php') ...