cookie
、session
和token
是解决“发出请求的用户是谁”问题的三种解决方案。
他们不是完全独立的,是互有关联的。
cookie
作为最早解决“发出请求用户是谁”问题的方案,使用时,服务端将用户的信息直接写入cookie
,通过请求头下发给用户,用户发出请求时,会将下发信息返回服务端,服务端取出cookie
中的信息,判断用户登录情况,eg.当用户登录成功时,将isLogin=true
存入cookie
,一起下发给客户端,然后当用户发出某个需要登录以后才能才做的请求时,服务端会去检查cookie
,判断isLogin
字段是否存在,是否为true
。
由于明文保存敏感信息在cookie
中,存在cookie
中信息被篡改的风险,比如存入了用户id和登录状态后,用户id被修改,就可以获取其他用户的权限,这显然是不能被接受的,于是出现了安全性更高的session
方法。
session
方法实际上是在cookie
方式上的一种改进,在用户登录成功后,不再在cookie
中存入敏感信息,而是存入一些标识符,即session_id
,即一串随机生成的字符串,如session_id=aasdasdwq112131111
,将这串字符串作为key
,将用户的信息作为value
存入到内存或数据库中,当用户发起需要登录权限请求的操作时,服务端从cookie
中取出session_id
对应的值,将该值作为key
,从之前保存的地方取出用户信息,判断登录状态。
这种方式能够在一定程度上保证用户信息的安全,但又会面临新的问题,即用户数量一旦达到千万级,服务端内存的开销是非常大的,而且多个服务器之间session
的维护是比较麻烦的,即使使用session
服务器方式去处理,也会面临单点登录带来的风险,于是token
验证方式产生了。
token
方式也是cookie
方式的一种延伸,当登录完成时,将一些不敏感的信息,加上秘钥,进行签名,将不敏感信息和签名通过cookie
一起下发给客户端(也可以通过其他方式下发),客户端在请求需要登录权限接口时,将之前下发的信息一起发给服务端,服务端对其中不敏感信息进行签名,然后和客户端上传上来的签名进行对比,一致时说明用户登录成功。这种方式就很好的解决了多用户session
内存开销过大,服务端单点登录等问题。
session
和token
本质区别是session
是用空间换时间,而token
是用时间换空间,各有利弊。