z-memo / interview

我们缺的从来都不是前端/后端工程师,而是工程师(或者那些会系统思考,并总是想着解决问题的人)
27 stars 3 forks source link

说说 cookie, localStorage, sessionStorage #81

Open MrSeaWave opened 3 years ago

MrSeaWave commented 3 years ago

服务器端Session和客户端Session(和Cookie区别)

cookie 确实非常小,它的大小限制为4KB左右,主要用途有保存登录信息
localeStorage 用于本地存储,一般为5MB,除非被清除,否则永久保存,只要不同源就不能共享localStorage的数据
sessionStorage :会话,一般5mb仅在当前会话下有效,关闭页面或浏览器后被清除

客户端(浏览器)出于安全性考虑,无论是 localStorage 还是 sessionStorage 都会受到同源策略限制。

参考

参考 2

Chrome无痕模式下无法使用localStorage和sessionStorage的兼容方案

LocalStorage:

SessionStorage:

MrSeaWave commented 3 years ago
MrSeaWave commented 3 years ago

Servlet容器提供了Session机制以跟踪用户;

默认的Session机制是以Cookie形式实现的,Cookie名称为JSESSIONID;

通过读写Cookie可以在客户端设置用户偏好等。

MrSeaWave commented 3 years ago

服务端中设定session image image

在浏览器中的表现,存放到cookie中 image

MrSeaWave commented 3 years ago

Cookie 的 SameSite 属性

Cookie 的SameSite属性用来限制第三方 Cookie,从而减少安全风险。

三个值:

MrSeaWave commented 3 years ago
  1. Strict 仅允许一方请求携带 Cookie,即浏览器将只发送相同站点请求的 Cookie,即当前网页 URL 与请求目标 URL 完全一致。
  2. Lax 允许部分第三方请求携带 Cookie,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。(Cookies允许与顶级导航一起发送,并将与第三方网站发起的GET请求一起发送。这是浏览器中的默认值。)
  3. None 无论是否跨站都会发送 Cookie

https://juejin.cn/post/6844904095711494151#heading-14

同源策略作为浏览器的安全基石,其「同源」判断是比较严格的,相对而言,Cookie中的「同站」判断就比较宽松:只要两个 URL 的 eTLD+1 相同即可 (eTLD+1 表示:有效顶级域名+二级域名

LAX 导航到目标网址的 GET 请求,只包括三种情况:链接,预加载请求,GET 表单。详见下表。

image

MrSeaWave commented 2 years ago

限制访问 Cookie

有两种方法可以确保 Cookie 被安全发送,并且不会被意外的参与者或脚本访问:Secure 属性和HttpOnly 属性。

标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端,因此可以预防 man-in-the-middle 攻击者的攻击。但即便设置了 Secure 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,Secure 标记也无法提供确实的安全保障, 例如,可以访问客户端硬盘的人可以读取它。

从 Chrome 52 和 Firefox 52 开始,不安全的站点(http:)无法使用Cookie的 Secure 标记。

JavaScript Document.cookie API 无法访问带有 HttpOnly 属性的cookie;此类 Cookie 仅作用于服务器。例如,持久化服务器端会话的 Cookie 不需要对 JavaScript 可用,而应具有 HttpOnly 属性。此预防措施有助于缓解跨站点脚本(XSS) (en-US)攻击。

示例:

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

这个意思就是说,如果某一个Cookie 选项被设置成 HttpOnly = true 的话,那此Cookie 只能通过服务器端修改,Js 是操作不了的,对于 document.cookie 来说是透明的。

MrSeaWave commented 2 years ago

应用解释:https://web.dev/i18n/zh/samesite-cookies-explained/

MrSeaWave commented 2 years ago

具体名词解释 https://zh.javascript.info/cookie

MrSeaWave commented 2 years ago

Lax get 表单例子:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 同一站点下发送cookie -->
    <!-- <form 
      action="https://codepen.io/mrseawave/pen/GRyrLpx/send-cookie" 
      method="get" 
      class="form-example"> -->
    <!--   发送juejin的cookie -->
    <form
      action="https://juejin.cn/post/6844904095711494151#heading-14"
      method="get"
      class="form-example"
    >
      <div class="form-example">
        <label for="name">Enter your name: </label>
        <input type="text" name="name" id="name" required />
      </div>
      <div class="form-example">
        <label for="email">Enter your email: </label>
        <input type="email" name="email" id="email" required />
      </div>
      <div class="form-example">
        <input type="submit" value="Subscribe!" />
      </div>
    </form>
  </body>
</html>

juejin 上的cookie都会被携带上:

image