http是无状态协议,每次访问服务器,服务器都不知道上次也是你来访问
为了保持用户登录,使得每次登录不需要再次输入用户名、密码,用户每次登录时将登录信息放在http协议里发送给服务器,使用cookie解决
客户端向服务器发送http请求,服务器设置cookie的键值对(set-cookie),返回给客户端
此后每次客户端登录时发送请求都会带上cookie的键值对(但是这样不安全) ,这样就可以不用再输入密码,保持登录状态
但是打开浏览器可以看到保存了浏览器里哪些cookie,所以把用户名和密码这样放在cookie里不安全
所以有了session会话:
浏览器登录时,输入并发送用户名、密码给服务器,服务器创建SessionId(无规则字符串)和会话结束时间+其他参数,设置cookie并把他们加入到cookie中发送给浏览器,再把会话结束时间设置为这个cookie的有效期,浏览器拿到cookie后进行保存,浏览器没有保存用户名、密码,保存的是无规则的sessionid,服务器发送cookie之前,会对这个含有sessionid的cookie进行签名,故有人改了sessionid,服务器会不认识
用户每次请求,都会自动发送cookie到对应的服务器那里,直至失效
cookie失效之后,用户需要重新输入用户名、密码
如果sessionid过多,多个服务器又需要共享,占内存空间;如果存在数据库,数据库崩溃了又没法用,所以有了token,token由服务器产生,但存在客户端
用户输入用户名发送请求,服务器生成jwt(但不保存),只保存jwt签名密文,发送给浏览器,浏览器以cookie或storage的形式存储;之后用户每次请求都会携带jwt发送给服务器,不用重复输入用户名、密码
关于cookie、session、token的一些理解:
cookie:
cookie的身份认证: 用户发送请求之后,服务器获取请求中的用户名和密码,判断和数据库的数据是否一致,如果数据一致,就回写用户名和密码的cookie到浏览器,跳转到主页。如果数据不一致就响应用户或密码错误。
cookie的保持登录状态: 浏览器请求其他网页时,服务器判断是否有cookie数据,如果有就证明用户是在线的,去拿数据库数据显示到页面。如果没有,那么证明用户不在线,需要重新登陆。
session:
session的身份认证: 用户请求后,服务器获取用户数据和数据库数据判断,如果数据相同就开辟sessoon,并将数据存入session域,回写sessionID,跳转到主页。如果不相同,就响应用户和密码错误。
session的保持登陆状态: 浏览器访问其他页面,判断sessionID是否一致,如果id一致就证明用户是在线的,去获取session域里的数据再去拿数据库数据,将数据显示到页面上。如果id不一致,用户并不在线,需要重新登录。
token:
token是服务器加密的用户信息,服务器将token发给浏览器,浏览器用cookie或storage保存token。然后浏览器每次发送请求就带上token,服务器使用密钥将其解密并确认用户登录。
session诞生于服务器,存与服务器,用服务器主导一切;
cookie是一种数据载体,把session放入cookie中存到客户端,每次浏览器发送请求就会带上cookie的数据,cookie跟随每个http请求发送出去
token诞生在服务器,保存在浏览器,服务器将token发给浏览器,浏览器用cookie或storage保存token。然后浏览器每次发送请求就带上token,服务器将其解密并确认用户登录。
自己理解:
cookie:
用户输入用户名、密码发送请求给服务器,服务器设置cookie键值对,其中保存用户名、密码,并保存用户命、密码至数据库——之后用户每次http请求,都会带上cookie(cookie中有用户名、密码),服务器收到后,拿它们和数据库中的对比,成功了则验证通过
session:
用户输入用户名、密码发送请求给服务器,服务器将用户名、密码保存至数据库,并生成sessionid和会话有效时间等信息,将这些信息设置保存在cookie键值对中,会话有效时间置为cookie生存时间,再发送给浏览器——之后用户每次请求,都会带上sessionid等信息,服务器收到后,和数据库对比验证,通过则登录
token:
用户输入用户名、密码发送请求给服务器,服务器不保存用户的信息,只保存一个对应这些信息的jwt签名密文(密钥),并将jwt(jwt中包含用户名、等信息)发送给浏览器,以cookie或storage存储为token——之后用户每次请求,会自动发送cookie(其中含有token),服务器使用密码(密钥)解密token,解密后拿出加密的数据
jwt由三部分组成,header声明用何种算法生成签名,payload保存数据,signature包含签名信息
header和payload使用base64编码(不是加密),服务器保存一段密码,这个密码要结合这两段编码进行header声明的算法进行算法运算,生成签名信息
参考视频:Cookie、Session、Token究竟区别在哪?如何进行身份认证,保持用户登录状态?_哔哩哔哩_bilibili