HTTP 和 HTTPS 的区别

HTTP 和 HTTPS 的区别

HTTP 和 HTTPS,别只背"多了个 S"。

前言

大家好,我是程序员有点困。

很多人第一次学 HTTP 和 HTTPS 的时候,最容易记住一句话:

HTTPS 比 HTTP 多了一个 SSL/TLS 加密。

这句话不能说错,但如果面试只答到这里,基本就停在表层了。

因为面试官真正想听的不是"HTTPS 多了加密",而是想知道:

  • HTTP 为什么不安全?
  • HTTPS 到底解决了什么问题?
  • HTTPS 是怎么保证安全的?
  • 为什么有了加密还需要证书?
  • HTTPS 会不会影响性能?
  • 项目里什么时候必须用 HTTPS?

先醒醒神,我们别急着背定义,先从一个真实场景开始看。


一、问题背景:HTTP 为什么会有安全问题?

假设你在浏览器里访问一个网站:

text 复制代码
http://example.com/login

然后输入用户名和密码。

如果这个网站使用的是 HTTP,那么浏览器和服务器之间传输的数据,默认是明文传输

也就是说,请求内容大概可能长这样:

http 复制代码
POST /login HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "username": "zhangsan",
  "password": "123456"
}

问题来了。

如果中间有人能截获这段请求,比如在公共 Wi-Fi、代理服务器、运营商链路或者某些被劫持的网络环境里,他就可能直接看到你的账号密码。

这就是 HTTP 最大的问题:它只负责把数据传过去,但不负责保护数据。

HTTP 主要有三个安全风险:

问题 含义 举例
窃听风险 数据是明文,别人可能看见 登录密码被抓包看到
篡改风险 数据中途可能被改 返回页面被插入广告
冒充风险 无法确认对方是不是目标网站 你以为连的是银行,其实是假的服务器

所以,HTTP 并不是不能用,而是它不适合传输敏感数据。

这里有点困建议你先记住一句话:HTTP 解决的是通信问题,HTTPS 解决的是安全通信问题。


二、先用人话理解 HTTP 和 HTTPS

先别急着看各种协议名。

我们可以先这样理解:

HTTP 就像寄明信片。

你写的内容,邮递员、分拣站、中途任何经过的人,只要想看,都可能看到。

HTTPS 就像把信装进加密信封里,并且还要确认收信人身份。

别人就算截到了,也看不懂里面内容;同时你还能确认,这封信确实是发给真正的网站,而不是冒牌网站。

从正式角度说:

  • HTTP,全称是 HyperText Transfer Protocol,超文本传输协议
  • HTTPS,全称可以理解为 HTTP over SSL/TLS
  • HTTPS 不是一个全新的应用层协议,而是在 HTTP 和 TCP 之间加了一层 SSL/TLS 安全层

