HTTP/HTTPS — 是基础的数据传输协议,构成了互联网和移动应用中所有通信的基础。HTTP(超文本传输协议)定义了客户端和服务器之间请求和响应的格式,而HTTPS(HTTP安全版)通过TLS(传输层安全协议)或SSL(安全套接层)协议增加了加密。根据Google Transparency Report(2025),全球超过95%的网络流量已经使用HTTPS,Chrome和Safari浏览器将HTTP网站标记为不安全。理解HTTP与HTTPS之间的区别、请求结构和状态码 — 是每个处理网络请求的移动应用开发者的必要条件。
要点
HTTP(超文本传输协议)— 是OSI模型的应用层协议,用于在万维网上传输超文本文档和其他数据。由蒂姆·伯纳斯-李于1989年开发,HTTP经历了多个版本:从HTTP/0.9(仅GET请求和HTML响应)到现代的HTTP/2和HTTP/3。该协议遵循请求-响应模式:客户端向服务器发送请求,服务器处理请求并返回响应。
HTTPS(HTTP安全版)— 是HTTP协议的扩展,通过TLS(传输层安全协议)增加了加密层。HTTPS不是独立的协议 — 它是HTTP和TLS的组合。通过HTTPS传输的数据在客户端加密并在服务器解密,使其无法被拦截和篡改。HTTPS还通过SSL/TLS证书提供服务器认证,确保客户端连接到真实服务器而不是攻击者。
HTTP和HTTPS之间的关键区别在于安全性。HTTP以明文形式传输数据:客户端和服务器之间的任何网络节点都可以读取请求或响应的内容。HTTPS加密所有内容,包括URL、标头和请求体,只保留服务器的IP地址和连接端口可见。对于通过公共Wi-Fi网络工作的移动应用,HTTPS是强制性的安全要求。
HTTP — 是一种无状态协议,运行在TCP/IP之上。客户端与服务器建立TCP连接(通常HTTP使用80端口,HTTPS使用443端口),发送HTTP请求,接收HTTP响应并关闭连接(在HTTP/1.1中连接可以被重用)。客户端和服务器之间的每次交互都由一个请求和一个响应组成。无状态意味着服务器不存储有关客户端先前请求的信息 — 每个请求都独立处理。
HTTP交互过程包括以下步骤:
HTTP的一个重要特性是幂等性。GET、HEAD、PUT、DELETE和OPTIONS是幂等的:多次执行相同的请求不会在第一次执行后改变服务器状态。POST、PATCH和CONNECT不是幂等的 — 每次调用都可以创建新资源或更改状态。对于移动开发,理解幂等性至关重要:当因网络错误重新发送请求时,客户端必须知道重复该请求是否安全。
HTTPS 使用TLS(传输层安全协议)加密协议来保护传输的数据。TLS — 是SSL(安全套接层)的继承者,由Netscape公司于1995年开发。SSL 2.0和3.0版本被认为已过时且不安全;现代版本TLS 1.2(2008年发布)和TLS 1.3(2018年发布)被广泛使用。TLS 1.3尤其将连接建立时间从2次往返减少到1次,这显著加快了移动设备上的加载速度。
TLS握手过程包括以下阶段:
SSL/TLS证书验证 — 对安全至关重要的阶段。客户端检查证书是否:未过期、由受信任的证书颁发机构(CA)签名、与URL中的域名匹配以及未被撤销(通过CRL或OCSP)。在移动应用中,建议使用证书固定 — 绑定到特定证书或服务器的公钥。这即使在CA被攻破的情况下也能防止MITM攻击。然而,固定需要谨慎:当证书更改时,应用程序必须提前更新。
HTTP请求由三部分组成:起始行(request line)、标头(headers)和可选的主体(body)。起始行包含HTTP方法、请求URL和HTTP版本。标头传递元信息:内容类型、认证令牌、缓存设置。主体仅在传输数据的方法(POST、PUT、PATCH)中存在,在GET和DELETE中不存在。
向REST API发送HTTP请求的示例:
POST /api/v1/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Cache-Control: no-cache
{
"name": "安娜",
"email": "anna@example.com"
}
HTTP响应具有类似的结构:包含HTTP版本和状态码的起始行、标头和主体。状态码 — 确定请求处理结果的三位数字。响应标头包括Content-Type、Content-Length、Cache-Control、Set-Cookie等。响应主体包含以Content-Type中指定的格式(通常是API的JSON、网页的HTML、媒体内容的图像)请求的数据。
标头在HTTP工作中起着关键作用。Content-Type和Accept管理数据格式。Authorization传递访问令牌。Cache-Control管理缓存。CORS标头(Access-Control-Allow-Origin)控制浏览器中来自其他域的访问。User-Agent标识客户端应用程序。对于移动应用,缓存管理标头尤为重要 — 它们减少了传输的数据量并改善了弱信号下的性能。
HTTP状态码分为五类,由第一位数字表示:1xx(信息)、2xx(成功)、3xx(重定向)、4xx(客户端错误)、5xx(服务器错误)。理解这些代码对于在移动应用中正确处理响应是必要的:2xx表示成功,数据可以显示;4xx表示请求有问题(需要向用户显示错误);5xx — 服务器有问题(需要稍后重试请求)。
| 代码 | 名称 | 描述 | 客户端操作 |
|---|---|---|---|
| 200 | OK | 请求成功 | 处理数据 |
| 201 | Created | 资源已创建 | 更新UI |
| 301 | Moved Permanently | 资源已移至新URL | 更新代码中的URL |
| 400 | Bad Request | 无效请求 | 显示验证错误 |
| 401 | Unauthorized | 需要认证 | 重定向到登录 |
| 404 | Not Found | 资源未找到 | 显示404 |
| 429 | Too Many Requests | 超过请求限制 | 延迟后重试 |
| 500 | Internal Server Error | 服务器错误 | 稍后重试 |
对于移动应用,处理401 Unauthorized代码尤为重要。收到此代码后,客户端应尝试通过刷新令牌更新访问令牌并重试原始请求。如果令牌刷新也返回401,则应将用户重定向到登录屏幕。此逻辑通常在拦截器(OkHttp)或网络客户端的中间件层中实现。
HTTP/1.1于1999年发布,至今仍然是广泛使用的协议版本。其主要缺点是队头阻塞:对同一服务器的请求按顺序执行,每个后续请求等待前一个完成。为了绕过此限制,浏览器对同一域打开6–8个并行TCP连接,这增加了服务器负载和内存消耗。HTTP/1.1还以未加密形式传输标头,不支持服务器推送。
HTTP/2(2015)通过多路复用解决了阻塞问题 — 多个数据流通过单个TCP连接同时传输。服务器可以在客户端请求之前向客户端发送资源(服务器推送)。HTTP/2还通过HPACK压缩标头,减少了传输的数据量。对于移动应用,HTTP/2特别有用:一个连接代替多个连接,减少了TLS握手时间和电池消耗。
HTTP/3(2022)— 是最新版本的协议,使用QUIC(快速UDP互联网连接)代替TCP。QUIC运行在UDP之上,消除了传输协议级别的队头阻塞问题。HTTP/3在最佳情况下将连接建立时间减少到0次往返(在重复连接时)和首次连接时的1次往返,这比2–3次往返的HTTP/2快得多。对于移动设备,HTTP/3在Wi-Fi和移动网络之间切换时特别有效 — 连接不会中断,因为QUIC使用连接标识符而不是IP地址。
在移动应用中使用HTTPS — 不是建议,而是强制要求。从Android 9(API 28)和iOS 9(ATS — 应用传输安全)开始,所有网络请求默认必须使用HTTPS。HTTP请求被系统阻止,需要应用程序配置中的显式例外才能允许。Google Play商店和App Store拒绝通过HTTP传输敏感数据的应用程序,包括密码、令牌和个人数据。
Android移动应用中的HTTPS配置包括:
<!-- AndroidManifest.xml — 网络请求权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- network_security_config.xml — HTTPS配置 -->
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">api.example.com</domain>
<pin-set expiration="2027-12-31">
<pin digest="SHA-256">rDjsFv3bGf...</pin>
</pin-set>
</domain-config>
</network-security-config>
在iOS上,通过Info.plist中的NSAppTransportSecurity键进行类似配置。用于调试移动应用中的HTTPS流量,使用代理工具:Charles Proxy、Proxyman或mitmproxy。它们需要在设备上安装受信任的SSL证书。在生产构建中,应禁用调试功能,并确保证书固定配置正确。在Android上使用OkHttp及其CertificatePinner,或在iOS上使用TrustManager和SecTrustEvaluate — 是实现固定的标准方法。
移动开发中HTTPS安全的一个重要方面 — SSL固定。没有固定,应用程序信任由已知CA签名的任何证书。如果CA被攻破,攻击者可以拦截应用程序的流量。固定将应用程序绑定到特定证书或服务器的公钥。当服务器上的证书更改时,必须发布应用程序更新,因此固定需要预留计划 — 绑定到上级CA的证书或使用多个备用密钥。
常见问题
HTTP以明文形式传输数据,HTTPS通过TLS/SSL加密流量。HTTPS使用443端口,HTTP使用80端口。HTTPS需要SSL证书,并提供机密性、完整性和服务器认证。
是的,从Android 9和iOS 9开始,HTTPS默认是强制性的。HTTP请求会被系统阻止,除非在配置中明确允许。应用商店要求所有包含敏感数据的网络请求使用HTTPS。
SSL证书 — 确认服务器真实性的数字文档。由证书颁发机构(CA)颁发:Let’s Encrypt(免费)、Sectigo、DigiCert。开发中可以使用自签名证书。
HTTP/2支持多路复用(通过单个TCP连接进行多个请求)、标头压缩(HPACK)和服务器推送。与HTTP/1.1不同,HTTP/1.1中请求会相互阻塞(队头阻塞),HTTP/2并行发送数据。
证书固定 — 一种安全技术,应用程序只信任特定证书或公钥。推荐用于高安全要求的应用程序(银行、支付、医疗数据)。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。