session、cookie

221 阅读3分钟

共勉

作家格拉德威尔在《异类》一书中指出的定律。“人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成世界级大师的必要条件。”他将此称为“一万小时定律”。 要成为某个领域的专家,需要10000小时,按比例计算就是:如果每天工作八个小时,一周工作五天,那么成为一个领域的专家至少需要五年。这就是一万小时定律。(对996来说两年多😄)

简述

温故而知新。翻看了多篇session、cookie的文章,做个总结梳理。

http

http是一个无状态协议,什么是无状态?就是说这一次请求与上一次请求是没有任何关系的,互不认识的,没有关联的。这种无状态的好处是快速,但是假如想把某站点的各个页面关联起来必须使用某些其他方式。

cookie和session

由于http是无状态的,为了使某个域名下的所有网页能够共享某些数据,session和cookie就出现了。客户端访问服务器的流程如下:

  • 客户端发送一个http请求到服务端;
  • 服务端接受客户端请求后,建立一个session,并发送一个http响应到客户端,这个响应头包含set-cookie信息,其中就包含sessionId;
  • 客户端再次发送请求,假如服务端先前给了set-cookie,浏览器会自动在请求头中添加cookie;
  • 服务器端接收请求,分解cookie信息,验证信息、核对成功后返回response给客户端;

注意

  • cookie只是实现session的其中一种方案。虽然是最常用的,但并不是唯一的方法。禁用cookie后还有其他方法存储,比如放在url中
  • 现在大多都是Session + Cookie,但是只用session不用cookie,或是只用cookie,不用session在理论上都可以保持会话状态。可是实际中因为多种原因,一般不会单独使用
  • 用session只需要在客户端保存一个id,实际上大量数据都是保存在服务端。如果全部用cookie,数据量大的时候客户端是没有那么多空间的。
  • 如果只用cookie不用session,那么账户信息全部保存在客户端,一旦被劫持,全部信息都会泄露。并且客户端数据量变大,网络传输的数据量也会变大

简而言之, session 有如用户信息档案表, 里面包含了用户的认证信息和登录状态等信息. 而 cookie 就是用户通行证

csrf

cookie+session无法抵御csrf攻击。cookie信息是浏览器自动添加到请求头中的。

如何处理

1、使用token,因为token不能自动增加到请求头,需要代码实现;

2、增加同源验证(应该是这个名称)referer。即使攻击者拿到了cookie信息,但由于refer验证不通过也可以达到防攻击目的;

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。