可以简单画成这样:
#mermaid-svg-uUpNNadVmfUoCsVx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uUpNNadVmfUoCsVx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uUpNNadVmfUoCsVx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uUpNNadVmfUoCsVx .error-icon{fill:#552222;}#mermaid-svg-uUpNNadVmfUoCsVx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uUpNNadVmfUoCsVx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uUpNNadVmfUoCsVx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uUpNNadVmfUoCsVx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uUpNNadVmfUoCsVx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uUpNNadVmfUoCsVx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uUpNNadVmfUoCsVx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uUpNNadVmfUoCsVx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uUpNNadVmfUoCsVx .marker.cross{stroke:#333333;}#mermaid-svg-uUpNNadVmfUoCsVx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uUpNNadVmfUoCsVx p{margin:0;}#mermaid-svg-uUpNNadVmfUoCsVx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uUpNNadVmfUoCsVx .cluster-label text{fill:#333;}#mermaid-svg-uUpNNadVmfUoCsVx .cluster-label span{color:#333;}#mermaid-svg-uUpNNadVmfUoCsVx .cluster-label span p{background-color:transparent;}#mermaid-svg-uUpNNadVmfUoCsVx .label text,#mermaid-svg-uUpNNadVmfUoCsVx span{fill:#333;color:#333;}#mermaid-svg-uUpNNadVmfUoCsVx .node rect,#mermaid-svg-uUpNNadVmfUoCsVx .node circle,#mermaid-svg-uUpNNadVmfUoCsVx .node ellipse,#mermaid-svg-uUpNNadVmfUoCsVx .node polygon,#mermaid-svg-uUpNNadVmfUoCsVx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uUpNNadVmfUoCsVx .rough-node .label text,#mermaid-svg-uUpNNadVmfUoCsVx .node .label text,#mermaid-svg-uUpNNadVmfUoCsVx .image-shape .label,#mermaid-svg-uUpNNadVmfUoCsVx .icon-shape .label{text-anchor:middle;}#mermaid-svg-uUpNNadVmfUoCsVx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uUpNNadVmfUoCsVx .rough-node .label,#mermaid-svg-uUpNNadVmfUoCsVx .node .label,#mermaid-svg-uUpNNadVmfUoCsVx .image-shape .label,#mermaid-svg-uUpNNadVmfUoCsVx .icon-shape .label{text-align:center;}#mermaid-svg-uUpNNadVmfUoCsVx .node.clickable{cursor:pointer;}#mermaid-svg-uUpNNadVmfUoCsVx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uUpNNadVmfUoCsVx .arrowheadPath{fill:#333333;}#mermaid-svg-uUpNNadVmfUoCsVx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uUpNNadVmfUoCsVx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uUpNNadVmfUoCsVx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uUpNNadVmfUoCsVx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uUpNNadVmfUoCsVx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uUpNNadVmfUoCsVx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uUpNNadVmfUoCsVx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uUpNNadVmfUoCsVx .cluster text{fill:#333;}#mermaid-svg-uUpNNadVmfUoCsVx .cluster span{color:#333;}#mermaid-svg-uUpNNadVmfUoCsVx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uUpNNadVmfUoCsVx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uUpNNadVmfUoCsVx rect.text{fill:none;stroke-width:0;}#mermaid-svg-uUpNNadVmfUoCsVx .icon-shape,#mermaid-svg-uUpNNadVmfUoCsVx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uUpNNadVmfUoCsVx .icon-shape p,#mermaid-svg-uUpNNadVmfUoCsVx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uUpNNadVmfUoCsVx .icon-shape .label rect,#mermaid-svg-uUpNNadVmfUoCsVx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uUpNNadVmfUoCsVx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uUpNNadVmfUoCsVx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uUpNNadVmfUoCsVx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} HTTP
TCP
IP 网络
HTTPS
SSL/TLS
TCP
IP 网络

这张图重点看一件事:HTTPS 本质上还是 HTTP,只是 HTTP 在发送数据前,会先经过 SSL/TLS 做加密和安全校验。


三、HTTP 和 HTTPS 的核心区别

知道了大概区别后,我们用一张表把它们放一起对比。

对比项 HTTP HTTPS
默认端口 80 443
数据传输 明文传输 加密传输
安全性 不安全,容易被窃听和篡改 更安全,可以防窃听、防篡改、防冒充
是否需要证书 不需要 需要 CA 证书
URL 开头 http:// https://
性能成本 较低 多了 TLS 握手和加解密成本
适用场景 内网、非敏感资源 登录、支付、接口、生产环境网站

但要注意,HTTPS 不是"绝对安全"。

它解决的是传输过程中的安全问题,比如防止数据被别人看见、修改、冒充。

如果你的网站本身代码有漏洞,比如 SQL 注入、越权访问、弱密码,那 HTTPS 也救不了。


四、HTTPS 到底是怎么保证安全的?

HTTPS 主要解决三个问题:

  1. 数据不能被别人看懂
  2. 数据不能被别人偷偷修改
  3. 我要确认连接的是真服务器

这三个问题分别对应:

安全目标 HTTPS 的做法
防窃听 加密传输
防篡改 摘要校验 / MAC / AEAD
防冒充 CA 证书验证服务器身份

听起来有点抽象,我们拆开看。


1. 加密:让别人截到也看不懂

HTTPS 会对传输数据进行加密。

但这里有个问题:加密需要密钥。

如果浏览器和服务器直接把密钥在网络上传来传去,那中间人也能截获密钥,这样加密就没意义了。

所以 HTTPS 通常会结合两类加密方式:

加密方式 特点 用途
非对称加密 公钥加密,私钥解密,安全但慢 用来协商密钥
对称加密 同一个密钥加密和解密,速度快 用来加密真正的数据传输

可以理解为:

  • 非对称加密负责"安全地交换钥匙"
  • 对称加密负责"后续大量数据加密传输"

这就是为什么 HTTPS 不是全程只用非对称加密。

因为非对称加密虽然安全,但性能成本高;真正传网页、图片、接口数据时,还是对称加密更合适。


2. 证书:证明服务器不是冒牌货

光有加密还不够。

