这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记
由于http协议是无状态的,但是实际场景中,我们不可能每次向服务器发送请求时,都重新输入密码,因此就必须使用一些技术来记录登录状态
cookie
cookie的实现方式是:客户端登陆后,服务器验证用户名和密码,登录成功后,服务器向客户端发一个cookie,其中记录用户名、路径等,或者一些其他的信息,并设置过期时间。客户端收到后,保存在客户端本地,之后客户端再向服务器发送请求时,都自动带上cookie。服务器就可以根据cookie内容获取用户的状态了。 缺点:
- 由于cookie是明文传输,容易泄露信息。或者被而已篡改信息,比如修改从cookie中的用户名,如果后端不加以检验,就可以随意获取任意用户的权限了。
- cookie本地最大4k,不能存储太多的cookie。
session
与cookie不同,session把信息存储在服务器端。用户登录后,服务器为该用户生成一个session-id,作为key,这个key对应的value会保存这个用户的状态信息。当用户短时间内再次访问服务器时,带上session-id,服务器就可以根据session-id获取到该用户的状态信息了。 通常session会配合cookie一同使用,生成的session-id在客户端会保存在cookie里 缺点:服务器需要存储session,如果用户太多,可能造成服务器宕机
token
token是在用户登陆后,生成一段加密的字符串,字符串内包含了登录状态。服务器不需要存储token,只需要保存密码用于解密。 token包含header、body、signature三个部分,先对header和body基于base64编码,然后对编码的内容使用密码加密,得到signature。 header中存储加密的方式等信息, body存储登录状态, signature是签名,用于避免token被篡改。
base64只是编码方式,并不是加密,因此是可以解码的,token的内容可以被轻松的解码。我们也可以设置header中的字段,设置body字段为密文传输。