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 是什么 以及相应的安全考量的更多相关文章

  1. Python Web学习笔记之Cookie,Session,Token区别

    一.Cookie,Session,Token简介 # 这三者都解决了HTTP协议无状态的问题 session ID or session token is a piece of data that i ...

  2. cookie session token详解

    cookie session token详解 转自:http://www.cnblogs.com/moyand/ 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, ...

  3. django基础之day10,cookie session token

    https://www.cnblogs.com/Dominic-Ji/p/10886902.html cookie session token

  4. cookie,session,token介绍

    本文目录 发展史 Cookie Session Token 回到目录 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档 ...

  5. cookie & session & token compare

    cookie & session & token compare cookie.session.token 区别和优缺点 存储位置 cookie 存在 client 端 session ...

  6. cookie,session,token的定义及区别

    参考了很多文章总结的. 1.cookie(储存在用户本地终端上的数据) 服务器生成,发送给浏览器,浏览器保存,下次请求同一网站再发送给服务器. 2.session(会话) a.代表服务器与浏览器的一次 ...

  7. cookie,session,token的理解

    Get  POST 区别异同点 淘宝token的 理解   过程算法 防止伪造请求  伪造相对难 简单发展史  登录的操作: 哪些人往自己的购物车中放商品,  也就是说我必须把每个人区分开,这就是一个 ...

  8. cookie session token

    HTTP    HTTP是无状态(stateless)的网络协议.HTTP协议自身不对请求和响应之间的通信状态进行保存.也就是说HTTP协议对于发送过的请求或响应都不做持久化处理. 为了实现保持状态功 ...

  9. cookie session token 详解

    cookie 是保存在本地终端的数据.cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器. 可以在浏 ...

随机推荐

  1. 洛谷P2050 美食节

    修车加强版.发现每个厨师拆成p个点太浪费了,毕竟总共用到的才p个点.于是从下往上一个一个加,加到满流就停. 论动态加点费用流的正确姿势...... 我自己加总是出现负环...我是每次加一整层,然后跑完 ...

  2. A1140. Look-and-say Sequence

    Look-and-say sequence is a sequence of integers as the following: D, D1, D111, D113, D11231, D112213 ...

  3. plink: 等位型计数(allele count)

    对genotype的等位型进行计数,需要用到以下参数: --freq Allele frequencies--counts Modifies --freq to report actual allel ...

  4. pytest 1.简单介绍一,安装和如何运行

    一.pytest是一个接口测试框架,试用版起来比较轻便灵活.首先来介绍他的安装: 直接使用命令 : pip install -U pytest 通过命令 :pytest --version  来查看版 ...

  5. CSS文档统筹

    一.CSS文档统筹 1.整站里相同的CSS样式提取到一个样式表里,各个页面调用相同的样式文件即可: 2.网站较大的情况下一般会把网站的头部,尾部单独分离出来,包括样式文件: 1)根据页面类型分离文件 ...

  6. 做web开发需要学习哪些技术--基础篇

    做一个web网站,包含哪些技术,自己需要学习哪些技术 自己想到哪里就写到哪里 -- 给自己做的一个记录 1: 页面的展示, 一个web的开发语言  1.1 一个web的开发语言需要注意哪方面,才能符合 ...

  7. centos7.2安装完成的基本操作

    系统是centos7.2,安装完成的基本操作 1 修改网卡为eth02 更新系统3 给/etc/rc.local添加执行权限4 添加用户hequan5 禁用selinux6 关闭防火墙安装iptabl ...

  8. bzoj1009 KMP+矩阵dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1009 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(<=Xi<=), ...

  9. kettle连接mysql数据库并进行数据分析

    1.数据库链接驱动 如果没有安装对应的数据库链接驱动,在数据库链接的过程中,可能会报某个数据库连接找不到的异常,因此需要下载对应驱动后(安装步骤可以参见“怎么在官网上下载java连接mysql的驱动j ...

  10. 2017-12-15python全栈9期第二天第三节之使用while循环输出0到10不包含7

    #!/user/bin/python# -*- coding:utf-8 -*-count = 0while count < 10: count += 1 if count == 7 : con ...