You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 lines
8.5 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

- [1. HTTP协议](#1-http协议)
- [1.1. HTTP请求](#11-http请求)
- [1.1.1. Head](#111-head)
- [1.1.1.1. **方法Method**](#1111-方法method)
- [1.1.1.2. Host](#1112-host)
- [1.1.1.3. 其他头](#1113-其他头)
- [1.1.2. Body](#112-body)
- [1.2. HTTP回应](#12-http回应)
- [1.2.1. head](#121-head)
- [1.2.2. body](#122-body)
- [2. 什么是cookie](#2-什么是cookie)
- [2.1. **核心作用**](#21-核心作用)
- [2.2. **工作原理**](#22-工作原理)
- [3. session](#3-session)
# 1. HTTP协议
HTTPHTTPS是建立在TCP协议层上的应用层协议。区别在于HTTP使用明文传输HTTPS是在SSL加密层上进行传输的。SSL加密层可以看成是TCP的扩展因此在应用层上HTTP和HTTP可以看成是一样的。
HTTP的默认端口是80HTTPS的默认端口是443。
另外为了提升服务器的负载能力HTTP是应答完成后就断开TCP的方式。
![alt text](img/http_connect.drawio.png)
HTTP是纯文本的应用层协议无论是Request或者是Response都是一致的结构分为头head和体body两个部分。
一个典型的Request由客户端发起
```http
GET /index.php?a=1&b=2 HTTP/1.1
Host: localhost
sec-ch-ua: "Not.A/Brand";v="99", "Chromium";v="136"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Linux"
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Cookie: Lg4E_2132_saltkey=FQXT9TSx; Lg4E_2132_lastvisit=1761101776; Lg4E_2132_ulastactivity=e3c3eG8C3HO%2FWXweKkNzw5nEuS2QRbsVqRZ82RGJGMn3uL7a3K1D; Lg4E_2132_nofavfid=1; Lg4E_2132_visitedfid=2; Lg4E_2132_smile=1D1; Lg4E_2132_lastcheckfeed=1%7C1761124759; DedeUserID=2; DedeUserID__ckMd5=1be68b23ddcae297; PHPSESSID=0eae6bcf13b88d56b155bb3e33921404; DedeLoginTime=1761882038; DedeLoginTime__ckMd5=4e7ad3dc7f3a81b5
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
b=2
```
整个的HTTP协议由head和body构成head和body之间用一个空行隔开。
## 1.1. HTTP请求
### 1.1.1. Head
#### 1.1.1.1. **方法Method**
```http
GET /index.php?a=1&b=2 HTTP/1.1
```
方法行定义了三个部分,
第一个部分是方法,常见的方法如下:
- `GET`:获取资源(如网页、文件)。
- `POST`:提交数据(如表单、文件上传)。
- `PUT`:更新资源。
- `DELETE`:删除资源。
- `HEAD`:仅获取响应头。
- `OPTIONS`:查询服务器支持的通信选项。
第二个部分是请求资源的路径以及GET参数
```http
/index.php?a=1&b=2
```
这里的路径是 ```/index.php``` 问好后面的是参数列表,多个参数用```&```进行分割注意这里路径应该符合URL的编码规则。
第三部分是HTTP的版本号。
#### 1.1.1.2. Host
```http
Host: localhost
```
host表示的是请求的主机host的域名、IP地址均可。主机名或者是ip地址后面可以带端口号tcp监听端口如果不带表示默认端口80。
```http
Host: localhost
```
```http
Host: www.test.com:8080
```
#### 1.1.1.3. 其他头
其他头由很多,比如 cookie用到的时候再讲解。
### 1.1.2. Body
body部分是请求的附加数据例如Post的数据发送的文件等。
## 1.2. HTTP回应
```http
HTTP/1.1 200 OK
Server: nginx/1.15.11
Date: Fri, 31 Oct 2025 03:53:44 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.2.17
Content-Length: 63690
```
### 1.2.1. head
响应头中最重要的是
```http
HTTP/1.1 200 OK
```
后面的 200 表示响应代码OK 表示响应代码的描述。具体的响应代码可以查看[HTTP响应码](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Status)。
### 1.2.2. body
根据请求的资源返回的响应具体内容。可以是几乎任何的文档包括html、文件、图片等。
# 2. 什么是cookie
**Cookie 是网站存储在用户设备(如电脑、手机)上的小型数据文件**,主要用于记录用户信息、跟踪行为或保持会话状态。以下是简单解释:
## 2.1. **核心作用**
1. **记住用户信息**
- 例如:登录网站后,下次访问时自动填充用户名/密码(需用户允许)。
- 保存偏好设置(如语言、主题颜色)。
2. **跟踪用户行为**
- 广告商通过 Cookie 记录你的浏览习惯,推送相关广告(如你搜过鞋子后,其他网站显示鞋类广告)。
3. **维持会话状态**
- 购物车功能依赖 Cookie即使你关闭页面再打开商品仍保留在购物车中。
## 2.2. **工作原理**
1. **服务器发送 Cookie**
- 当你访问网站时,服务器可能通过 HTTP 响应头(如 `Set-Cookie`)发送一个或多个 Cookie 到你的浏览器。
2. **浏览器存储 Cookie**
- 浏览器将 Cookie 保存在本地文件或内存中(按域名分类,不同网站互不干扰)。
3. **后续请求携带 Cookie**
- 再次访问同一网站时,浏览器会自动在 HTTP 请求头中附加相关 Cookie服务器据此识别用户。
简单说来cookie 就是存储在客户端的一段数据在访问相同的域名的时候可能还会限制域名下面的路径会自动发送给服务器。cookie可以由response中的head字段发送给客户端服务器向客户端写cookie也可以在客户端通过js读取和设置cookie客户端读写cookie。这样服务器就可以记住客户端是谁。例如把用户ID存放在cookie中每次都自动发送给服务器在head中服务器就会知道收到的request是谁发送的。
但是在客户端存放敏感信息是一种不安全的做法客户端的环境是不可控的cookie可能会被伪造。这样我们就需要使用到session来解决这个问题。
> 注意cookie 的存放有两个重要参数,第一是作用域,其实就是路径;第二就是过期时间。
# 3. session
显然cookie值可以在客户端进行读写如果把敏感信息存放到cookie中是不安全的。因此服务器需要识别到底是哪个客户端的访问情况就需要使用到session。
Session是存放在服务器的数据一般用来存放某个用户的信息。当客户端访问服务器服务器就会读取出客户端对应的Session从而知道是那个客户端发起的请求。
那么服务器是如何知道是哪个客户端访问服务器并读取出该客户端对应的Session这就需要使用到cookie。注意cookie的特点服务器是可以设置cookie的通过response中在回应头加入相应的cookie字段客户端收到该回应就会设置自己的cookie以后每次访问服务器就会自动发送该cookie。
```php
<?php
session_start();
echo "hello";
?>
```
访问这个页面F12打开调试。
![image-20251101092415063](img/image-20251101092415063.png)
在4这个位置可以看到服务通过返回头设置了客户端的的一个cookie这个cookie 就对应服务器的session。进一步验证在客户端的cookie中可以看到这个值4位置
![image-20251101092635998](img/image-20251101092635998.png)
在后续的访问中这个cookie值被自动发送给服务器服务器就通过这个值来和服务器端的session联系起来确定是那个客户端在发出请求。
就好像是给每个客户端临时进行了编号通过编号就能只能是谁在访问。同时session在服务器端是一个数组数组中可以增加修改项目用来存放该用户的状态或者是临时数据。例如是否登陆、用户ID等。
Session的读取是自动的通过$_SESSION 数组来进行读写。另外session也是有过期时间的。
这样客户端只用在cookie中存放一个随机字符串服务器就可以读取在服务器端对应的session来获得该用户的信息要比把敏感信息放在cookie中安全很多。
> 注意老的浏览器可能不支持cookie因此也可以把上述的PHPSESSION这个字符串通过GET参数传递给服务器。
关于SESSION的配置在phpinfo中有详细的描述
![image-20251101093410723](img/image-20251101093410723.png)