假设你要访问:

text 复制代码
https://bank.example.com

浏览器怎么知道对方真的是银行服务器?

如果中间人伪造了一个服务器,也给你发一个公钥,你如果直接相信它,那后续加密通信其实就是和攻击者通信。

所以 HTTPS 引入了证书机制。

证书可以理解为服务器的"身份证",里面通常包含:

  • 域名信息
  • 服务器公钥
  • 证书有效期
  • 证书颁发机构 CA
  • CA 的数字签名

浏览器会校验证书,比如:

  • 证书是不是可信 CA 签发的
  • 证书有没有过期
  • 证书里的域名和当前访问域名是否匹配
  • 证书有没有被吊销

如果校验不通过,浏览器就会提示"不安全"或者阻止访问。


3. 完整性校验:防止数据中途被改

除了不让别人看懂,还要防止别人偷偷改数据。

比如服务器返回:

json 复制代码
{
  "amount": 100
}

中间人如果把它改成:

json 复制代码
{
  "amount": 10000
}

那就很危险。

HTTPS 会通过消息认证码或者认证加密方式来保证数据完整性。

你可以先不用死记具体算法,先理解核心思想:

接收方不仅要解密数据,还要验证数据有没有被改过。

只要中途数据被动过,校验就会失败。


五、HTTPS 的请求流程是怎样的?

平时我们说"HTTPS 比 HTTP 多了 TLS 握手",这个 TLS 握手到底干了什么?

可以把流程简化成这样:
CA证书机构 服务器 浏览器 CA证书机构 服务器 浏览器 #mermaid-svg-KokKzKQ35B9WKTP6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KokKzKQ35B9WKTP6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KokKzKQ35B9WKTP6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KokKzKQ35B9WKTP6 .error-icon{fill:#552222;}#mermaid-svg-KokKzKQ35B9WKTP6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KokKzKQ35B9WKTP6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KokKzKQ35B9WKTP6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KokKzKQ35B9WKTP6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KokKzKQ35B9WKTP6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KokKzKQ35B9WKTP6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KokKzKQ35B9WKTP6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KokKzKQ35B9WKTP6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KokKzKQ35B9WKTP6 .marker.cross{stroke:#333333;}#mermaid-svg-KokKzKQ35B9WKTP6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KokKzKQ35B9WKTP6 p{margin:0;}#mermaid-svg-KokKzKQ35B9WKTP6 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-KokKzKQ35B9WKTP6 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-KokKzKQ35B9WKTP6 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-KokKzKQ35B9WKTP6 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-KokKzKQ35B9WKTP6 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-KokKzKQ35B9WKTP6 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-KokKzKQ35B9WKTP6 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-KokKzKQ35B9WKTP6 .sequenceNumber{fill:white;}#mermaid-svg-KokKzKQ35B9WKTP6 #sequencenumber{fill:#333;}#mermaid-svg-KokKzKQ35B9WKTP6 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-KokKzKQ35B9WKTP6 .messageText{fill:#333;stroke:none;}#mermaid-svg-KokKzKQ35B9WKTP6 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-KokKzKQ35B9WKTP6 .labelText,#mermaid-svg-KokKzKQ35B9WKTP6 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-KokKzKQ35B9WKTP6 .loopText,#mermaid-svg-KokKzKQ35B9WKTP6 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-KokKzKQ35B9WKTP6 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-KokKzKQ35B9WKTP6 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-KokKzKQ35B9WKTP6 .noteText,#mermaid-svg-KokKzKQ35B9WKTP6 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-KokKzKQ35B9WKTP6 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-KokKzKQ35B9WKTP6 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-KokKzKQ35B9WKTP6 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-KokKzKQ35B9WKTP6 .actorPopupMenu{position:absolute;}#mermaid-svg-KokKzKQ35B9WKTP6 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-KokKzKQ35B9WKTP6 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-KokKzKQ35B9WKTP6 .actor-man circle,#mermaid-svg-KokKzKQ35B9WKTP6 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-KokKzKQ35B9WKTP6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 发起 HTTPS 请求返回证书和公钥信息校验证书是否合法协商加密算法和会话密钥确认会话密钥使用会话密钥加密 HTTP 请求使用会话密钥加密响应数据

这张图里最关键的是前几步。

浏览器不是一上来就发送真正的 HTTP 请求,而是先完成 TLS 握手:

  1. 确认服务器身份
  2. 协商加密算法
  3. 生成后续通信使用的会话密钥

