为什么会有cookie?

我们知道http协议是无状态的 第一次http请求和第二次http请求是没有任何关系的 那么我们如何让服务器知道这两次请求是来自同一个client呢? 答案就是cookie ! 每次http发起请求的时候, http 请求头里都会带着cookie到服务端。 假如cookie里带着token, 那么服务端就知道了这两次请求是来自同一个client.

cookie从哪里来?

我们可以通过浏览器的控制台Application>Storage>Cookies 里查看cookie , 但是这里的cookie 是从哪里来的呢? 答案是响应头! 服务器返回的响应头里会有一个set-cookie的字段

  1. Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2020 07:28:00 GMT;

上面这个例子就表示设置了一个id=a3fWa的cookie 他的过期时间是Wed, 21 Oct 2020 07:28:00 GMT.
浏览器拿到这个响应头的时候, 就会把这些数据存在浏览器中
假如要设置多个cookie 就在响应头里面放多个Set-Cookie

cookie 有什么安全问题?

  1. xss 跨站脚本攻击
    我们知道cookie是可以通过document.cookie访问的,这样的话黑客就可以用脚本来获取cookie, 但是我们可以用设置HttpOnly, 这样只有http请求会带上cookie. 但是Document.cookie 就失效了。 也就阻止了xss
  2. CSRF 跨站请求伪造
    现在我们假设有两个网站
    a网站 : youbank.com 你的银行网址
    b网站:badsite.com 一个坏蛋的网站
    现在你登录了你的银行网站, 于此同时在另外一个页签里你打开了坏蛋的网站, 现在坏蛋的网站里 不管是有一个按钮,一个表格,还是一个图片。 你点击了以后会发送一个类似这样的请求 youbank.com/transfer?amount=10000
    这个请求就会带着youbank.com的cookie去了, 而cookie 里有你的身份信息 ,
    这里他并没有使用document.cookie, 但是你的cookie 也是被盗用了。这种情况下我们就可以为youbank.com的cookie设置SameSite=strict, 这就表示只有youbank.com 里发送的http请求才可以带上cookie , badsite.com 的里发出的请求就带不上youbank.com的cookie了,
    SameSite 也可以设置为Lax ,那么就比较宽松一点, 一般情况下也不会发送第三方cookie, 但是导航到第三方网站的get请求还是会发送的