总的来说,
cookie、session、token都是用来保存用户登录信息的。三者是有区别的,使用场景也有所不同。
- cookie 主要用于客户端存储少量的用户信息,由浏览器自动进行管理
- session 主要用于服务器存储和管理用户会话状态信息,适用于在会话期间需要保持状态的情况
- token 主要用于无状态的身份验证和授权,适用于 API 身份验证与跨平台的情况
cookie 和 session 经常搭配着一起来使用
用户输入登录信息后,点击登录,浏览器会携带着用户的信息向服务器发送请求。服务器收到请求后,会对比存储在服务器的信息,验证信息是否正确。正确就会创建一个 session ,并将用户信息存储在 session 当中,然后会把这个 sessionID 放在set-cookie 响应头中,响应给浏览器。 浏览器收到响应后,会把该 cookie 存下来。并在后续的请求中,携带该 cookie 向服务器表明身份。
cookie 优点:
- 简单易用:只需通过设置响应头部的Set-Cookie字段即可在客户端创建和管理Cookie。
- 前端可控性:由于Cookie存储在浏览器中,前端可以通过读写Cookie来实现一些前端逻辑,例如保持登录
- 广泛支持:几乎所有浏览器都支持 cookie
cookie 缺点:
- 存储容量有限:Cookie的存储容量通常有限(一般为4KB),过大的数据无法存储在Cookie中。
- 安全性问题:Cookie中的数据可以被客户端篡改或窃取,可能导致安全问题。可以通过设置Cookie的安全属性来提高安全性。
- 隐私问题
- 跨域限制
session 优点:
- 存储容量大
- 数据安全性高
- 可以处理一些复杂逻辑:由于Session存储在服务器端,相比于Cookie,可以处理一些复杂的逻辑,例如可以保持全局状态、锁定并发访问等。
session 缺点:
- 服务器资源消耗大:由于Session是存储在服务器端的,对于大量的用户请求,将会消耗服务器的资源,需要充分考虑服务器的负载。
- 可扩展性差:难以在分布式场景下扩展,由于Session的存储是在服务器端完成的,如果需要多台服务器协同工作,则需要采用共享Session或持久化Session等技术。
token
token通常指的是一种用于身份验证和授权的令牌。它是一种短暂的字符串,用于证明用户身份或授予特定权限。
token是由服务器生成的,发送给浏览器。浏览器收到后会进行保存!并在后续请求中,把它放到授权头【Authorization: token】中去!
token 工作流程
-
浏览器向服务器发送登陆请求
-
服务器验证通过后,就生成 token ,并把 token 响应给浏览器
- 在传输的过程中会进行加密!
-
浏览器把 token 存储在本地,并在后面的请求中带上它
-
当用户注销时,需要手动把 token 从本地删除
token 优点:
安全性:token 是随机生成的,而且 token 不涉及敏感信息的传输,并且在传输的过程中进行了加密,所以减少了信息被截获、篡改的可能性。无状态性:token 是无状态的,服务器不需要存储用户的会话信息或状态
token 缺点:
不可注销性: 一旦 token 生成并发送给浏览器后,就无法控制它使它失效了,所以如果涉及到需要 token 立马失效的,可能就需要使用其他机制。所以大部分服务器都会把 token 的有效期设置的较短!