cookie: 为了解决HTTP请求无状态的问题(HTTP无状态协议,是指协议对于交互性场景没有记忆能力)。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
session: 作用和cookie类似,cookie存储在浏览器中,session一般两种存储方式:
-
- 存储在服务器端:服务器存储session时,先生成session_id,然后把session_id和具体的session数据进行关联,并存储在服务器端(数据库或缓存中)。接着把session_id存放到cookie中返回给浏览器,用户访问浏览器时,服务器可以从cookie中获取session_id,然后再从服务器端(数据库或缓存)获取具体的session数据
- 存储在客户端: 存储session时,先将session进行加密,然后直接存储在cookie中返回给浏览器,用户访问时,从cookie中获取session数据(Flask默认采用这种方式)
CSRF攻击
CSRF(cross site request forgery,跨站请求伪造), 是一种网络攻击。HTTP协议存在这种恶意攻击,主要利用的是cookie。当用户在浏览器中自动保存cookie数据时,能够方便用户接下来的访问(不需要再手动输入用户名密码去服务器验证,而是直接由cookie发送给服务器)。随之而来会产生一个问题,当用户接下来访问的是不安全的、带有恶意攻击的网站时,会利用用户保存在浏览器中的cookie数据去做一些不利的事情,比如说利用你保存在浏览器中的cookie数据,在有CSRF漏洞的网站上发起一个银行转账请求。在发送请求时,浏览器会自动把这个网站的cookie数据发送给对应的服务器,而服务器并不知道这个请求是用户自己发出的还是伪造的,就会被骗过去。