我们常见的 Web 认证方式有3种:
-
HTTP Basic Auth
-
Cookie
-
Token 验证
第一种 HTTP Basic Auth 已经很少使用,但最近使用 OpenCode 时,发现它的 Web UI 还在采用这种认证方式。
今天就来回顾一下这种最简单也最不安全的认证方式——HTTP Basic Auth。
一、什么是 HTTP Basic Auth
它是 HTTP 协议的一部分,浏览器和 Web 服务器(Nginx/Apache 等)原生支持,开发者通常无需自己编写客户端代码,服务端也只需简单配置即可实现。
二、HTTP Basic Auth 认证过程
-
客户端向服务器请求数据(可能是网页或 AJAX 异步请求),此时客户端尚未被验证,发送的请求如下:
GET /index.html HTTP/1.1 Host:www.httpbasic.com -
服务器向客户端返回 401 验证请求,服务器返回数据大致如下:
核心是浏览器依赖 WWW-Authenticate: Basic 来决定弹出登录框,如果返回 401 但没有这个 header,浏览器通常不会弹出原生登录框,而是直接显示 401 错误页面
HTTP/1.1 401 Unauthorized Server: SokEvo/1.1 WWW-Authenticate: Basic realm="Function1" -
浏览器收到 401 后,会自动弹出登录窗口,要求用户输入用户名和密码。
-
用户输入用户名和密码后,浏览器会将用户名及密码以 BASE64 编码方式处理,并将编码后的内容放入请求头中,此时客户端发送的请求变为:
GET /index.html HTTP/1.1 Host:www.httpbasic.com Authorization: Basic dXNlcjpwYXNzd29yZA==注:dXNlcjpwYXNzd29yZA== 是编码后的用户名及密码,编码规则是用base64给"用户名:密码"生成编码,由浏览器自动完成,无需人工编码
-
服务器收到请求后,取出 Authorization 字段后的用户信息并解码,将解码后的用户名和密码与用户数据库进行比对验证;若验证通过,服务器则根据请求,将资源返回给客户端。
三、认证效果与凭据缓存
1. 认证效果
客户端未认证时,会弹出用户名密码输入框,此时请求处于 pending 状态;用户输入用户名密码后可访问。
浏览器不提供 logout 功能,仅当浏览器关闭时,Basic 认证才会失效。
2. 账号密码缓存
账号密码在浏览器中主要缓存在内存,主流浏览器中,其生命周期如下:
-
关闭标签页 → 缓存通常仍保留(重新访问同一站点一般无需重新登录)
-
关闭整个浏览器 → 缓存一般会被清空
3. Realm(认证域/保护空间)
Realm 是 HTTP Basic Auth 中用来划分认证边界、管理凭据缓存、区分权限的核心机制,具体特点如下:
-
浏览器以「协议 + 主机 + 端口 + Realm」作为唯一缓存键
-
其中一项不同,就视为全新的认证域,必须重新登录
-
最常用场景:按路径/功能划分 Realm,实现权限隔离
-
下面的 Nginx 配置示例,能清晰体现 Realm 的用途
server { listen 443 ssl; server_name www.httpbasic.com; # 管理员区域 - Realm: Admin location /admin/ { auth_basic "Admin"; auth_basic_user_file /etc/nginx/.htpasswd_admin; # 专用账号文件 } # API 接口区域 - Realm: API location /api/ { auth_basic "API"; auth_basic_user_file /etc/nginx/.htpasswd_api; # 另一组账号 } # 公共文档 - 无认证 location /docs/ { allow all; } }
四、HTTP Basic Auth 的优缺点
1. 缺点
-
数据不安全:传输过程中仅对账号密码进行编码,未进行加密,约等于明文传输
-
每次请求都携带凭证,增加泄露风险
-
无法实现安全的登出
-
不支持多因素、精细权限控制
2. 优点
-
简单:浏览器和代理服务器(如 Nginx)默认支持,无需服务端和客户端额外开发代码。
-
全请求认证:连同静态数据(如前端 JS、图片等)一起进行认证,避免了其他认证方式中静态资源可被随意访问的问题,能有效杜绝爬虫、盗链等行为。
五、适用场景
-
内部使用的系统(范围可控、低敏感),且必须配合 HTTPS 使用(否则极度危险)
-
纯静态站点(无需复杂认证逻辑,仅需简单访问控制)
891

被折叠的 条评论
为什么被折叠?



