Cookie
cookie,指的就是浏览器里面存储的一种数据。
由服务器生成---->发送给浏览器,浏览器把cookie以kv形式保存起来,
下一次请求同一网站时浏览器会把该cookie自动携带------>发送给服务器。
cookie不会占据太多磁盘空间,所以每个域的cookie数量是有限的。
服务端用session去管理cookie:
1、存储在服务端:通过cookie存储一个session_id,具体的数据是保存在服务器端session中。请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。专业术语叫做serverside session。
2、存储在客户端:将session数据加密,然后存储在cookie中。专业术语叫做clientside session。flask采用的就是这种方式。
有效期:cookie默认的有效期是浏览器关闭之前,但是可以通过cookie提供的方法max-age来设置(在服务端),单位是s,过了有效期会被删除。
作用域:该页面和该页面同级目录或者子目录的其它web页面可见。通过path和domain属性来配置。可以将页面以隐藏<iframe>的形式加载进来,随后就可以读取了。
子域之间如果要跨域共享cookie,如:B.A.com想访问C.A.com域下的cookie,需要设置domain为主域.A.com。
检查:检查浏览器是否启用cookie,判断navigator.cookieEnabled是否为true。
修改:需要使用相同的名字、路径、域,然后重新设置cookie的值。
删除:需要使用相同的名字、路径、域,指定一个非空值,并将max-age设置为0。
Session
session,存储在服务器,服务器要知道当前发请求给自己的是谁,为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用cookie 的方式。
服务器使用session把用户的信息保存在服务器上,Session的默认失效时间是30分钟,从不活动开始计时。可以通过提供的方法设置。
session存储方式相对cookie来说更安全。
session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。
Token
就是对数据做签名。 用某个特定的算法 + 一个密钥=签名, 把这个签名和数据一起作为token 。
tokens
是多用户下处理认证的最佳方式:
以下几点特性会让你在程序中使用基于Token的身份验证
1.无状态、可扩展(负载均衡器能够将用户信息从一个服务传到其他服务器上)
2.支持移动设备(CORS<跨域资源共享>)
3.跨程序调用(栗子:能够创建与其它程序共享权限的程序,授权给第三方应用程序)
4.安全(防止防止CSRF<跨站请求伪造>)
基于服务器验证方式暴露的一些问题:
1.Seesion,内存:认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。
2.可扩展性:在服务端的内存中使用Seesion存储登录信息,伴随而来的是可扩展性问题。
3.CORS(跨域资源共享):当让数据跨平台使用时,跨域资源的共享是一个问题,使用Ajax抓取另一个域的资源,会出现禁止请求的情况。
4.CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。
基于Token的身份验证的过程如下:
1、用户通过用户名和密码发送请求。
2、程序验证。
3、程序返回一个签名的token 给客户端。
4、客户端储存token,
5、客户端每次发送请求都携带Token到服务器端。
6、服务器端采用filter过滤器校验,校验成功则返回请求数据,校验失败则返回错误码。
实现思路:
token是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作。
浏览器的缓存方式 :
名称 生命周期 数据大小 与服务器通信 用途
cookie 由服务器生成可设置失效时间 4KB 每次会携带在HTTP头中 存储过多会带来性能问题
标识用户身份
sessionStorage 关闭页面或者浏览器 5MB 仅在客户端保存 浏览器缓存数据
后被清除 不参与服务端通信
localStorage 手动清除 5MB 仅在客户端保存 浏览器缓存数据
否则永久有效 不参与服务端通信