等安全通道建立好之后,HTTP 请求才会在这个安全通道里传输。

所以 HTTPS 可以理解为:

text 复制代码
HTTPS = HTTP + TLS

六、举个例子:登录接口为什么必须用 HTTPS?

假设我们有一个登录接口:

http 复制代码
POST /api/login
Content-Type: application/json

{
  "username": "test",
  "password": "123456"
}

如果使用 HTTP,这段数据在网络上传输时是明文。

抓包工具看到的可能就是:

json 复制代码
{
  "username": "test",
  "password": "123456"
}

如果使用 HTTPS,传输过程中看到的就是加密后的内容,中间人无法直接读懂。

后端代码本身可能还是这样写:

java 复制代码
@RestController
@RequestMapping("/api")
public class LoginController {

    @PostMapping("/login")
    public String login(@RequestBody LoginRequest request) {
        String username = request.getUsername();
        String password = request.getPassword();

        // 这里省略真正的账号密码校验逻辑
        if ("test".equals(username) && "123456".equals(password)) {
            return "login success";
        }

        return "login failed";
    }
}

这段 Java 代码的重点不在登录逻辑,而在于:HTTP 和 HTTPS 的差异通常不体现在业务代码里,而体现在传输层和部署层。

也就是说,你 Controller 该怎么写还是怎么写。

真正的 HTTPS 配置一般在这些地方完成:

  • Nginx
  • 网关层
  • 负载均衡器
  • Spring Boot 内置服务器
  • 云厂商证书服务
  • Ingress / API Gateway

比如在 Nginx 里,大概会配置证书路径:

nginx 复制代码
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/nginx/cert/example.com.pem;
    ssl_certificate_key /etc/nginx/cert/example.com.key;

    location / {
        proxy_pass http://backend-service;
    }
}

这段配置重点看三件事:

  1. listen 443 ssl 表示这个服务监听 HTTPS 默认端口
  2. ssl_certificate 是证书文件
  3. ssl_certificate_key 是服务器私钥文件

业务请求进来后,Nginx 先处理 HTTPS 加密和解密,再把请求转发给后端服务。


七、为什么 HTTPS 不直接取代 HTTP?

看到这里你可能会问:

既然 HTTPS 更安全,那 HTTP 是不是完全没用了?

也不能这么绝对。

现在生产环境对外网站基本都应该上 HTTPS,尤其是登录、支付、用户信息、后台系统、开放接口这些场景。

但 HTTP 仍然可能出现在一些内部场景里,比如:

  • 内网服务之间通信
  • 本地开发调试
  • 非敏感静态资源测试
  • HTTPS 在网关层终止后,网关到后端服务走内网 HTTP

