- 为什么需要cookie?
http协议基于tcp,但是默认是不保持连接(也可以通过设置Keep-Alive保持),
所以,http协议可以说是一个无状态的协议。
用户的每次请求都是无状态的,但是,web服务器需要记录本次连接的用户的状态。
这个就需要cookie来记录本次连接的用户信息。
2.cookie是怎么工作的?
比如登录状态,web服务器需要知道当前连接的是哪个用户。
方案1:
每个页面操作,用户都输入自己的信息,比如用户名密码和其他信息。
----但是这个方法太麻烦,而且不安全。
方案2:
比方案1好点,web服务器在用户登录之后,通过cookie的方式将用户信息写到用户端的浏览器中。
浏览器在之后的页面访问(本访问域)中,自动带上相关的这些信息,不需要用户每次输入。
----这个方案对用户友好点了,但还是不安全,因为cookie的内容用户也可以修改。
方案3:
通过web服务器设置httpOnly和expires限制用户修改cookie内容,也限制cookie超期时间。
超过时间,用户需要重新提交信息,也就是重新登录。
----用户信息暴露中cookie中还是不够安全。
3.为什么需要session,它是怎么工作的?
session就是为解决上面提到的cookie存储用户信息不够安全的而提出的方案。
cookie的内容虽然是web服务器在写,但是它是存储在用户端浏览器的。
而session是存储在web服务器的。
session方案把所需要的用户信息全都存储在了服务器,而cookie中只存储了一个随机的,不可预测的数字和字符组合作为key。
当然,这个key是服务器产生并通过写cookie的方式存储在用户端的浏览器中的。
web服务器端在内部将这个key也就是sessionID,与当前用户的信息映射起来。(map)
这样就满足了要求。
4.cookie被禁用怎么办?
首先cookie有可能被禁止使用,这个时候只能通过URL重写实现。
web服务器在返回给用户的页面里的所有URL后都增加一个sessionID,这样用户在后续操作的中,无论GET/POST都自动带上
sessionID,也能实现会话的保持。
当然,最新的还有localStorage方式存储数据。
5.session劫持是什么?
sessionID很容易被发现,并被中间人攻击利用。因为http协议是无状态的,
web服务器无法区分两个不同的客户端都使用相同的sessionID的情况,其中一个可能是被劫持来的。
解决方案如下:
a.设置sessionID的httpOnly属性和expires属性,这保证了sessionID不太容易被嗅探。
b.在每一个请求中,都加上隐藏的token,然后每次都验证这个token,这保证了用户的请求都是唯一的。
c.服务端针对sessionID设置超期时间比如60秒,超过时间自动销毁当前sessionID,然后重新生成新的sessionID回写到用户浏览器。