|
|
|
|
@ -0,0 +1,207 @@
|
|
|
|
|
- [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协议
|
|
|
|
|
|
|
|
|
|
HTTP(HTTPS)是建立在TCP协议层上的应用层协议。区别在于HTTP使用明文传输,HTTPS是在SSL加密层上进行传输的。SSL加密层可以看成是TCP的扩展,因此在应用层上,HTTP和HTTP可以看成是一样的。
|
|
|
|
|
|
|
|
|
|
HTTP的默认端口是80;HTTPS的默认端口是443。
|
|
|
|
|
|
|
|
|
|
另外为了提升服务器的负载能力,HTTP是应答完成后就断开TCP的方式。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 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打开调试。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
在4这个位置可以看到服务通过返回头设置了客户端的的一个cookie,这个cookie 就对应服务器的session。进一步验证,在客户端的cookie中可以看到这个值(4位置)。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
在后续的访问中,这个cookie值被自动发送给服务器,服务器就通过这个值来和服务器端的session联系起来,确定是那个客户端在发出请求。
|
|
|
|
|
|
|
|
|
|
就好像是给每个客户端临时进行了编号,通过编号就能只能是谁在访问。同时session在服务器端是一个数组,数组中可以增加,修改项目,用来存放该用户的状态或者是临时数据。例如是否登陆、用户ID等。
|
|
|
|
|
|
|
|
|
|
Session的读取是自动的,通过$_SESSION 数组来进行读写。另外session也是有过期时间的。
|
|
|
|
|
|
|
|
|
|
这样,客户端只用在cookie中存放一个随机字符串,服务器就可以读取在服务器端对应的session来获得该用户的信息,要比把敏感信息放在cookie中安全很多。
|
|
|
|
|
|
|
|
|
|
> 注意:老的浏览器可能不支持cookie,因此也可以把上述的PHPSESSION这个字符串通过GET参数传递给服务器。
|
|
|
|
|
|
|
|
|
|
关于SESSION的配置,在phpinfo中有详细的描述:
|
|
|
|
|
|
|
|
|
|

|