# Cookie、Session 的原理

## cookie

**cookie 是什么?**

cookie使用来跟踪用户会话的技术.cookie本身是一小段文本信息,它存在与http协议header头域里,通过http协议来传递.

**cookie 用来干什么?**

http协议是一种无状态协议,客户端和服务端完成一次会话后,服务器端不知道下次连接到服务端的是不是同一个客户端,需要有个标识能告诉服务端,是哪个客户端连接上了服务端.例如登录用户,需要有个东西标识,那就在客户端保存一个cookie,下次访问的时候随http header一起发到服务端,服务端根据cookie的内容知道了这是某个用户的请求,服务端根据cookie取到该用户的信息,返回给客户端

**cookie 工作原理是什么?**

以用户登录来举例

1. 小明访问某一网站 aa.com的登录页面, 此时通过浏览器发了一个http request请求,此时http header头域的cookie值可以是空的
2. xx.com服务器收到这个请求,并接受了小明提交过来的登录数据,判断用户名和密码都正确,这个时候服务器会"种下一个cookie"--一般是将小明的用户名发给客户端,通常是"Cookie: usernick=xiaoming;"这个字符串通过http response返回给客户端(浏览器)
3. 浏览器收到http response返回来的信息发现cookie了,然后将该信息写入到浏览器的某个存储文件中去
4. 小明再访问xx.com的其他页面的时候,请求的http header中会带着这个cookie
5. 服务器的程序会找cookie,并根据cookie的信息取出信息并返回给客户端

## session

**session是什么?**

Session是另一种记录客户状态的机制，不同的是Cookie保存在客户端浏览器中，而Session保存在服务器上。客户端浏览器访问服务器的时候，服务器把客户端信息以某种形式记录在服务器上。这就是Session。

**ession能干什么?**

cookie能做的他能做,cookie不能做的他也能做!

**session是怎么工作的?**

1. 用户请求login.php填写数据后提交
2. 服务器收到提交的数据取得用户信息,将用户信息存入session,并将session\_id通过cookie的形式发给客户端
3. 客户端将session\_id存入浏览器cookie文件
4. 用户再次访问其他页面时,将有session\_id的cookie通过header头发给服务端
5. 服务端拿到session\_id从session中取到用户信息并返回

**session存储的内容是怎么样的?**

```
uid|i:123;abc|O:1:"a":2:{s:1:"s";s:4:"test";s:1:"b";a:2:{i:0;s:2:"12";i:1;s:2:"34";}}
```

**session中怎么存储的?**

序列化serialize

### 相关问题

**问题1.session的有效期?**

由php.ini中的session配置决定( session.cookie\_lifetime = 0 session.gc\_maxlifetime = 600 )

**问题2.关闭客户端可以删除session或者使session失效吗?**

不能删除session,但有可能使session失效 .使其失效的原因是如果配置的session有效期是cookie随着浏览器失效.

**问题3.如果浏览器不支持cookie,session能正常使用吗?**

可以,将session通过url传递

**问题4.如果服务端有多台服务器,session如何共享?**

1. nfs, 将多台服务器所在的session存储目录设置为mount挂载的目录
2. memcache,session.save\_handler = memcache并设置路径session.save\_path = "tcp\://192.168.1.101:11211"
3. mysql,ession.save\_handler = user,然后建立session表,建立php文件用于对数据库表操作session数据,最后用session的都引入上一步中的php文件


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://phper.shujuwajue.com/http-xie-yi/cookiesession-de-yuan-li.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
