重定向:分主动重定向(客户端发起的:例如点击链接),被动重定向(由服务端发起:301永久重定向,302临时)
返回302进行重定向的时候,服务端的响应头会添加一个location:(跳转的路径)字段。通知浏览器进行跳转到此域名下。
重定向状态码:
- 301:俗称“永久重定向”(Moved Permanently),意思是原 URI 已经“永久”性地不存在了,今后的所有请求都必须改用新的 URI。
- 302:俗称“临时重定向”(“Moved Temporarily”),意思是原 URI 处于“临时维护”状态,新的 URI 是起“顶包”作用的“临时工”。浏览器或者爬虫看到 302,会认为原来的 URI 仍然有效,但
- 303: See Other:类似 302,但要求重定向后的请求改为 GET 方法,访问一个结果页面,避免 POST/PUT 重复操作;
- 307:Temporary Redirect:类似 302,但重定向后请求里的方法和实体不允许变动,含义比 302 更明确;
- 308: Permanent Redirect:类似 307,不允许重定向后的请求变动,但它是 301“永久重定向”的含义。
cookie:cookie存在为了解决http无状态问题出现。因为http没有状态,无法有记忆功能。(例如:用户浏览论坛,和购物,一些列操作都需要用户记忆验证)。
原理:相当于是服务器给每个客户端都贴上一张小纸条,上面写了一些只有服务器才能理解的数据,需要的时候客户端把这些信息发给服务器,服务器看到 Cookie,就能够认出对方是谁了。
工作流程:客户端第一次访问浏览器的时候,是不会存在cookie的,但是在浏览器收到的响应的报文中看到会有一个Set-Cookie,知道这个是服务器的身份标识,于是就会保存起来,下次在一次请求的时候,自动把这个值放到cookie中发给服务器。
因为二次请求有了cookie服务器就会知道这不是新的请求,因此就可以和服务器存储的cookie对比,进行定制化服务。
有时业务需求,服务端可以设置多个cookie:(客户端只需要在一个cookie字段中传输,用分号(:)分割)
因为cookie是在浏览器中存储的,因此只能在本浏览器中生效。如果换了浏览器,将会在一次重新生成。
cookie属性:因为cookie是浏览器中存储,会记录识别信息,因此需要设置一些保护,防止被盗取(以key=value的形式纯纯在Set-Cookie中)。
- 设置cookie的过期时间,过期失效(如果没有设置默认这次访问结束,cookie失效):
- Expires:过期时间,理解为失效时间。
- Max-Age(优先以其为准):单位秒,理解为多少秒后失效。(时间定为是以tcp/ip建立连接为准)
- 设置cookie的作用域(跨域无法传送cookie的原因):让浏览器仅发送给特定的服务器和URI,避免被其他网站盗用。
作用域设置:Domain和Path 分别指定cookie的域名和路径,浏览器在发送 Cookie 前会从 URI 中提取出 host 和 path 部分,对比 Cookie 的属性。如果不满足条件,就不会在请求头里发送 Cookie。
- js可以通过document.cookie来读写cookie数据,进行“跨站脚本”(xss)攻击窃取数据。=>防止其攻击。
“HttpOnly” 告诉浏览器,此 Cookie 只能通过浏览器 HTTP 协议传输,禁止其他方式访问,浏览器的 JS 引擎就会禁用 document.cookie 等一切相关的 API,脚本攻击也就无从谈起了。
- 另一个属性“SameSite”可以防范“跨站请求伪造”(XSRF)攻击,设置成“SameSite=Strict”可以严格限定 Cookie 不能随着跳转链接跨站发送,而“SameSite=Lax”则略宽松一点,允许 GET/HEAD 等安全方法,但禁止 POST 跨站发送。
- 还有一个属性叫“Secure”,表示这个 Cookie 仅能用 HTTPS 协议加密传输,明文的 HTTP 协议会禁止发送。但 Cookie 本身不是加密的,浏览器里还是以明文的形式存在。
总结:cookie传输是通过Domain和Path来限制访问是否可以携带cookie的。只要Domain指定了域名,那么浏览器就可以将cookie携带过去。Expires和Max-Age可以设置cookie的过期时间,只要过期将会失效。