外观
有哪些必须认识的请求头和响应头?
请求头描述客户端要什么、能接受什么、是否带身份。响应头描述数据是什么、能不能缓存、脚本能不能跨域读它。面试按缓存、内容协商、认证、安全四组说。
原理
请求:
Accept、Accept-Language、Accept-Encoding:能接受的类型、语言和压缩。Content-Type:正文的媒体类型。JSON 是application/json。Authorization:令牌。Cookie:浏览器按规则自动带上。Cache-Control、If-None-Match、If-Modified-Since:缓存验证。Origin、Referer:来源。跨域和 CSRF 校验会看它们。User-Agent:客户端标识,不要用它做安全判断。
响应:
Content-Type和Set-Cookie。Cache-Control、ETag、Last-Modified。Access-Control-Allow-*:CORS。Content-Security-Policy、Strict-Transport-Security。Location:重定向目标。
自定义头会让跨域请求变成预检。只在需要让脚本读取某个响应头时,才把它放进 Access-Control-Expose-Headers。
追问
Cookie 和 Authorization 怎么选?
浏览器自动发送、脚本不该读取的会话,用 HttpOnly Cookie。前后端分离、由脚本显式附加的令牌,用 Authorization。见 本地存储。
压缩头有什么用?
Accept-Encoding: br, gzip 让服务器选一种压缩。静态资源在构建或 CDN 上预压缩,比每次现场压缩省 CPU。
易错点
- 把令牌放在自定义头里,又没处理预检。
- 响应没写
Content-Type,浏览器会去猜,脚本也可能解析错。 - 用
User-Agent当鉴权。