Cookie
HTTP 是无状态(stateless)协议。也就是说,在一次请求响应结束后,服务器不会留下任何关于对方状态的信息。但是对于某些 Web 程序来 说,客户端的某些信息⼜必须被记住,比如用户的登录状态,这样才可以根据用户的状态来返回不同的响应。为了解决这类问题,就有了 Cookie 技 术。Cookie 技术通过在请求和响应报文中添加 Cookie 数据来保存客户端的状态信息。
无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。
有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等。
- 最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是 Cookie 的功用。
- 网站的广告推送,经常遇到访问某个网站时,会弹出小窗口,展示我们曾经在购物网站上看过的商品信息。
- 购物车,用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookie,以便在最后付款时提取信息。
实现状态保持主要有两种方式:
- 在客户端存储信息使用
Cookie
- 在服务器端存储信息使用
Session
,(也可以保存在 cookie 之中)
Cookie:指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密)。
- 复数形式 Cookies。
- Cookie 是由服务器端生成,发送给客户端浏览器,浏览器会将 Cookie 的 key/value 保存,下次请求同一网站时就发送该 Cookie 给服务器(前提是浏览器设置为启用 cookie )。
- Cookie 的 key/value 可以由服务器端自己定义。
提示
Cookie 是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用
Cookie 基于域名安全,不同域名的 Cookie 是不能互相访问的
浏览器的同源策略:
如访问 python.org 时向浏览器中写了 Cookie 信息,使用同一浏览器访问 baidu.com 时,无法访问到 python.org 的 Cookie 信息例如 https://zhengxinonly.com 与 https://python.org 是两个不同的域名,在使用浏览器进行请求的时候,两个域名的 cookie 不会相互干扰。
如果从第一个域名的页面请求第二个的后台网站,就叫 跨域访问。
当浏览器请求某网站时,会将本网站下所有 Cookie 信息提交给服务器,所以在 request 中可以读取 Cookie 信息
Cookie 在身份认证中的作用
客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个身份认证的 Cookie,客户端会自动将 Cookie 保存在浏览器中。
随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的 Cookie,通过请求头的形式发送给服务器,服务器即可验明客户端的身份。
Cookie 的工作原理
设置 cookie
通过操作 response 对象的 set_cookie 方法我们可以设置自定义cookie:
from flask import Flask, abort, request, make_response
app = Flask(__name__)
@app.route('/set_cookie')
def set_cookie():
response = make_response('设置 cookie')
response.set_cookie('username', 'zhengxinonly')
return response
2
3
4
5
6
7
8
9
10
set_cookie 的参数
属 性 | 说 明 |
---|---|
key | cookie 的键(名称) |
value | cookie 的值 |
max_age | cookie 被保存的时间数,单位为秒;默认在用户会话结束(即关闭浏览器)时过期 |
expires | 具体的过期时间,一个 datetime 对象或 UNIX 时间戳 |
path | 限制 cookie 只在给定的路径可用,默认为整个域名 |
domain | 设置 cookie 可用的域名 |
secure | 如果设为 True,只有通过 HTTPS 才可以使用 |
httponly | 如果设为 True,禁止客户端 JavaScript 获取 cookie |
设置过期时间
@app.route('/set_cookie')
def set_cookie():
response = make_response('设置 cookie')
response.set_cookie('username', 'zhengxinonly', max_age=3600)
return response
2
3
4
5
获取 cookie
可以使用 request 对象 cookies 字段的 get 方法来获取我们所需要的 cookie
@app.route('/get_cookie')
def get_cookie():
username = request.cookies.get('username')
return "cookie 中的名字为:" + username
2
3
4
删除 cookie
共有三种方法可以删除一个 cookie :
- 可以通过在浏览器中设置来清除 cookie.
- 使用 response 的 set_cookie 进行清除
- 使用 Response 的 delete_cookie方法.
@app.route('/del_cookie')
def del_cookie():
response = make_response('删除cookie')
# response.set_cookie('username', '', expires=0)
response.delete_cookie('username')
return response
2
3
4
5
6
Cookie 不具有安全性
由于 Cookie 是存储在浏览器中的,而且浏览器也提供了读写 Cookie 的 API,因此 Cookie 很容易被伪造,不具有安全性。因此不建议服务器将重要的隐私数据,通过 Cookie 的形式发送给浏览器。
注意:千万不要使用 Cookie 存储重要且隐私的数据!比如用户的身份信息、密码等。