ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Cookie、Session、Token究竟区别在哪?如何进行身份认证,保持用户登录状态?图文详解

2022-01-06 13:33:42  阅读:199  来源: 互联网

标签:用户名 浏览器 Token Session Cookie 服务器 ID


HTTP是无状态的,也就是说你这次访问了服务器,关闭网页,再次访问服务器,服务器是没有意识到又是你来访问的。

不知道是我访问,怎么保持登录状态呢?

很多方法都可以,核心的概念就是存储

我们在B站注册了以后,B站就会把用户名和密码保存起来,常见的就是保存在数据库里面,也就是说下次登录的时候,B站就会根据输入的用户名密码,与数据库做对比,对比成功就返回相应页面。

image

现在重点来了,如果B站不想让我们已经登陆过的用户再次输入账号密码,应该怎么办呢?

我们这假设1天以后需要重新输入账号密码,根据上文我们知道,核心就是使用存储。

最简单的就是设置让用户可以先择记住用户名和密码,让浏览器记住用户名和密码。

image

如果是你,你愿意把你的密码交给浏览器吗?

如果你的电脑被黑了,那么你的浏览器里的记录的信息其实也是蛮危险的,就算浏览器能够完美保存你的账号密码不被破解,我们还得解决HTTP无状态的问题,因为即使我们不与要亲自输入用户名密码。

浏览器还得想办法帮我们在每一次请求里加入用户名密码。

这样才能做成保持登录呢

可以实现每次HTTP请求都自动带数据给服务器的技术

cookie!

cookie的基本流程是这样的

  1. 浏览器发起HTTP请求,服务器会进行Cookie设置,也就是Set-Cookie

  2. Cookie里有名和值两个重要属性,服务器会把明和值属性里的内容给填充完整,Cookie发送给浏览器以后,浏览器会保存起来,这样浏览器以后发送的每一个请求都会自动附上这个Cookie,说白了Cookie就是一种存储在浏览器的数据而已。
    image

而且实际上我们打开浏览器是可以看到保存了那些Cookie的,也就是说如果把用户名和密码放在Cookie上是很不安全的,只要电脑被黑,在Cookie里面的重要信息就会被泄露。

image

于是后来就有了新的概念,就是Session,也就是会话

image

既然浏览器和服务器实在进行会话的,浏览器访问服务器就是会话的开始,比较模糊的是回话的结束时间,因为你关掉网页,也许只是按错了而已,因此不同的网站对每个用户的回话都设定了时间以及唯一的ID,这里的时间,就是通常所说的Session ID, 这里的时间也就是结束会话的时间。

这里的时间则是结束会话的时间

因为是都武器自己定义的东西,因此一般会保存在数据库里面

image

而这个地方正是大家疑惑的开始。

有用户名为很么还要搞个Session ID

我们来回顾下访问B站的过程

首先我们使用用户名密码发送给B站服务器,

B站服务器核对了一下,确认应户名和密码是对的

身份认证成功

于是就在服务器这笔钱按创建一个Session ID和会话结束时间

这个Session ID通常是一串没有规律的字符串,当然话会创建其他参数,我们先看重点

服务器就需要把session ID和会话结束时间发送给浏览器,这里就用到了Cookie

设置Cookie,并且把Session ID加入到Cookie里

再把会话结束时间对应设置为这个Cookie的有效期,

浏览器拿到Cookie后台进行保存

注意了

浏览器这个时候没有保存用户名密码

保存的Session ID也是没有规律的字符串

这个Cookie里也就只有这个Session ID最重要,没有别的重要信息

这个时候大家可能疑惑

如果黑客入侵拿到Session ID怎么办?

其实黑客拿到Session ID不能说没有意义,知识意义不大

首先这个Session ID是没有规律的字符串

即使黑客有着柯南的头脑

也不能依据Session ID判断出用户的密码

其次,服务器在发送Cookie之前时会对这个含有Session ID的Cookie进行签名

换句话说,如果黑客修改了Session ID

Session ID就会编程服务器识别不了的字符串

所以浏览器保存Cookie以后

利用Cookie的核心特点

也就是每个请求,都会自动发送Cookie到相应服务器那里

换句话说,浏览器的下次访问,下下次访问都会自动发送这个Session ID给服务器

知道Cookie有效期失效之后,浏览器一边拿就会自行删除这个Cookie

这就是会话结束了

那么在cookie失效之后,用户就得重新输入用户名密码了

image

前端代码:

image

这里创建了一个前端登录页面,就是为了验证用户和保持用户登录状态

image

后端:

使用NodeJS

首先引入了一些库

为了验证Session ID ,这里使用了express-session库

接着就是用常见的中间件

这里创建了用户名和密码两个变量

这里没有使用数据库,我们就假设着两个变量就是用户注册一首保存在数据库里面的值

后面还创建了Session_BD变量用来把等会产生的Session给保存起来

接下来我们就可以设置服务器的Session了

secret属性的值是给Session ID Cookies签名的值

通常是很长的字符串,并且保存为环境变量

name属性就是设置Cookies里面的name,默认是connect.sid

maxAge这里很明显就是Cookie的有效期了

resave和saveUnintialized不是这里的重点以后解释

然后我们设置主页面,每次用户访问的时候就把用户发过来的Session保存到session_DB变量里面

