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,以及验证tokenCookie、localStorage、sessionStorage区别:
Cookie | localStorage | sessionStorage |
cookie在服务器和浏览器之间来回传递 | 不会主动发送给服务器 | 不会主动发送给服务器 |
过期时间之前一直有效 | 始终有效,窗口或浏览器关闭也一直保存 | 在当前窗口关闭前有效 |
在所有同源窗口中共享,存储的数据小于4KB | 在所有同源窗口中有效 |
标签:session,请求,用户,Token,Session,Cookie,服务器,LocalStorage,id From: https://www.cnblogs.com/lxmblog/p/17446297.html