HTTP认证/授权方案(一):HTTP Basic

Posted by Lucky Xue on 2020-02-02

​在学习微服务安全架构与实践的过程中,发现有关HTTP认证或授权的方案有很多,为了避免混淆,经过收集整理网上的资料和阅读技术大牛的文章一步步总结后记录到该系列博客中。

概念

基本认证(HTTP Basic)是HTTP 1.0提出的一个非常传统的API认证技术,这个技术是一种用来允许Web浏览器或其他客户端程序在请求时提供用户名和密码口令形式的身份凭证的登录验证方式。HTTP认证是基于质询/回应(challenge/response)的模式,把"用户名+冒号+密码口令"用BASE64算法加密后的字符串放在Http Request中的header Authorization中发送给服务端。客户端对于每一个realm,通过提供用户名和密码来进行认证的方式,包括密码的明文传递。

HTTP请求报头:Authorization

HTTP响应报头:WWW-Authenticate

认证步骤

1、客户端访问一个受http基本认证保护的资源。
2、服务器返回401状态,要求客户端提供用户名和密码进行认证。(验证失败的时候,响应头会加上WWW-Authenticate: Basic realm=“请求域”。)
401 Unauthorized
WWW-Authenticate:Basic realm="WallyWorld"
3、客户端将输入的用户名密码用Base64进行编码后,采用非加密的明文方式传送给服务器。
Authorization: Basic xxxxxxxxxx
4、服务器将Authorization头中的用户名密码解码并取出,进行验证,如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。

注意事项

  • Http是无状态的,同一个客户端对同一个realm内资源的每一个访问会被要求进行认证。

  • 客户端通常会缓存用户名和密码,并和authentication realm一起保存,所以,一般不需要你重新输入用户名和密码。

  • 以非加密的明文方式传输,虽然转换成了不易被人直接识别的字符串,但是无法防止用户名密码被恶意盗用。虽然用肉眼看不出来,但用程序很容易解密。

优点

基本上所有流行的网页浏览器都支持基本认证。基本认证很少在可公开访问的互联网网站上使用,有时候会在小的私有系统中使用(如路由器网页管理接口)。后来的机制HTTP摘要认证是为替代基本认证而开发的,允许密钥以相对安全的方式在不安全的通道上传输。

程序员和系统管理员有时会在可信网络环境中使用基本认证,使用Telnet或其他明文网络协议工具手动地测试Web服务器。这是一个麻烦的过程,但是网络上传输的内容是人可读的,以便进行诊断。

缺点

虽然基本认证非常容易实现,但该方案建立在以下的假设的基础上,即:客户端和服务器主机之间的连接是安全可信的。特别是,如果没有使用SSL/TLS这样的传输层安全的协议,那么以明文传输的密钥和口令很容易被拦截。该方案也同样没有对服务器返回的信息提供保护。

现存的浏览器保存认证信息直到标签页或浏览器被关闭,或者用户清除历史记录。HTTP没有为服务器提供一种方法指示客户端丢弃这些被缓存的密钥。这意味着服务器端在用户不关闭浏览器的情况下,并没有一种有效的方法来让用户登出。

例子

Spring Boot Security实现Http基本认证的简单例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests().anyRequest().authenticated()
.and()
.httpBasic();
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication().withUser("admin").password("{noop}password").roles("USER");
}
}
continuous_deployment continuous_deployment

本文测试代码

SpringBoot-BasicAuth