大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
Basic 认证
HTTP Basic Authentication 把 用户名:密码 做 Base64 编码放进 Authorization 头——实现极简,适合 机器对机器、内网工具、临时保护,不适合作为面向公众的 主登录方式。后端工程师应知道如何启用、为何 必须 HTTPS,以及何时改用 Token 或 OAuth。
学习目标
- 构造与解析
Authorization: Basic ...头 - 在 Spring Security 中配置 HTTP Basic 与关闭 CSRF 的场景
- 判断 Basic 是否适合当前 API 场景
协议格式
GET /api/internal/metrics HTTP/1.1
Host: api.example.com
Authorization: Basic dXNlcjpwYXNzd29yZA==
dXNlcjpwYXNzd29yZA== 解码为 user:password。Base64 不是加密,HTTP 明文传输等于 公开密码。生产 仅允许 HTTPS(sec-ssl)。
细节见 http-headers 中 Authorization 一节。
浏览器行为
访问受 Basic 保护的 URL 时,浏览器弹 原生登录框,成功后 自动带头 直到关闭标签。SPA 通常 不用 Basic 做主登录(体验差、难做 SSO)。
Spring Security 示例
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/actuator/**").hasRole("OPS")
.anyRequest().authenticated())
.httpBasic(Customizer.withDefaults());
配合 内存或 DB 用户:
@Bean
public UserDetailsService users(PasswordEncoder encoder) {
UserDetails ops = User.builder()
.username("ops")
.password(encoder.encode(System.getenv("OPS_PASSWORD")))
.roles("OPS")
.build();
return new InMemoryUserDetailsManager(ops);
}
密码仍应 bcrypt 存储(sec-hash),环境变量 轮换。
适用场景
| 适合 | 不适合 |
|---|---|
| 内部运维接口、短期 PoC | 移动端 / SPA 主登录 |
| curl / 脚本调 API | 需要 refresh、细粒度 scope |
| 开发环境快速挡一层 | 跨域前端(预检 + 凭据复杂) |
面向用户的认证优先:Cookie 会话、Bearer JWT、OAuth 授权码(oauth-flows)。
安全注意
- 强制 TLS;内网也建议 TLS 或 mTLS
- 限流登录失败,防暴力破解(sec-owasp A07)
- 专用账号,不用个人主账号密码
- 日志脱敏:access log 不要记录完整 Authorization 头
- 与 CSRF:纯 Basic + 无 Cookie 的 stateless API 往往 关闭 CSRF;若有 Cookie 会话则另论(sec-auth-cookie)
与 Digest 认证
HTTP Digest 很少在现代 API 使用;知道存在即可,新项目勿选。
练习
- 用 curl
-u user:pass调本地受保护端点,用-v查看请求头 - 说明:为何 Base64 编码不能替代 sec-ssl
- 对比 Basic 与 sec-auth-token Bearer 在「密码是否每次上传」上的差异
小结
Basic = 简单 + 每次带密码,仅限 HTTPS 与可信客户端。 下一课 Bearer Token 与 JWT 注意点。