比如一个常见架构是这样的:
#mermaid-svg-R6Ls0C96dGnLp6C9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-R6Ls0C96dGnLp6C9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-R6Ls0C96dGnLp6C9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-R6Ls0C96dGnLp6C9 .error-icon{fill:#552222;}#mermaid-svg-R6Ls0C96dGnLp6C9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-R6Ls0C96dGnLp6C9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-R6Ls0C96dGnLp6C9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-R6Ls0C96dGnLp6C9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-R6Ls0C96dGnLp6C9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-R6Ls0C96dGnLp6C9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-R6Ls0C96dGnLp6C9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-R6Ls0C96dGnLp6C9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-R6Ls0C96dGnLp6C9 .marker.cross{stroke:#333333;}#mermaid-svg-R6Ls0C96dGnLp6C9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-R6Ls0C96dGnLp6C9 p{margin:0;}#mermaid-svg-R6Ls0C96dGnLp6C9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-R6Ls0C96dGnLp6C9 .cluster-label text{fill:#333;}#mermaid-svg-R6Ls0C96dGnLp6C9 .cluster-label span{color:#333;}#mermaid-svg-R6Ls0C96dGnLp6C9 .cluster-label span p{background-color:transparent;}#mermaid-svg-R6Ls0C96dGnLp6C9 .label text,#mermaid-svg-R6Ls0C96dGnLp6C9 span{fill:#333;color:#333;}#mermaid-svg-R6Ls0C96dGnLp6C9 .node rect,#mermaid-svg-R6Ls0C96dGnLp6C9 .node circle,#mermaid-svg-R6Ls0C96dGnLp6C9 .node ellipse,#mermaid-svg-R6Ls0C96dGnLp6C9 .node polygon,#mermaid-svg-R6Ls0C96dGnLp6C9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-R6Ls0C96dGnLp6C9 .rough-node .label text,#mermaid-svg-R6Ls0C96dGnLp6C9 .node .label text,#mermaid-svg-R6Ls0C96dGnLp6C9 .image-shape .label,#mermaid-svg-R6Ls0C96dGnLp6C9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-R6Ls0C96dGnLp6C9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-R6Ls0C96dGnLp6C9 .rough-node .label,#mermaid-svg-R6Ls0C96dGnLp6C9 .node .label,#mermaid-svg-R6Ls0C96dGnLp6C9 .image-shape .label,#mermaid-svg-R6Ls0C96dGnLp6C9 .icon-shape .label{text-align:center;}#mermaid-svg-R6Ls0C96dGnLp6C9 .node.clickable{cursor:pointer;}#mermaid-svg-R6Ls0C96dGnLp6C9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-R6Ls0C96dGnLp6C9 .arrowheadPath{fill:#333333;}#mermaid-svg-R6Ls0C96dGnLp6C9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-R6Ls0C96dGnLp6C9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-R6Ls0C96dGnLp6C9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-R6Ls0C96dGnLp6C9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-R6Ls0C96dGnLp6C9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-R6Ls0C96dGnLp6C9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-R6Ls0C96dGnLp6C9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-R6Ls0C96dGnLp6C9 .cluster text{fill:#333;}#mermaid-svg-R6Ls0C96dGnLp6C9 .cluster span{color:#333;}#mermaid-svg-R6Ls0C96dGnLp6C9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-R6Ls0C96dGnLp6C9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-R6Ls0C96dGnLp6C9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-R6Ls0C96dGnLp6C9 .icon-shape,#mermaid-svg-R6Ls0C96dGnLp6C9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-R6Ls0C96dGnLp6C9 .icon-shape p,#mermaid-svg-R6Ls0C96dGnLp6C9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-R6Ls0C96dGnLp6C9 .icon-shape .label rect,#mermaid-svg-R6Ls0C96dGnLp6C9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-R6Ls0C96dGnLp6C9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-R6Ls0C96dGnLp6C9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-R6Ls0C96dGnLp6C9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} HTTPS
HTTP 内网转发
用户浏览器
Nginx / 网关
业务服务
数据库

这张图说明一个很常见的情况:用户到网关走 HTTPS,保证公网传输安全;网关到业务服务走内网 HTTP,减少内部服务的证书管理成本。

当然,这不是说内网 HTTP 一定安全。

如果公司对安全要求高,比如金融、支付、政企系统,内部服务之间也可能要求全链路 HTTPS 或 mTLS。

这里有点困更建议你从取舍角度理解:不是 HTTP 一无是处,也不是 HTTPS 万能,而是要看链路位置和安全要求。


八、HTTPS 会影响性能吗?

会,但现在影响已经比以前小很多。

HTTPS 相比 HTTP,主要多了两类成本:

  1. TLS 握手成本
  2. 加解密计算成本

早期大家会担心 HTTPS 慢,是因为 TLS 握手需要额外往返,证书校验和加解密也要消耗 CPU。

但现在有很多优化手段:

优化方式 作用
HTTP Keep-Alive 复用 TCP 连接,减少重复握手
TLS Session Resumption 复用 TLS 会话,减少完整握手
HTTP/2 多路复用,减少连接开销
硬件加速 / 现代 CPU 指令 降低加解密成本
CDN HTTPS 加速 把证书和连接优化交给 CDN 边缘节点

所以在大多数业务系统里,HTTPS 的性能成本通常是可以接受的。

真正需要注意的是:证书配置、过期续签、协议版本、安全套件、网关压力这些工程问题。


九、HTTP 和 HTTPS 适合什么场景?

简单来说:

场景 建议
登录注册 必须 HTTPS
支付交易 必须 HTTPS
用户隐私数据 必须 HTTPS
管理后台 必须 HTTPS
对外开放 API 建议 HTTPS
普通官网 建议 HTTPS
本地开发 可以 HTTP
内网低敏服务 可以 HTTP,但要看安全要求
高安全内网系统 建议 HTTPS / mTLS

现在还有一个现实原因:浏览器对 HTTP 越来越不友好。

很多浏览器会直接把 HTTP 页面标记为"不安全",某些能力也会限制在 HTTPS 环境下使用,比如一些涉及权限、定位、摄像头、Service Worker 的能力。

所以在真实项目里,HTTPS 基本已经是对外服务的默认选择。


十、注意事项和代价

