跳转至

HTTP 与 HTTPS

学习目标

学完本章后,学习者应该能够:

  1. 理解 HTTP 报文、Header、Cookie、Cache 和 CORS。
  2. 区分 HTTP/1.1、HTTP/2、HTTP/3 的核心差异。
  3. 理解 HTTPS、TLS 握手、证书、CA、SNI 和 mTLS。
  4. 能设计 Go HTTP 服务和客户端的基础超时策略。

HTTP 报文

HTTP 请求包含:

  • 请求行:方法、路径、协议版本。
  • Header:元信息。
  • Body:请求体。

HTTP 响应包含:

  • 状态行:协议版本、状态码。
  • Header:元信息。
  • Body:响应体。

后端工程师需要理解方法语义、状态码、Header 和 Body 的边界。

Header、Cookie、Cache、CORS

常见 Header:

  • Content-Type:请求或响应格式。
  • Authorization:认证信息。
  • User-Agent:客户端信息。
  • X-Request-ID:请求追踪。
  • Cache-Control:缓存策略。

Cookie 常用于浏览器会话,但服务端 API 不应该把认证、跨域、安全全部交给 Cookie 默认行为。

CORS 是浏览器安全策略,不是服务端之间调用的网络限制。

HTTP/1.1、HTTP/2、HTTP/3

版本 关键特点
HTTP/1.1 长连接、管线化有限、文本协议
HTTP/2 二进制分帧、多路复用、Header 压缩
HTTP/3 基于 QUIC,改善部分队头阻塞问题

HTTP/2 常用于 gRPC。HTTP/3 基于 QUIC,依赖 UDP。

HTTPS 与 TLS

HTTPS = HTTP over TLS。

TLS 提供:

  • 加密。
  • 完整性保护。
  • 服务端身份认证。
  • 可选客户端身份认证。

证书由 CA 签发,客户端通过信任链验证服务端身份。SNI 让客户端在 TLS 握手时告诉服务端要访问哪个域名,方便同一 IP 承载多个证书。

mTLS 是双向 TLS,客户端也需要证书,常用于内部服务、零信任或高安全场景。

Go 后端实际应用例子

例子一:HTTP Server 设置超时

srv := &http.Server{
    Addr:              ":8080",
    Handler:           handler,
    ReadHeaderTimeout: 2 * time.Second,
    ReadTimeout:       5 * time.Second,
    WriteTimeout:      10 * time.Second,
    IdleTimeout:       60 * time.Second,
}

if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
    return err
}

不要直接使用没有超时配置的默认 Server 暴露公网服务。

例子二:给响应设置正确 Content-Type

func writeJSON(w http.ResponseWriter, status int, v any) error {
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    w.WriteHeader(status)
    return json.NewEncoder(w).Encode(v)
}

Header 不是装饰,它会影响客户端如何解析响应、缓存响应和处理安全策略。

常见误区

  • 误区一:HTTP 状态码随便返回 200 就行。

状态码是 API 契约的一部分。错误都返回 200 会破坏监控、重试和调用方判断。

  • 误区二:CORS 是后端服务之间调用失败的原因。

CORS 是浏览器策略,后端服务直接调用不受浏览器 CORS 限制。

  • 误区三:HTTPS 只要有证书就一定安全。

还要关注证书有效期、域名匹配、TLS 版本、私钥安全、mTLS 需求和中间代理配置。

线上问题案例

某服务证书过期后,浏览器和移动端全部访问失败。服务端业务日志没有明显错误,因为请求在 TLS 握手阶段就失败了。

修复方式是建立证书过期监控,自动续期,发布前检查证书链,并在网关层记录 TLS 握手失败指标。

实战任务

设计一个生产级 Go HTTP Server 的基础配置:

  1. 设置读取 Header 超时。
  2. 设置读写超时。
  3. 设置 Idle Timeout。
  4. 支持优雅退出。
  5. 说明为什么不直接用默认配置。
参考答案

可以使用 http.Server 显式配置 ReadHeaderTimeoutReadTimeoutWriteTimeoutIdleTimeout。公网服务尤其要设置 ReadHeaderTimeout,避免慢速客户端长期占用连接。优雅退出可以监听 SIGTERM 后调用 Shutdown(ctx)

不建议直接使用 http.ListenAndServe 的默认 Server 暴露公网服务,因为默认超时不完整,遇到慢连接、恶意请求或网络异常时,连接可能长期占用资源。

面试题

1. HTTP/1.1 和 HTTP/2 有什么区别?

参考答案

HTTP/1.1 是文本协议,支持长连接,但同一连接上的并发能力有限。HTTP/2 使用二进制分帧,支持多路复用和 Header 压缩,能在一个连接上并发多个请求。

gRPC 默认基于 HTTP/2,因此理解 HTTP/2 对理解 gRPC 很重要。

2. TLS 证书解决什么问题?

参考答案

TLS 证书用于证明服务端身份,并建立加密通信。客户端通过 CA 信任链验证证书是否由可信机构签发、域名是否匹配、证书是否过期。

证书不能保证业务没有漏洞,但能防止很多中间人攻击和明文泄露风险。

3. 什么是 mTLS?

参考答案

mTLS 是双向 TLS。普通 HTTPS 通常只验证服务端证书,mTLS 同时要求客户端也提供证书,服务端验证客户端身份。

它常用于内部服务调用、零信任网络、高安全 API 和服务网格场景。