cookie,session和token都是我们实现授权的方式,在面试中也经常问道到他们的区别,那么他们的区别到底是什么呢?
简单概念
众所周知,http是无状态的协议,它对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息,所以每个请求都是完全独立的,服务器无法确认当前访问者的身份信息。所以为了进行会话跟踪,就要主动维护一个状态,用于告诉服务器前后两个请求是否来自同一浏览器。而这个状态就需要cookie或者session实现。
同理,token是用户访问API时所需要的资源凭证。token分为Acess Token和Refresh Token。Acess Token一般用来作为登录凭证,而Refresh Token一般用来做Acess Token的刷新
cookie
cookie存储在浏览器,存储大小为4kb,以字符串的形式存储。
发送请求时浏览器会检查是否有cookie,如果存在cookie就会自动带上,需要注意的是,cookie是不可跨域的,每个cookie都会绑定单一的域名,无法在别的域名下获取使用。但是在一级域名和二级域名之间是允许共享使用的
session
session是基于cookie实现的,但是session存储在服务器端,而服务端会返回sessionId存储到cookie中。当客户端发起请求时,请求会自动判断携带cookie,服务端就会从cookie中获取sessionID然后查找对应信息。
cookie和session的区别
- session由于存储在服务器的,所以session相比于cookie更安全
- cookie只支持字符串类型的数据,但是session可以存储任意类型的数据
- cookie可长时间保存,但是session在默认情况下客户端关闭或者session超时都会失效
- cookie的存储大小为4kb,session的存储大小远高于cookie
Token
token一般由服务端通过用户信息等生成,会在用户登录成功后返回给客户端,客户端接收到token后会存储在cookie 或者localStorage 中,之后煤气发起请求,都需要将token放在请求头中携带。
token支持移动端设备,支持跨程序调用,更安全。
Token和session的区别
- session是记录了会话状态,使服务端有状态化,而token是令牌,访问资源接口时的凭证,它不会让服务器有状态,也不会保存会话信息
- 作为身份认证来说,Token相比session来说安全性更好,因为每一个请求都有签名,并且还能防止监听以及重放攻击
- 如果用户数据可能可第三方共享或者允许第三方调用接口,就需要用token,因为使用sessionid就认为有此用户的全部权力,不应该共享出去。