cookie, session和token的区别

2020 / 02 / 04

cookie

这个问题从毕业起就一直困扰着我,现在总算感觉自己可以回答上来了,首先cookie是一种技术,为了帮助无状态的http协议记住用户信息而产生的一种在客户端本地化信息的一种技术,cookie信息可以被服务端安置在客户端,然后通过一些和cache-control一样的方法来控制cookie,最典型的就是http-only和secure属性,前者让cookie只能被http读取,后者让cookie只能在https下起作用。

session

那么session呢,session直译过来就是会话,cookie本地化的信息一般是一个加密的sessionId,告诉服务器现在是哪个会话,有了这个sessionid,服务器就可以数据库或其他的存储中查找这是哪个用户或者哪次会话,这就可以知道用户是谁了。所以session是一种服务端技术,可以是在redis中的数据,也可以是数据库中的数据。

json web token

token是一种令牌,用户拿着这个令牌就可以在服务器中获得相信的权限,用token的话就不需要服务器保存session了,这就让服务端省去了一个很大的麻烦,jwt全称json web token,它把token分为三部分,用 . 隔开,三部分分别是header, payload和signature,signature是一个通过header, payload和secret计算出来的密钥,客户端无法伪造,所以token是客户端造假不了的,服务端拿到payload之后就可以知道用户是谁了,就不用再查询数据库了。

jwt中一般包含token的过期时间和签发时间,签发人等信息,所以可以通过这些数据知道token的有效性。而要实现单点登录的话,需要token中携带deviceId,然后在服务器备份token可以解决,但这也使得服务端又保存了用户状态,因为token被签发了就无法销毁了。

access_token和refresh_token

access_token和refresh_token是一种管理token的 方式,通过access_token来鉴权,通过refresh_token来获取新的access_token,refresh_token一般生命较长,为什么要用refresh_token呢,很多人可能会觉得它多此一举,其实不然,token的作用就是持久化,防止用户频繁的登录,而频繁登录有个问题就是发送用户名密码,就会导致账号被盗,但是access_token被盗走没关系呀,因为它命短,而refresh_token只会很久很久才发送一次就不会被盗走了,简单的说refresh_token存在的原因就是防止http抓包的过程中盗走用户的token,当然refresh_token被盗走了就没得办法了。

他们的区别

access_token和refresh_token其实是一种对jwt进行管理的方式,经常用在oauth认证中;而jwt是一种签名方式,access_token中签发的token可以是jwt。总之他们就不是一类东西。另外cookie和token的区别是什么呢,cookie是一种http协议的机制,一种前端存储方式,session是配合cookie用的服务端的东西,当然cookie中存的东西也可以是jwt,这个时候服务端就不需要session了,所以cookie,session,token并不是同一类东西。

写评论
全部评论