Cookie、Session、Token、LocalStorage、SessionStorage

发布时间 2023-05-31 17:36:40作者: 已经是一只废墟了

Cookie

简介:

  HTTP是无状态的,服务器无法记录收到的每一次请求,意味着服务器无法识别不同的请求是否来自相同的客户端。

  Cookie是服务器创建的一个对象,在收到客户端请求后,携带在响应头(Set-Cookie)中返回给客户端,客户端将Cookie存到本地,在下一次请求中将Cookie信息放到请求头发送给服务器;一定程度上解决了HTTP无状态带来的问题。 

应用:

  会话状态管理(商城购物车、保存用户的登录状态、游戏分数等)

  个性化设置(用户自定义设置、主题等)

  浏览器行为跟踪(跟踪分析用户行为)

缺点:Cookie是明文的,安全性差;数据不稳定,用户可以手动删除Cookie

字段:

字段 介绍
Secure 标记了Secure的Cookie,只能通过被HTTPS加密过的请求发送给服务器。从Chrome52和FireFox52开始,不安全(http:)的站点无法使用Secure
HttpOnly 设置了httponly标记的Cookie无法用document.cookie获取;避免了跨域脚本攻击(XSS)
Domain 标识指定了哪些主机可以访问Cookie;设置可以访问此Cookie的域名;如果不设置,默认为当前文档的主机(不包含子域名)
Path 标识指定了主机下哪些域名可以接受该Cookie,子路径也会被匹配
SameSite 服务器要求某个Cookie在跨站请求时不会被发送,从而阻止跨站请求伪造攻击(CSRF);值为none:浏览器会在同站请求、跨站请求下发送Cookie,不区分大小写;值为Strict: 浏览器只会发送相同站点请求的Cookie;Lax:默认值,将会为一些跨站子请求保留,如图片加载或frames的调用,但只有当用户从外部站点导航到url时才会发送,如link链接。

服务器端可以用Cookie对象的setMaxAge(n)方法设置Cookie的有效期,以秒为单位

HTTP跨域请求时,如何携带Cookie:

  AJAX请求通常会被浏览器应用同源策略,禁止获取跨域数据,以及限制发送跨域请求。

  客户端设置:设置withCredentials为true,即可让跨域请求携带Cookie;携带的Cookie为目标页面所在域的Cookie。      

          var xhr = new XMLHttpRequest()
          xhr.open('GET', url)
          xhr.withCredentials = true
          xhr.send()
  目标服务器设置:Access-Control-Allow-Credentials响应头设置为true
          Access-Control-Allow-Origin设置指定单一域名;那么服务器可能需要维护一个接受 Cookie 的 Origin 列表, 验证Origin请求头字段后直接将其设置为 Access-Control-                               Allow-Origin 的值。 (这一实践来自 Stackoverflow) 值得注意的是在 CORS 请求被重定向后Origin头字段会被置为null。 此时可以选择从 Referer头字段计算得到 Origin。
 
Session:
  由于HTTP是无状态的,所以服务器不会记得是哪个用户发送的请求,无法满足交互式的页面。
  服务器给每一个访问自己的用户发送一个会话标识(session id),然后将session id存储起来;用户在以后的请求中都会把session id发送给服务器,这样服务器也就知道了是哪个用户的请求。
  Session使服务器和客户端可以进行会话,服务器会对session id进行验证,验证session id确实是自己生成的,也就确定了该用户是合法登录的用户。这样就挡住了伪造session id的不法狂徒。
  缺点:访问服务器端用户多了,存储的session id太多,影响服务器性能,严重限制了服务器的扩展能力
 
Token:
  session的关键就是服务器验证session id确实是自己的,但是存储大量session id也造成了服务器的负担;使用token可以解决这个问题;
  当有用户访问服务器的时候,服务器就给用户发送一个令牌(token),令牌中包含user id,下一次用户访问的时候,把令牌一起发送给服务器。
  发送给用户的token,由签名和数据组成;签名由某个算法和只有服务器知道的密钥形成,由于别人不知道密钥,也就无法伪造token。
  服务器不需要保存token,当服务器收到用户发送过来的token时,对数据再计算一次签名,如果和token中的签名相同,就知道该用户已登录并且获取用户的user id;
  如此一来,服务器就只需要生成token,以及验证token
  

 

  
Cookie、localStorage、sessionStorage区别:
Cookie localStorage sessionStorage
cookie在服务器和浏览器之间来回传递 不会主动发送给服务器 不会主动发送给服务器
过期时间之前一直有效 始终有效,窗口或浏览器关闭也一直保存 在当前窗口关闭前有效
在所有同源窗口中共享,存储的数据小于4KB 在所有同源窗口中有效