上节我们讨论了 HTTP 请求中,如何通过配置其头部参数达到安全性提升的效果,本节将讨论 HTTP 协议层面的安全性提升方法。
HTTP 通讯协议是一种明文传输协议,存在安全隐患,所以通常我们会使用 TLS 方式保障其安全。
本节我们主要讨论 Spring Security 中的 HTTP 安全。
TLS 是指传输层安全(Transport Layer Security)。
TLS 的作用包括:
TLS 同样也被很多其他协议用于保护机密性和完整性,并且有多种用法。我们在这里主要关注的是基于 HTTP 协议的 B/S 应用,将它升级为 HTTPS。
我们常常听到 HTTP + SSL = HTTPS 这样的观念,那 SSL 和 TLS 有什么关系呢?
SSL 的全称是 Secure Socket Layer,安全套接字层。SSL 最初用于 HTTP 加密传输,也就是 HTTPS 的早期形态,后来出现了 SSL v2 和 SSL v3,不过这两个版本都有些瑕疵,于是出现了SSL v3.1,SSL v3.1 后该协议被重命名为 TLS,并从 1.0 从新编排版本,再往后出现了 v1.1、v1.2 和 v1.3。
所以,从某种意义上讲 SSL、SSL/TLS、TLS 这三种写法的含义是相同的,我们多数情况还是把 HTTP 的安全框架称为 SSL。
Spring Security 作为一种安全框架,本身并不处理是否使用 HTTP 方式连接,也就是说它不能直接建立 HTTPS 连接。但是它提供了一系列方法,使我们的 HTTPS 操作更加遍历。
当客户端使用 HTTP 向服务端发送请求时,Spring Security 可以将请求自动转换为 HTTPS 的连接方式。
例如,如下代码强制所有 HTTP 请求重定向为 HTTPS 请求:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) {
http.requiresChannel(channel -> channel.anyRequest().requiresSecure());
}
}
Spring Security 提供了对强制安全传输的支持,并且其在默认情况下是开启的。此部分在 HTTP 安全响应头中也有过介绍。
例如,当我们访问某个银行网站「mybank.example.com」,当我们使用 https 方式访问时,便避免了出现中间人攻击。在开启强制安全传输的情况下,浏览器将所有将要发送到服务端的请求都强制为 https 协议。
此功能默认被开启,如果需要修改它的默认配置,可通过如下方式进行配置:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ...
.headers(headers -> headers
.httpStrictTransportSecurity(hsts -> hsts
.includeSubDomains(true) // 包含子域名
.preload(true) // 增加到浏览器内置的 HTTPS 列表
.maxAgeInSeconds(31536000) // 强制期限
)
);
}
}
本节讨论了通过 HTTP + SSL 的方式,规避 HTTP 协议在安全上的不足。
下节我们讨论如果通过 Spring Security 统一不同 Web 容器间的访问控制差异。
0/1000