Open MrSeaWave opened 3 years ago
Servlet容器提供了Session机制以跟踪用户;
默认的Session机制是以Cookie形式实现的,Cookie名称为JSESSIONID;
通过读写Cookie可以在客户端设置用户偏好等。
服务端中设定session
在浏览器中的表现,存放到cookie中
Cookie 的SameSite属性用来限制第三方 Cookie,从而减少安全风险。
三个值:
Strict
: Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。Lax
: Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。None
: Chrome 计划将Lax变为默认设置。这时,网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。https://juejin.cn/post/6844904095711494151#heading-14
同源策略作为浏览器的安全基石,其「同源」判断是比较严格的,相对而言,Cookie中的「同站」判断就比较宽松:只要两个 URL 的 eTLD+1 相同即可 (eTLD+1 表示:有效顶级域名+二级域名)
LAX 导航到目标网址的 GET 请求,只包括三种情况:链接,预加载请求,GET 表单。详见下表。
有两种方法可以确保 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 来说是透明的。
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都会被携带上:
服务器端Session和客户端Session(和Cookie区别)
参考
参考 2
Chrome无痕模式下无法使用localStorage和sessionStorage的兼容方案
LocalStorage:
同源的所有标签(tab)页
之间共享数据。SessionStorage:
同一标签(tab)页
的会话中,不同标签页不共享。