339 lines
5.6 KiB
Markdown
339 lines
5.6 KiB
Markdown
# HTTP与HTTPS
|
||
|
||
## 目录
|
||
- [HTTP协议](#http协议)
|
||
- [HTTPS协议](#https协议)
|
||
- [HTTP/2](#http2)
|
||
- [HTTP/3](#http3)
|
||
- [请求方法](#请求方法)
|
||
- [状态码](#状态码)
|
||
- [请求头与响应头](#请求头与响应头)
|
||
- [安全机制](#安全机制)
|
||
- [面试常见问题](#面试常见问题)
|
||
|
||
---
|
||
|
||
## HTTP协议
|
||
|
||
### HTTP 简介
|
||
|
||
```java
|
||
// HTTP:HyperText Transfer Protocol
|
||
// 超文本传输协议
|
||
// 应用层协议
|
||
// 基于 TCP/IP
|
||
```
|
||
|
||
### HTTP 特点
|
||
|
||
1. **无状态**:每次请求独立,不保存状态
|
||
2. **请求-响应**:客户端请求,服务器响应
|
||
3. **明文传输**:数据不加密(HTTPS 加密)
|
||
|
||
### HTTP 请求格式
|
||
|
||
```
|
||
请求行:方法 路径 协议版本
|
||
请求头:键值对
|
||
空行
|
||
请求体:数据(可选)
|
||
|
||
示例:
|
||
GET /index.html HTTP/1.1
|
||
Host: www.example.com
|
||
User-Agent: Mozilla/5.0
|
||
```
|
||
|
||
### HTTP 响应格式
|
||
|
||
```
|
||
状态行:协议版本 状态码 状态描述
|
||
响应头:键值对
|
||
空行
|
||
响应体:数据
|
||
|
||
示例:
|
||
HTTP/1.1 200 OK
|
||
Content-Type: text/html
|
||
Content-Length: 1234
|
||
|
||
<html>...</html>
|
||
```
|
||
|
||
---
|
||
|
||
## HTTPS协议
|
||
|
||
### HTTPS 简介
|
||
|
||
```java
|
||
// HTTPS:HTTP over SSL/TLS
|
||
// 安全的 HTTP 协议
|
||
// 使用 SSL/TLS 加密
|
||
```
|
||
|
||
### HTTPS 工作原理
|
||
|
||
```
|
||
1. 客户端请求 HTTPS 连接
|
||
2. 服务器返回证书
|
||
3. 客户端验证证书
|
||
4. 客户端生成对称密钥,用服务器公钥加密
|
||
5. 服务器用私钥解密,获得对称密钥
|
||
6. 使用对称密钥加密通信
|
||
```
|
||
|
||
### SSL/TLS 握手
|
||
|
||
```java
|
||
// SSL/TLS 握手过程
|
||
// 1. Client Hello:客户端发送支持的加密算法
|
||
// 2. Server Hello:服务器选择加密算法,返回证书
|
||
// 3. Client Key Exchange:客户端生成密钥,用服务器公钥加密
|
||
// 4. Change Cipher Spec:切换到加密通信
|
||
// 5. Finished:握手完成
|
||
```
|
||
|
||
---
|
||
|
||
## HTTP/2
|
||
|
||
### HTTP/2 特性
|
||
|
||
1. **多路复用**:一个连接可以处理多个请求
|
||
2. **头部压缩**:压缩请求头和响应头
|
||
3. **服务器推送**:服务器可以主动推送资源
|
||
4. **二进制分帧**:使用二进制格式
|
||
|
||
### HTTP/2 vs HTTP/1.1
|
||
|
||
| 特性 | HTTP/1.1 | HTTP/2 |
|
||
|------|----------|--------|
|
||
| 连接 | 多个连接 | 单个连接 |
|
||
| 多路复用 | ❌ | ✅ |
|
||
| 头部压缩 | ❌ | ✅ |
|
||
| 服务器推送 | ❌ | ✅ |
|
||
|
||
---
|
||
|
||
## HTTP/3
|
||
|
||
### HTTP/3 特性
|
||
|
||
1. **基于 UDP**:使用 QUIC 协议
|
||
2. **更快连接**:减少握手时间
|
||
3. **更好的拥塞控制**
|
||
4. **连接迁移**:切换网络不断开连接
|
||
|
||
---
|
||
|
||
## 请求方法
|
||
|
||
### GET
|
||
|
||
```java
|
||
// GET:获取资源
|
||
// 参数在 URL 中
|
||
// 幂等性:是
|
||
// 安全性:是(不修改资源)
|
||
|
||
GET /user?id=1 HTTP/1.1
|
||
```
|
||
|
||
### POST
|
||
|
||
```java
|
||
// POST:创建资源
|
||
// 参数在请求体中
|
||
// 幂等性:否
|
||
// 安全性:否(修改资源)
|
||
|
||
POST /user HTTP/1.1
|
||
Content-Type: application/json
|
||
|
||
{"name": "John", "email": "john@example.com"}
|
||
```
|
||
|
||
### PUT
|
||
|
||
```java
|
||
// PUT:更新资源(完整更新)
|
||
// 幂等性:是
|
||
// 安全性:否
|
||
|
||
PUT /user/1 HTTP/1.1
|
||
{"name": "Jane", "email": "jane@example.com"}
|
||
```
|
||
|
||
### PATCH
|
||
|
||
```java
|
||
// PATCH:更新资源(部分更新)
|
||
// 幂等性:否
|
||
// 安全性:否
|
||
|
||
PATCH /user/1 HTTP/1.1
|
||
{"name": "Jane"}
|
||
```
|
||
|
||
### DELETE
|
||
|
||
```java
|
||
// DELETE:删除资源
|
||
// 幂等性:是
|
||
// 安全性:否
|
||
|
||
DELETE /user/1 HTTP/1.1
|
||
```
|
||
|
||
---
|
||
|
||
## 状态码
|
||
|
||
### 2xx 成功
|
||
|
||
```java
|
||
// 200 OK:请求成功
|
||
// 201 Created:创建成功
|
||
// 204 No Content:成功但无内容
|
||
```
|
||
|
||
### 3xx 重定向
|
||
|
||
```java
|
||
// 301 Moved Permanently:永久重定向
|
||
// 302 Found:临时重定向
|
||
// 304 Not Modified:未修改(使用缓存)
|
||
```
|
||
|
||
### 4xx 客户端错误
|
||
|
||
```java
|
||
// 400 Bad Request:请求错误
|
||
// 401 Unauthorized:未授权
|
||
// 403 Forbidden:禁止访问
|
||
// 404 Not Found:资源不存在
|
||
```
|
||
|
||
### 5xx 服务器错误
|
||
|
||
```java
|
||
// 500 Internal Server Error:服务器错误
|
||
// 502 Bad Gateway:网关错误
|
||
// 503 Service Unavailable:服务不可用
|
||
```
|
||
|
||
---
|
||
|
||
## 请求头与响应头
|
||
|
||
### 常用请求头
|
||
|
||
```java
|
||
// Host:服务器地址
|
||
Host: www.example.com
|
||
|
||
// User-Agent:客户端信息
|
||
User-Agent: Mozilla/5.0
|
||
|
||
// Content-Type:请求体类型
|
||
Content-Type: application/json
|
||
|
||
// Authorization:认证信息
|
||
Authorization: Bearer token
|
||
|
||
// Cookie:Cookie 信息
|
||
Cookie: session_id=123
|
||
```
|
||
|
||
### 常用响应头
|
||
|
||
```java
|
||
// Content-Type:响应体类型
|
||
Content-Type: application/json
|
||
|
||
// Content-Length:响应体长度
|
||
Content-Length: 1234
|
||
|
||
// Set-Cookie:设置 Cookie
|
||
Set-Cookie: session_id=123; Path=/
|
||
|
||
// Cache-Control:缓存控制
|
||
Cache-Control: max-age=3600
|
||
|
||
// Location:重定向地址
|
||
Location: https://www.example.com/new
|
||
```
|
||
|
||
---
|
||
|
||
## 安全机制
|
||
|
||
### 1. HTTPS
|
||
|
||
```java
|
||
// 使用 HTTPS 加密传输
|
||
// 防止数据被窃听和篡改
|
||
```
|
||
|
||
### 2. 认证
|
||
|
||
```java
|
||
// Basic 认证
|
||
Authorization: Basic base64(username:password)
|
||
|
||
// Bearer 认证(Token)
|
||
Authorization: Bearer token
|
||
|
||
// OAuth 2.0
|
||
Authorization: Bearer access_token
|
||
```
|
||
|
||
### 3. CORS
|
||
|
||
```java
|
||
// 跨域资源共享
|
||
Access-Control-Allow-Origin: *
|
||
Access-Control-Allow-Methods: GET, POST
|
||
Access-Control-Allow-Headers: Content-Type
|
||
```
|
||
|
||
---
|
||
|
||
## 面试常见问题
|
||
|
||
### Q1: HTTP 和 HTTPS 的区别?
|
||
|
||
**答案:**
|
||
- **HTTP**:明文传输,不加密
|
||
- **HTTPS**:使用 SSL/TLS 加密传输,更安全
|
||
|
||
### Q2: HTTP 请求方法?
|
||
|
||
**答案:**
|
||
- GET:获取资源
|
||
- POST:创建资源
|
||
- PUT:更新资源(完整)
|
||
- PATCH:更新资源(部分)
|
||
- DELETE:删除资源
|
||
|
||
### Q3: HTTP 状态码?
|
||
|
||
**答案:**
|
||
- 2xx:成功
|
||
- 3xx:重定向
|
||
- 4xx:客户端错误
|
||
- 5xx:服务器错误
|
||
|
||
### Q4: HTTP/2 的特性?
|
||
|
||
**答案:**
|
||
1. 多路复用
|
||
2. 头部压缩
|
||
3. 服务器推送
|
||
4. 二进制分帧
|
||
|
||
---
|
||
|
||
*最后更新:2024年*
|