Cookie
- cookie 由服务器生成,发送给浏览器,浏览器把 cookie 以 KV 形式存储到某个目录下的文本文件中,下一次请求同一网站时会把该 cookie 发送给服务器。
Session
- session 服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁。
- 至于客户端怎么保存这个“身份标识”,可以有很多方式,对于浏览器客户端,大家都采用 cookie 的方式。
Token
- token 也称作令牌,由 uid+time+sign[+固定参数]
- token 的认证方式类似于临时的证书签名,并且是一种服务端无状态的认证方式,非常适合于 REST API 的场景。所谓无状态就是服务端并不会保存身份认证的相关的数据。
三者区别
- 存储位置不同:cookie 数据存放在客户的浏览器上,session 数据放在服务器上
- 隐私政策不同:cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session
- session 会在一定时间内保存在服务器上。当访问增多,就会比较占用服务器的性能,考虑到减轻服务器性能方面,应当使用 cookie
- session 是一种 HTTP 存储机制,为无状态的 HTTP 提供持久机制;
- Token 就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;
- Session 和 Token 并不矛盾,作为身份认证 Token 安全性比 Session 好,因为每一个请求都有签名还能防止监听以及重放攻击,而 Session 就必须依赖链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,依然可以增加 Session 来在服务端保存一些状态。