HTTP/HTTPS 协议
问题
HTTP 和 HTTPS 的区别?iOS 中如何处理 HTTPS?
答案
HTTP 请求方法
| 方法 | 幂等 | 用途 |
|---|---|---|
| GET | ✅ | 获取资源 |
| POST | ❌ | 创建资源 |
| PUT | ✅ | 替换资源 |
| PATCH | ❌ | 部分更新 |
| DELETE | ✅ | 删除资源 |
常见状态码
| 范围 | 含义 | 示例 |
|---|---|---|
| 2xx | 成功 | 200 OK、201 Created、204 No Content |
| 3xx | 重定向 | 301 永久重定向、304 Not Modified |
| 4xx | 客户端错误 | 400 Bad Request、401 Unauthorized、404 Not Found |
| 5xx | 服务端错误 | 500 Internal Error、502 Bad Gateway、503 Unavailable |
HTTPS = HTTP + TLS
App Transport Security(ATS)
iOS 9+ 默认要求所有网络请求使用 HTTPS:
<!-- Info.plist:允许特定域名 HTTP -->
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
不要关闭 ATS
<!-- ❌ 不推荐:禁用所有 ATS → App Store 审核可能被拒 -->
<key>NSAllowsArbitraryLoads</key>
<true/>
常见面试问题
Q1: HTTP/1.1、HTTP/2、HTTP/3 的区别?
答案:
- HTTP/1.1:文本协议,Keep-Alive 复用连接,但有队头阻塞
- HTTP/2:二进制分帧、多路复用(一个 TCP 连接并发多个请求)、头部压缩、服务器推送
- HTTP/3:基于 QUIC(UDP),解决 TCP 层队头阻塞
URLSession 在 iOS 15+ 自动支持 HTTP/3。
Q2: HTTPS 中间人攻击如何防御?
答案:使用 SSL Pinning(证书固定),在客户端校验服务器证书的公钥或指纹,防止中间人伪造证书。可以在 URLSessionDelegate 的 urlSession(_:didReceive challenge:) 中实现。