HTTP 協(xié)議安全
1. 前言
上節(jié)我們討論了 HTTP 請求中,如何通過配置其頭部參數達到安全性提升的效果,本節(jié)將討論 HTTP 協(xié)議層面的安全性提升方法。
HTTP 通訊協(xié)議是一種明文傳輸協(xié)議,存在安全隱患,所以通常我們會使用 TLS 方式保障其安全。
本節(jié)我們主要討論 Spring Security 中的 HTTP 安全。
2. 關于 TLS
2.1 TLS 基本概念
TLS 是指傳輸層安全(Transport Layer Security)。
TLS 的作用包括:
- 機密性。保護消息的內容不被攻擊者獲取。
- 完整性。保護消息不被攻擊者篡改,是真實可靠的。
- 防重放。保護消息不被攻擊者截獲并再次發(fā)送。
- 身份識別。允許客戶端驗證服務器的可靠性(注意客戶端的真實性只有在客戶端認證開啟時才進行)。
TLS 同樣也被很多其他協(xié)議用于保護機密性和完整性,并且有多種用法。我們在這里主要關注的是基于 HTTP 協(xié)議的 B/S 應用,將它升級為 HTTPS。
2.2 SSL 和 TLS 的關系
我們常常聽到 HTTP + SSL = HTTPS 這樣的觀念,那 SSL 和 TLS 有什么關系呢?
SSL 的全稱是 Secure Socket Layer,安全套接字層。SSL 最初用于 HTTP 加密傳輸,也就是 HTTPS 的早期形態(tài),后來出現了 SSL v2 和 SSL v3,不過這兩個版本都有些瑕疵,于是出現了SSL v3.1,SSL v3.1 后該協(xié)議被重命名為 TLS,并從 1.0 從新編排版本,再往后出現了 v1.1、v1.2 和 v1.3。
所以,從某種意義上講 SSL、SSL/TLS、TLS 這三種寫法的含義是相同的,我們多數情況還是把 HTTP 的安全框架稱為 SSL。
3. TLS 的應用
Spring Security 作為一種安全框架,本身并不處理是否使用 HTTP 方式連接,也就是說它不能直接建立 HTTPS 連接。但是它提供了一系列方法,使我們的 HTTPS 操作更加遍歷。
3.1 重定向到 HTTPS
當客戶端使用 HTTP 向服務端發(fā)送請求時,Spring Security 可以將請求自動轉換為 HTTPS 的連接方式。
例如,如下代碼強制所有 HTTP 請求重定向為 HTTPS 請求:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) {
http.requiresChannel(channel -> channel.anyRequest().requiresSecure());
}
}
3.2 強制安全傳輸
Spring Security 提供了對強制安全傳輸的支持,并且其在默認情況下是開啟的。此部分在 HTTP 安全響應頭中也有過介紹。
例如,當我們訪問某個銀行網站「mybank.example.com」,當我們使用 https 方式訪問時,便避免了出現中間人攻擊。在開啟強制安全傳輸的情況下,瀏覽器將所有將要發(fā)送到服務端的請求都強制為 https 協(xié)議。
此功能默認被開啟,如果需要修改它的默認配置,可通過如下方式進行配置:
@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) // 強制期限
)
);
}
}
4. 小結
本節(jié)討論了通過 HTTP + SSL 的方式,規(guī)避 HTTP 協(xié)議在安全上的不足。
- HTTP 協(xié)議存在安全隱患,容易遭到惡意攻擊,例如中間人攻擊;
- HTTP 安全時傳輸層安全的范疇,可以通過重定向 HTTP 連接和強制安全傳輸的方式增加其安全性;
- Spring Security 支持通過配置將 HTTP 請求轉換為 HTTPS 請求;
- Spring Security 支持為 B/S 應用強制使用安全傳輸。
下節(jié)我們討論如果通過 Spring Security 統(tǒng)一不同 Web 容器間的訪問控制差異。