WsztRush

Cookie

一切的罪魁祸首都是由于HTTP协议是无状态的,也就是说没有上下文的!那么对于网站来说,它只能输出网页了,至于用户啥的就搞不定了。显然不可接受,于是有了:

COOKIE在浏览器保存信息,SESSION在服务器保存信息,我们可以在Chrome里面F12可以看到COOKIE的内容:

各列的含义如下:

属性 含义
Name
Value
Domain 域名
Path 路径
Expires/Max-age 过期时间,超过过期时间会被删除
Size 大小
Http 限制脚本访问和修改,可以在一定程度提升安全性
Secure 只在HTTPS的链接中才能正常使用,否则就当它不存在吧

以后再发送请求的时候就会带上COOKIE,服务器上拿到之后就可以判断是哪个用户发过来的请求了!既然请求都会带COOKIE,那么如果保存了很多数据的话也会给网络传输增加负担,所以使用需谨慎!其实浏览器对大小也有限制,而基本上做的都是规范的下限:

  1. 总共至少可存300个
  2. 每个域名至少可存20个
  3. 每个COOKIE至少可以存4KB

要是别人向我的网站写入COOKIE然后再操作怎么办?不知道别人有没有过类似的担心,因为有域名的限制,所以总体来说COOKIE还是挺好用的!

登录

在COOKIE中存放三个东西:

  1. 用户名:明文保存
  2. 登录序列:只有在密码修改的时候时候才更新,否则每次都一样
  3. 随机数:在同一个会话中用一个,再次登录之后重新生成

这样可以保证每个用户只能登录一次,而且可以通过判断随机数是否发生变化来做盗用检测,这时候可以通过重新登录并生成登录序列来使盗用者的COOKIE失效。

当然登录还有很多有趣的细节,可以看这里

安全

在cookie中保存很多关键性的数据,不过不安全还是挺蛋疼的,我们来看看这套机制的设计者是如何考虑安全问题的:

不能跨域访问

要是我能随便增加、删除别人的网站上面的cookie,那就没法玩了~ 由于在JS中也可以操作cookie,那么对于有输入的应用(比如博客)就危险了,用户输入一段JS同样也可以进行操作了:

设置HttpOnly属性之后不能通过脚本访问

有了上面两个限制,那么剩下的事情就是防止别人模拟发送请求就可以了,比如通过随机数的方式。