1. cookie

cookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie。

1.1 cookie的创建

setcookie(name, value, expire, path, domain);

1.2 cookie的读取

$_COOKIE[“user”];

1.3 判断是否设置了cookie

if (isset($_COOKIE[“user”])){ }else { }

1.4 cookie的销毁

我们一般销毁一个cookie就是让一个cookie过期 setcookie(“user”, “”, time()-3600);

1.5 cookie的原理和作用

  • 由于 http协议是无状态的。如果某个客户端一次http请求和响应完成,当它再次发送请求的时候,服务端无法辨别这个客户端其实就是刚刚发送请求的那个客户端。
  • cookie是为了支持http会话跟踪
  • cookie就像是服务端发给客户端的一张通行证,服务端通过这张通信证来辨别身份。
  • cookie保存在客户端

1.6 domain的规则

  • 设置cookie——设置cookie的时候,domain要符合域名的规则,比如可以设置成www1.pclady.com.cnpclady.com.cn 但是不能设置成pclady。要有.com.cn或者其他域名做结尾。 通过js手动设置cookie的domain都是以.开头的。比如设置domain=pclady.com.cn,实际的domain名为.pclady.com.cn;删除cookie时加不加.都可以。
  • 获取cookie——js只能获取domian大于等于当前页面域名的cookie。比如http://www1.pclady.com.cn/zt/20160623/testCookie.html页面中的js能获取domain为“www1.pclady.com.cn”和“.www1.pclady.com.cn”和“.pclady.com.cn”但是获取不到“g.pclady.com.cn”中的cookie;
  • 删除cookie——要删除一个cookie,domain值必须跟要删除cookie的domain相同,默认的domain为html文件的domain。
  • 跨域domain——js不可以把cookie设置成不同与html域名的domian。cookie设置不会成功,但不会影响后面程序对cookie的操作。
  • 错误——如果domain设置错误,该cookie将不会被创建,并且后续对cookie的操作不论正确与否都会被浏览器禁止。

1.7 path的规则

  • 设置cookie——js设置path要以”/“开头,比如html路径为”/zt/20160623/“,路径可以设置成”/“或”/zt”。
  • 获取cookie——使用js只能获取path大于等于当前页面path的cookie,比如html路径为/zt/20160623/,使用js只能获取“/zt/20160623/”和“/zt”和“/”路径下的cookie。不能获取其他路径下的cookie
  • 删除cookie——删除cookie的时候路径也必须相同,默认的路径是html的path路径。
  • 错误——如果path不是以”/“开头的则创建cookie的path使用默认的path;如果是以”/“开头但是设置错了,路径名不存在或者直接设置成子路径。比如设置成”/20160623”或者”/zt1”,该cookie将不会被创建,并且后续对cookie的操作不论正确与否都会被浏览器禁止。

2. Session

PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。

2.1 开始 PHP Session

session_start();

2.2 session 的存储

$_SESSION[‘views’]=1; echo “Pageviews=”. $_SESSION[‘views’];

2.3 session 的销毁

unset($_SESSION[‘views’]); session_destroy(); // session_destroy() 将重置 session,您将失去所有已存储的 session 数据。


3. token

token 也称之为令牌,有 uid + time + sign + [固定参数] 组成

3.1 token的组成参数

  • uid: 用户唯一身份标识
  • time: 当前时间的时间戳
  • sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
  • 固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库

3.2 token的特点

  • 无状态、可扩展
  • 支持移动设备
  • 跨程序调用
  • 安全

3.3 token的认证流程

由token的组成可以看出,token类似于临时的证书签名,被保存在客户端的cookie和localstorage下 所以用户的状态在服务端的内存中没有被存储,这是一种无状态的认证机制。

  • token的认证流程
    1. 用户登录校验,校验成功后就返回Token给客户端。
    2. 客户端收到数据后保存在客户端
    3. 客户端每次访问API是携带Token到服务器端。
    4. 服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码
  • 缺点:因为 token 一般都是 hash/encrypt 的字符串, 所以会额外附加 加密/解密 的性能开销有些加密方式同样存在安全隐患。

4.1 Token 和 Session 、Cookie的区别

  • session和 token并不矛盾,作为身份认证token安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。
  • token支持跨域访问,而session是不支持的,或者说需要后台对不同域名就进行session idd的共享才能进行跨域访问。
  • token机制在服务端不需要存储session信息,因为Token 自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信。
  • token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名;session和cookie差不多,只是session是写在服务器端的文件,也需要在客户端写入cookie文件,但是文件里是你的浏览器编号.Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。
  • 简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用API接口,用Token。如果永远只是自己的网站,自己的App,用什么就无所谓了。

    4.2 cookie与session的区别

  • session与cookie通常会结合使用,session id通常在客户端会保存在cookie中。

  • seession存放在服务器,cookie存放在客户端,cookie可以通过分析本地cookie并进行cookie欺骗,session由于存在服务器上会比cookie更安全,鉴于安全,应当使用session。
  • session会在一定时间内保存在服务器上,影响服务器性能,鉴于性能,应当使用cookie。
  • 单个cookie保存在客户端会有大小数量限制,一般浏览器只允许一个站点保存20个cookie。