首先要明确的是,cookie、session、token的主要作业就是在浏览器上保存用户的登录态。其实就是实现用户在网页上登录过一次后,一段时间内再次访问该网页不需要重新登陆,会实现自动登录的一个效果。
Cookie:
cookie是客户端用来存放数据的一个容器,大小大约为4K,最原始的实现保存用户登录态的方法就是使用cookie直接保存用户的用户名和密码。也就是说,在用户第一次登录的时候,我们将他的用户名和密码保存在cookie中,并设置cookie的过期时间,那么在cookie过期之前,我们每次访问这个网页,客户端就会自动把cookie中存储的用户登录信息发送给服务器,自动进行登录。
这就导致了Cookie十分不安全:黑客可以通过浏览器中的Cookie直接获得用户的用户名密码,进行非法操作。
Session:
Session其实是服务器中的一个会话,也就是服务器中保存一个客户端的域。session保存登录态其实是要结合客户端的cookie或者localStorage、sessionStorage来实现的。当用户第一次登录的时候,发送登录信息给服务器,服务器会创建一个Session,也就是一个和客户端进行会话的域。然后服务器给这个Session生成一个SessionID,里面同时生成了一系列相关配置信息,经过加密后发送给客户端。客户端用cookie来存储这个Session,同时根据服务器端给的配置信息设置过期时间。
但是使用Cookie会导致每一个用户登录时,服务器都要存放一个对应的SessionID和相关信息,那么服务器的负担会十分大,为了解决这个问题,就出现了token。
Token:
token是利用JWT技术,当用户第一次登陆时,服务器会生成一个JWT,服务器端只用保存这个JWT生成的密文,然后把JWT发送给客户端。客户端用cookie或者stroage保存这个JWT,然后设置存储过期时间。那么在有效期内,客户端只需要把JWT发送给服务器,服务器就知道用户的登录信息了。因为在这个技术中,JWT就像一个令牌(token)一样,所以这种方法被叫做token。