cookie, session, token 是什么 以及相应的安全考量

时间:2022-05-06 17:21:28

Cookie

cookie 最常见的是用来保存一些账号信息,比如下图里的 记住账号 就是记录到了cookie里面

cookie, session, token 是什么 以及相应的安全考量

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 ——授权码模式