为何Fetch不允许在URL中携带凭证?该做法是否为不良实践?
Fetch禁止URL携带凭证的原因及相关疑问解答
示例代码与报错情况
尝试在Fetch中通过URL直接携带凭证的代码如下:
fetch('https://test:test@example.com').catch(console.error)
执行这段代码会触发如下错误:
类型错误:无法在Window上执行'fetch':无法从包含凭证的URL构造请求
这一行为完全符合Fetch规范的规定:
如果解析后的URL包含凭证,则抛出TypeError。
为什么要设置这个限制?
- 安全风险失控:URL里的凭证会被多渠道记录——浏览器地址栏、服务器访问日志、代理日志、浏览器历史记录,甚至可能被页面第三方脚本读取,泄露概率极高。
- 违背安全传输原则:哪怕用HTTPS加密传输,URL中的凭证在传输前就已以明文形式存在于多个存储环节,根本起不到保密作用。
- 避免低级失误:开发者很容易在调试、分享链接时不小心带上凭证,这个限制相当于强制踩刹车,从根源上杜绝这类危险的失误。
URL中携带凭证是不是不良实践?
毫无疑问是不良实践,核心原因有这些:
- 凭证明文暴露,会被多渠道留存,等于把敏感信息直接摆在明面上,几乎没有保密能力。
- 一旦包含凭证的URL泄露,只能通过修改凭证来补救,不仅操作麻烦,还可能影响正常业务运行。
- 现代安全认证方案(比如Bearer Token、Cookie授权、OAuth2协议)都采用了更安全的传输方式,早就淘汰了在URL里塞凭证的做法。
内容的提问来源于stack exchange,提问作者Konrad
相关产品推荐
相关产品推荐

