Cookie & Session & Token
由于 HTTP 是无状态的,每次请求都是独立的,无法判断某个请求是哪个用户发出的
通过在服务器记录一些信息 (Session), 和客户端记录一些信息 (Cookie), 使得服务器能够判断多个请求的关联
因此 Cookie 和 Session 解决了 HTTP 无状态的问题
Cookie
Cookie 是服务器发给客户端,客户端保存的一段文本信息,客户端向服务器发起请求时会自动携带着 Cookie
缺点
所有信息明文保存,如果直接存储登陆信息,很容易伪造,安全性很低
Session
Session 本意为会话,也就是用来维持客户端与服务端的一个会话,是在服务端保存的一个数据结构,用来跟踪用户的状态
当客户端发起登陆请求且登陆成功时,服务器就会生成一个 Session,将 key(Session ID) 发给客户端,value(Session) 存在服务器中,客户端发送请求时携带着 Session ID,服务器就能找到相应的 Session,就能判断客户端的登陆状态了
实现
可以看到 Session ID 的工作原理与 Cookie 十分相似,因此通过 Cookie 传递 Session ID 是十分通用的方式,除此之外隐藏表单、URL 拼接等也都可以实现
优点
服务器完全管控登陆信息,Session 的销毁能且只能在服务端进行,主要有 3 种方式:
- 到了设置的过期时间
- 程序主动销毁
- 服务宕掉
程序主动销毁可以控制用户的登录状态,不完全依靠过期时间
浏览器本身存储在 Cookie 中的 Session ID 也有过期时间,如果没有额外设置,则浏览器会设置临时 Cookie,关闭页面这个 Cookie 也会过期,不过浏览器的过期时间过期并不会让服务器销毁 Session,只是浏览器把 Session ID 丢弃了,再次访问的时候没有携带 Session ID
缺点
每个登陆客户端都储存一个 Session,当并发量很大,或者过期时间设置很长时会占用大量服务器资源
扩展性较弱,
Token
Token 是将用户的登陆信息进行处理后返回给客户端,客户端发送请求的时候带上 Token,服务端对 Token 进行验证,确认这个 Token 是服务器生成的,就认为里面携带的信息都是合法的
优点
对比 Session,Token 在每次请求的时候都需要进行验证,增加了计算量,但是却是无状态的认证,不需要在服务器存储任何信息,提高了扩展性
同时通过验证可以确保客户端传来的 Token 是服务器签发的,且没有被篡改过,弥补了 Cookie 明文储存的不安全性
实现
客户端同样可以把 Token 储存在 Cookie 中请求时自动发送,但是这样 Token 就无法跨域
或者可以把 Token 储存在本地,通过 HTTP 请求头的 Authorization 字段传递
浙公网安备 33010602011771号