在服务人员内部读取请求标头

时间:2019-11-28 11:16:49

标签: javascript request header service-worker

我创建了一个非常基本的服务工作者,它在fetch事件上记录请求标头:

self.addEventListener('fetch', event => {
  console.log("- Fetch -");
  for (const pair of event.request.headers.entries()) {
    console.log(pair[0]+ ': '+ pair[1]);
  }
});

在主页上,我这样提取同一页面:

function fetchPage() {
   fetch(location.href);
}

记录标题时,我只会得到以下2个标题:

- Fetch -
service-worker.js:12 accept: */*
service-worker.js:12 user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36

为什么我看不到其他/自定义标题?
这是安全限制吗?

1 个答案:

答案 0 :(得分:4)

是的,这些标题是有意隐藏的。标头列表和请求对象的一般行为在Fetch standard中指定。

非规范的section "HTTP header layer division" in that specification解释说,请求分三个阶段进行,所有这些阶段都可以修改标头列表,而依赖于Fetch和Service Worker规范的客户端代码只能访问前两个。因此,您的服务人员会在添加其他标头之前立即收到标头列表。

Fetch规范还包含forbidden header names的列表,客户端代码在任何情况下都无法设置。这些标头完全由用户代理控制。还有其他一些机制可以将客户端代码访问限制在标头列表中,例如与CORS相关的那些机制。

所有这些的原因确实是安全性:这保证了某些标头不会被试图执行请求伪造的恶意脚本代码读取或篡改(伪造服务器可能依赖于来自可信来源的恶意标头),浏览器指纹识别(通过HTTP标头标识用户)或秘密提取(例如,从请求标头中窃取Cookie)。