热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

认识cookie、session以及tooken

一、为什么需要登录凭证呢?1、web开发中,我们使用最多的协议是http,但是http是一个无状态的协议。2、无状态的协议?

一、为什么需要登录凭证呢?


1、web开发中,我们使用最多的协议是http,但是http是一个无状态的协议。
2、无状态的协议?什么叫做无状态协议呢?
举个例子:
(1)我们登录了一个网站 www.xxx.com,登录的时候我们需要输入用户名和密码:比如用户名root,密码:123456.;
(2)登录成功之后,我们要以root的身份去访问其他的数据和资源,还是通过http请求去访问。
xxx的服务器会问:你谁呀?
root说:我是root呀,刚刚登录过呀;
xxx:怎么证明你刚刚登录过呀?
root说:这。。。,http没有告诉你吗?
xxx:http的每次请求对我来说都是一个单独的请求,和之前请求过什么没有关系。
(3)看到了吧?这就是http的无状态,也就是服务器不知道你上一步做了什么,我们必须得有一个办法可以证明我们登录过。


二、COOKIE

1、认识COOKIE
(1)COOKIE(复数形态COOKIEs),又称为“小甜饼”。类型为“小型文本文件,某些网站为了辨别用户身份而存储
在用户本地终端(Client Side)上的数据。

  • 浏览器会在特定的情况下携带上COOKIE来发送请求,我们可以通过COOKIE来获取一些信息;

(2) COOKIE总是保存在客户端中,按在客户端中的存储位置,COOKIE可以分为内存COOKIE和硬盘COOKIE。

  • 内存COOKIE由浏览器维护,保存在内存中,浏览器关闭时COOKIE就会消失,其存在时间是短暂的;
  • 硬盘COOKIE保存在硬盘中,有一个过期时间,用户手动清理或者过期时间到时,才会被清理;

(3)如果判断一个COOKIE是内存COOKIE还是硬盘COOKIE呢?

  • 没有设置过期时间,默认情况下COOKIE是内存COOKIE,在关闭浏览器时会自动删除;
  • 有设置过期时间,并且过期时间不为0或者负数的COOKIE,是硬盘COOKIE,需要手动或者到期时,才会删除;

2、COOKIE常见的属性
(1)COOKIE的生命周期:

  • 默认情况下的COOKIE是内存COOKIE,也称之为会话COOKIE,也就是在浏览器关闭时会自动被删除;
  • 我们可以通过设置expires或者max-age来设置过期的时间;
  • expires:设置的是Date.toUTCString(),设置格式是;expires=date-in-GMTString-format;
  • max-age:设置过期的秒钟,;max-age=max-age-in-seconds (例如一年为606024*365);

(2)COOKIE的作用域:(允许COOKIE发送给哪些URL)

  • Domain:指定哪些主机可以接受COOKIE
    如果不指定,那么默认是 origin,不包括子域名。
    如果指定Domain,则包含子域名。例如,如果设置 Domain=mozilla.org,则 COOKIE 也包含在子域名中(如developer.mozilla.org)。
  • Path:指定主机下哪些路径可以接受COOKIE
    例如,设置 Path=/docs,则以下地址都会匹配:
    /docs
    /docs/Web/
    /docs/Web/HTTP

3、客户端设置COOKIE

  • js直接设置和获取COOKIE:
    在这里插入图片描述

  • 这个COOKIE会在会话关闭时被删除掉;
    在这里插入图片描述

  • 设置COOKIE,同时设置过期时间(默认单位是秒钟)
    在这里插入图片描述

4、服务器设置COOKIE
(1)Koa中默认支持直接操作COOKIE

  • /test请求中设置COOKIE
  • /demo请求中获取COOKIE
    在这里插入图片描述

三、session

1、Session是基于COOKIE实现机制

  • 在koa中,我们可以借助于 koa-session 来实现session认证:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

三、token

1、认识token
(1)COOKIE和session的方式有很多的缺点:

  • COOKIE会被附加在每个HTTP请求中,所以无形中增加了流量(事实上某些请求是不需要的);
  • COOKIE是明文传递的,所以存在安全性的问题;
  • COOKIE的大小限制是4KB,对于复杂的需求来说是不够的;
  • 对于浏览器外的其他客户端(比如iOS、Android),必须手动的设置COOKIE和session;
  • 对于分布式系统和服务器集群中如何可以保证其他系统也可以正确的解析session?

(2)所以,在目前的前后端分离的开发过程中,使用token来进行身份验证的是最多的情况:

  • token可以翻译为令牌;
  • 也就是在验证了用户账号和密码正确的情况,给用户颁发一个令牌;
  • 这个令牌作为后续用户访问一些接口或者资源的凭证;
  • 我们可以根据这个凭证来判断用户是否有权限来访问;

(3)所以token的使用应该分成两个重要的步骤:

  • 生成token:登录的时候,颁发token;
  • 验证token:访问某些资源或者接口时,验证token;

2、JWT实现Token机制

JWT生成的Token由三部分组成:
(1) header

  • alg:采用的加密算法,默认是 HMAC SHA256(HS256),采用同一个密钥进行
    加密和解密;

  • typ:JWT,固定值,通常都写成JWT即可;

  • 会通过base64Url算法进行编码;

(2) payload

  • 携带的数据,比如我们可以将用户的id和name放到payload中;
  • 默认也会携带iat(issued at),令牌的签发时间;
  • 我们也可以设置过期时间:exp(expiration time);
  • 会通过base64Url算法进行编码

(3) signature

  • 设置一个secretKey,通过将前两个的结果合并后进行HMACSHA256的算法;
  • HMACSHA256(base64Url(header)+.+base64Url(payload), secretKey);
  • 但是如果secretKey暴露是一件非常危险的事情,因为之后就可以模拟颁发token,
    也可以解密token;
    在这里插入图片描述

3、Token的使用
当然,在真实开发中,我们可以直接使用一个库来完成: jsonwebtoken;
在这里插入图片描述
4、非对称加密

(1)前面我们说过,HS256加密算法一单密钥暴露就是非常危险的事情:

  • 比如在分布式系统中,每一个子系统都需要获取到密钥;
  • 那么拿到这个密钥后这个子系统既可以发布另外,也可以验证令牌;
  • 但是对于一些资源服务器来说,它们只需要有验证令牌的能力就可以了;

(2)这个时候我们可以使用非对称加密,RS256:

  • 私钥(private key):用于发布令牌;
  • 公钥(public key):用于验证令牌;

(3)我们可以使用openssl来生成一对私钥和公钥:

  • Mac直接使用terminal终端即可;
  • Windows默认的cmd终端是不能直接使用的,建议直接使用git bash终端;

openssl
> genrsa -out private.key 1024
> rsa -in private.key -pubout -out public.key

5、使用公钥和私钥签发和验证签名
在这里插入图片描述
6、派发令牌和验证令牌
在这里插入图片描述
在这里插入图片描述

四、补充部分

关注公众号:【深漂程序员小庄】:
内含丰富的学习资源和面试经验(不限前端、java),还有学习交流群可加,并且还有各大厂大佬可一起交流学习,一起进步~添加小庄微信,回复【加群】,可加入互联网技术交流群:

在这里插入图片描述


推荐阅读
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
author-avatar
想零的时候
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有