You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS Express基础认证疑问:浏览器自动携带Authorization头原因

问题描述

我是NodeJS新手,在Express中实现了一个基础认证接口,代码里未设置JWT或Session Cookie,浏览器中也不存在sessionId。按预期,每次刷新页面(或手动清除所有Cookie、缓存后刷新)都应重新要求输入凭证,但实际浏览器仍会自动发送正确的Authorization请求头,特此咨询原因。接口代码如下:

app.get('/cms', function (req, res) {

    const reject = () => {
        res.setHeader("www-authenticate", "Basic");
        res.sendStatus(401);
    };
    const authorization = req.headers.authorization;

    if (!authorization) {
        return reject();
    }
    const [username, password] = Buffer.from(
        authorization.replace("Basic ", ""),
        "base64"
    )
        .toString()
        .split(":");

    if (!(username === "user" && password === "pass")) {
        return reject();
    }
    res.status(200)
    res.sendFile(path.join(__dirname+'/cms.html'));
});
原因分析

这是浏览器对HTTP Basic认证的默认行为:一旦你成功输入过一次凭证,浏览器会将这些账号密码保存到专门的凭证存储区(不同浏览器命名不同,比如Chrome叫「密码管理器」),而非Cookie或普通缓存里。之后只要是向同一域名发起的请求,浏览器就会自动带上Authorization头,哪怕你清除了Cookie和缓存也不会影响这个存储。

验证与解决方法
  • 打开浏览器的密码管理功能(比如Chrome:设置→隐私和安全→密码管理器),找到对应域名下的该账号密码条目并删除。
  • 再次刷新页面,浏览器就会重新弹出认证窗口要求输入凭证了。
额外提醒

HTTP Basic认证的凭证只是经过Base64编码,并非加密处理,所以生产环境中必须配合HTTPS使用,避免凭证在传输过程中被截获。

内容的提问来源于stack exchange,提问作者Pawel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:18:30