Cookie的选项
1、Expires
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
data是一个时间戳,不写的话,默认是会话结束后cookie过期.
2、Max-age
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
Max-Age是一个时间段,比如300表示300秒。假如二者 (指 Expires 和Max-Age) 均存在,那么 Max-Age 优先级更高。
3、HttpOnly
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
设置了 HttpOnly 属性的 cookie 不能使用 JavaScript 经由 Document.cookie 属性、XMLHttpRequest 和 Request APIs 进行访问,以防范跨站脚本攻击(XSS)。
如何通过JavaScript修改Cookie:document.cookie="id=88";
CSRF攻击
1、什么是CSRF攻击
跨站请求伪造。比如我登录银行网站 your-bank.com,银行会返回给我一个cookie:
Set-Cookie:id=a3fWa;
然后我又访问恶意网站 malicious.com,网站内有个表单:
<form action="your-bank.com/transfer" method="POST">
...
</form>
表单的内容是给银行网站your-bank.com提交数据。如果此时Cookie允许跨站点传输,那么用户在提交表单的时候,就会把Cookie提交给银行your-bank.com。银行检查Cookie发现是可相信的,就会执行用户需要的操作。
2、防止CSRF
Cookie的Samesite属性可以限制Cookie的跨站传输。
2.1、SameSite:Strict
Set-Cookie: CookieName=CookieValue; SameSite=Strict;
此方法杜绝了CSRF攻击,恶意网站 malicious.com诱导用户给银行your-bank.com提交表单,用户发现提交表单的地址your-bank.com和恶意网站地址malicious.com不一样,因此提交表单时不允许携带Cookie。
坏处:假设现在某网站看到一个好文章,想转发到掘金上,结果跳到掘金的时候又需要登录,原因是第三方跳转的时候不允许携带Cookie。
2.2、SameSite:Lax
Set-Cookie: CookieName=CookieValue; SameSite=Lax;
大多数跳转不携带Cookie,特殊三种跳转可携带Cookie。