如果用户已经登录过了,那么if这里会判断为true,就发送欢迎界面,否则九八登录页面发送给用户

然后设置登录页面

如果用户请求主体里面的用户名密码和服务器匹配,就生成新的Session

并且为这个Session添加一个新的人属性username

然后发送欢迎页面,否则提醒错误信息

最后就设置登出页面

用户登出以后,就清除掉服务器的Session,并且重定向到主页面

执行下代码
image

首先我们看到的浏览器的Cookie信息是空的

然后没我们输入用户名密码登录

Cookie就显示出来了

image

而且name就对应着服务器的那么属性的值

这个时候浏览器发送和了post请求

并且把用户名和密码放到HTTP的body里发送给服务器

image

这里有个细节

第一次发送请求的时候是没有附带Cookie的

image

因为服务器到收到请求才会设置cookie

我们看看服务器这边,已经提示生成看新的Session(Cookie)对象,并且唯一的Session ID也生成了,这个Session ID的值就放在cookie的value里面

image

现在我们再次登录主页面可以看到我们保持了登录状态

image

并且在请求里面也添加了Cookie,我们后续刷新登录,也是会自动发送这个Cookie

对吼我们点击登出

服务器的Session也被清除掉了

image

浏览器的Cookie也会随时间的流失而被删除

随着互联网的发展,用户群体变得越来越大,如果服务器依旧使用基于Cookie的Session,在特定时间有大量用户访问服务器的时候,服务器就可能会面临要存储大量Session ID在服务器里。

image

但是如果有多台服务器,一台服务器存储了Session ID,又会面临需要分享Session ID给其它服务器,因为可能出现这台服务器的超载,需要分配一些用户到其他服务器,其他服务器需要通过的Session ID才可以避免用户再次输入用户名和密码

image

但是服务器这样分享也不是办法,于是就可以让数据库存储Session ID

image

但是数据库如果崩溃了,又会影响服务器获取Session ID

image

各种原因和需求的前提下,就出现了一种技术叫JWT

image

也就是JSON Wed Token

首先用户第一次登录网页以后,服务器就会生成一个JWT

服务器不需要保存这个JWT,只需要保存JWT签名的密文

接着把JWT发给浏览器

可以让浏览器以Cookie会哦这Storage的形式进行存储

假设以Cookie的形式保存下来

这样用户每次发送请求都会把这个JWT发送给服务器

用户就不需要重新输入账号密码了

和Session很类似

这里的Token只不过存储在用户那边而已

image

当然很多人会疑惑这个Token的安全性

JWT是由三部分组成的,点分开

image

header部分声明需要用什么算法来生成签名

payload部分是一些特定的数据,比如有效期之类的

接着header和payload两部分的内容会经由Base64编码

注意是编码,不是加密,也就是很容易可以解码

虽然JWT不保存在服务器这里

但是服务器需要保存一段密码

这段密码要结合着两段编码进行算法运算

最终得到签名信息

这里使用的算法就是刚刚header声明的算法

签名信息也就是signatuer部分了

这样一个完整的JWT就可以发给客户端了

image

JWT例子:

image

如果我们修改三个部分其中一个字符,真个JWT都会出错,三个部分是相关联的。

因此JWT有一定的安全性,但是也不那么安全(后续.......)

Token代码

image

使用

postman来代替前端和浏览器部分,后台代码和前面的很类似

首先引用需要的库,因为需要创建JWT,所以这里用jsonwebtoken库做示范

接下来两个变量依旧是假设存在数据库里面的值

jwtSecret变量就是等会用于生成签名的字符串

这里有个/login路径

当识别到HTTP body里面的用户名密码和数据库的一致,就会生成以恶搞token变量,使用jwt.sign进行生成,生成需要三个部分,这里分别是payload,服务器JWT密码和header,然后就把token发送给客户端,下面是Vip路径

假设用户已经登录成功了,就可以使用token来登录/vip路径了

使用jwt.verify来衍生body里面的token 是否正确

这里会使用指定的服务器密码,也就是前面创建的变量

如果成功就提示用户

现在哦我们来使用postman进行验证

首先,模仿在body里面以json格式加入用户名密码

然后发送post请求

我们可以看到返回了一串字符串

image

他们都是由点分割的,也就是token了,我们复制这个token放在body里面,并且在发送一个请求到/vip路径

image

这个时候我们就可以的到/vip页面里面的内容了

image

也就实现了让用户不再需要重复输入用户名密码的操作了

其实大家不要把三者想的太复杂

Session是大半生并且保存在服务器那边的

由服务器主导一切

而Cookie则是一种数据载体

把Session放入Cookie中送到客户端那边

image

Cookie跟随着HTTP的每个请求发送出去

Token是诞生在夫区其,但保存在浏览器这边的

有客户端主导一切

可以放在Cookie或者Storage里面

持有Token就像持有令牌一样,可以允许访问 服务器

image

以上内容全部学习于B站up主 技术蛋老师
本人只是记录下来供自己学习,老师讲的很不错,感兴趣的小伙伴也可以去b站学习。
https://www.bilibili.com/video/BV1ob4y1Y7Ep

标签:用户名,浏览器,Token,Session,Cookie,服务器,ID
来源: https://www.cnblogs.com/qkshhan/p/15770690.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有