HTTPS 虽然好,但用的时候也有一些坑。

1. 证书会过期

证书不是永久有效的。

如果证书过期,用户访问网站时就会看到安全警告,严重时业务直接不可用。

所以生产环境要做好:

  • 证书有效期监控
  • 自动续签
  • 续签后自动 reload 网关
  • 多域名证书管理

2. 私钥不能泄露

证书里的公钥可以公开,但私钥绝对不能泄露。

如果私钥泄露,攻击者就可能伪造服务器身份,安全性会受到严重影响。

3. HTTP 跳转 HTTPS 要配置好

很多网站会把 HTTP 自动跳转到 HTTPS。

比如:

nginx 复制代码
server {
    listen 80;
    server_name example.com;

    return 301 https://$host$request_uri;
}

这段配置的意思是:用户访问 HTTP 时,直接永久重定向到 HTTPS。

但要注意跳转规则不要写错,否则可能出现循环重定向。

4. HTTPS 不等于系统安全

这一点很重要。

HTTPS 只保证传输链路更安全,不代表你的业务系统就没有漏洞。

比如这些问题 HTTPS 解决不了:

  • SQL 注入
  • XSS
  • CSRF
  • 越权访问
  • 弱密码
  • 接口没有鉴权
  • 敏感信息写入日志

所以不要把 HTTPS 当成安全的全部。

它只是安全体系里非常基础、非常重要的一环。


十一、面试回答

如果面试被问到"HTTP 和 HTTPS 有什么区别",可以这样回答:

HTTP 是超文本传输协议,默认使用明文传输,主要问题是存在窃听、篡改和冒充风险。

HTTPS 可以理解为 HTTP 加上 SSL/TLS 安全层,它通过加密保证数据不容易被窃听,通过完整性校验防止数据被篡改,通过 CA 证书验证服务器身份。

两者常见区别包括:HTTP 默认端口是 80,HTTPS 默认端口是 443;HTTP 不需要证书,HTTPS 需要证书;HTTPS 安全性更高,但会多出 TLS 握手和加解密成本。

在实际项目里,对外网站、登录、支付、用户隐私数据和开放接口一般都应该使用 HTTPS。但 HTTPS 也不是万能的,它主要解决传输安全问题,业务漏洞仍然需要靠鉴权、参数校验和安全设计来解决。

这段回答不需要背得一字不差,重点是按这个顺序说:

text 复制代码
先说 HTTP 的问题
再说 HTTPS 的方案
再说核心机制
最后说使用场景和代价

这样听起来就不是死背概念,而是真的理解了。


总结

HTTP 和 HTTPS 的区别,不要只记"多了一个 S"。

更准确地说:

HTTP 解决的是浏览器和服务器之间如何传输数据的问题。

HTTPS 解决的是数据在传输过程中如何更安全的问题。

它通过 TLS 加密、证书校验和完整性保护,让数据传输更可靠。

但 HTTPS 也不是没有代价,它需要证书管理,会增加一些握手和加解密成本,也不能替代业务层安全设计。

所以有点困建议你记住:学这个问题时,不要只背区别表,而要顺着"为什么不安全、怎么解决、有什么代价"这条线去理解。

HTTPS 不是让系统绝对安全,而是让传输链路更可信。

相关推荐
PieroPc1 小时前
AirDisk NAS Viewer 通过 HTTP 服务或 Windows 网络驱动器
网络·windows·http
KaMeidebaby1 小时前
卡梅德生物技术快报|酵母表达系统工程:裂殖酵母穿梭载体分子改造与载体构建技术总结
网络·人工智能·网络协议·tcp/ip·算法
Cx330❀2 小时前
【Linux网络】打破“一问一答”局限:从零构建全双工多线程UDP群聊系统
linux·运维·服务器·网络·网络协议·udp
学且思2 小时前
SSE 是 HTTP/2 的服务器推送?
服务器·网络协议·http
草莓熊Lotso2 小时前
【Linux网络】深入理解 HTTP 协议(四):完善 C++ HTTP 服务器:从协议原理到生产级实现
linux·运维·服务器·c语言·网络·c++·http
逆境不可逃3 小时前
【WebSocket 02】 握手拦截实现 Token 鉴权、Ping/Pong 心跳保活、前端断线自动重连
网络·websocket·网络协议
Seven973 小时前
网页为什么越来越快?一文看懂 HTTP 的三次进化
http·http3
小二·3 小时前
HTTPS 证书问题排查(SSL/TLS)实战
网络协议·https·ssl