熬夜彻底搞懂cookiesessiontokenjwt(代码片段)

捡田螺的小男孩 捡田螺的小男孩     2022-11-28     188

关键词:

一切的根源就是因为 HTTP 是一个无状态的协议。

token等机制将客户端多次请求关联起来。

想象一下如果没有 cookiesessiontoken 这样的机制,我们在网站上每次点击都需要重新输入密码认证,这样槽糕的体验你还愿意继续用吗?

在讲解cookiesessiontoken前我们先简单讲解两个概念:认证授权

最开始被设计出来是为了弥补HTTP在状态管理上的不足。

  • cookie 存储在客户端:cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
  • cookie 是不可跨域的:每个 cookie 都会绑定单一的域名(包括子域),无法在别的域名下获取使用。
  • 设置 cookie

    服务器向客户端发送 Cookie 是通过 HTTP 响应报文实现的,在 Set-Cookie 中设置需要向客户端发送的cookie,cookie格式如下:

    Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
    cookie 工作流程

    (1)浏览器向服务器发送请求;

    (2)服务器响应请求,向浏览器设置 cookie;

    (3)浏览器将 cookie 存在本地,下一次请求带上该 cookie;

    (4)服务器响应请求。

    cookie 常见属性

    (1)name=value

    键值对,设置 Cookie 的名称及相对应的值。

    (2)domain

    指定 cookie 所属域名,默认是当前域名。如果 cookie 的 domain 设置为 taobao.com,那么 item.taobao.com, order.taobao.com 都是可以共享 cookie 的, 但是访问 tmall.com 就不能共享 cookie 了,这就涉及跨域访问的问题,跨域问题如何解决,这里不展开,有兴趣可以自行搜索。

    (3)path

    指定 cookie 在哪个路径(路由)下生效,默认是 \'/\'。如果设置为 /abc,则只有 /abc 下的路由可以访问到该 cookie,如:/abc/read。

    (4)expires

    指定 cookie 的过期时间(GMT时间格式),到达该时间点后该 cookie 就会自动失效。

    (5)max-age

    HTTP 1.1中定义的,优先级高于 expires 字段。

    max-age 表示 cookie 有效期,单位秒。如果为正数,则该 cookie 在 max-age 秒后失效;如果为负数,该 cookie 为临时 cookie ,关闭浏览器即失效,浏览器也不会以任何形式保存该 cookie ;如果为 0,表示删除该 cookie 。默认为 -1。

    (6)HttpOnly

    如果给某个 cookie 设置了 httpOnly 属性,则无法通过 JS 脚本读写该 cookie 的信息。

    (7)secure

    该 cookie 是否仅被使用安全协议传输,默认为false。当 secure 值为 true 时,cookie 在 HTTP 中是无效的。

    什么是 session?

    session 翻译过来就是『会话』。用户打开一个浏览器, 点击多个超链接, 访问服务器多个web资源, 然后关闭浏览器, 整个过程称之为一个会话。

    (1)session 的特点

  • session 是另一种记录服务器和客户端会话状态的机制;
  • session 存储在服务器端,一般是文件中,也可以存在数据库或缓存中。
  • session 一般基于 cookie 实现。session 中包含敏感信息存储在服务器端,通常将 sessionId 存储在客户端的 cookie 中,客户端每次请求携带 sessionId 即可识别用户。
  • (2)session 工作流程

    (1)用户第一次请求,提交用户名密码等信息进行登录认证,服务器根据用户提交的信息进行鉴权,鉴权成功后创建 session 对象,并将 sessionId 塞入 cookie 中,浏览器收到响应信息将 cookie 存入本地;

    (2)用户第二次请求,以查看订单信息为例,浏览器自动将当前域名下的 cookie 信息发送给服务端,服务端解析 cookie,获取到 sessionId 后再查找对应的 session 对象,如果 session 对象存在说明用户已经登录,继续下一步操作。

    从上面的流程可知,sessionId 是 cookie 和 session 中间的一道桥梁。

    需要注意:如果客户端禁用了 cookie,还可以通过 url 重写等方法传递 sessionId。

    cookie 和 session 的区别

  • 存储方式:cookie 数据存放在客户的浏览器上,session 数据放在服务器上;
  • 安全性:cookie 是本地存储,不是很安全,别人可以分析存放在本地的 cookie 并进行欺骗;
  • 存储大小:很多浏览器限制单个 cookie 保存的数据不能超过4K,一个站点最多保存20个cookie,session 没有类似的限制;
  • 生存周期:cookie 可设置为长时间保持,Session 一般失效时间较短,一般客户端关闭 session 就会失效。
  • 什么是 token ?

    (1)token 的组成

    token 是验证用户身份的凭证,我们通常叫它:令牌

    最简单的token组成: uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,以哈希算法压缩成一定长的十六进制字符串)

    (2)token 特点

  • 无状态、可扩展
  • 支持移动端设备
  • 支持跨程序调用
  • 安全
  • (3)token 工作流程

    第一步:客户端使用用户名密码或者扫码等形式请求登录;

    第二步:服务端收到请求后进行鉴权,鉴权成功后服务端会生成一个 token 并发送给客户端,客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者 localStorage 里;

    第三步:客户端下一次向服务端请求资源的时候需要带着存储的 token;

    第四步:服务端收到请求,然后去验证客户端请求里面带着的 token ,如果验证成功,就向客户端返回请求的数据。

    需要注意:

  • 客户端请求时可以将 token 放到 HTTP 的 Header 里;
  • 基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。
  • 用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库
  • 什么是 JWT?

    (1)JWT 是标准 化的 token

    从本质上讲 JWT 也是一种 token,只不过 JWT 是被大家广泛接受的标准。

    JWT 即:Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准(RFC 7519)。

    JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息。

    (2)JWT 的组成

    JWT 共有三部分组成:

  • 第一部分我们称它为头部(header)
  • 第二部分我们称其为载荷(payload, 类似于飞机上承载的物品)
  • 第三部分是签证(signature)
  • 在https://jwt.io/网站上可以解析一个已知的 JWT:

  • header
  • jwt的头部承载两部分信息:声明类型,这里是jwt;声明加密的算法,通常直接使用 HMAC SHA256;

  • playload
  • 载荷就是存放有效信息的地方。主要包含三个部分:标准中注册的声明公共的声明私有的声明

  • signature
  • jwt 的第三部分是一个签名信息,这个签证信息由三部分组成:header (base64后的);payload (base64后的);secret。

    (3)JWT 的特点

  • 不在 jwt 的 payload 部分存放敏感信息,因为该部分是客户端可解密的部分。
  • 保护好 secret 私钥,该私钥非常重要。
  • 如果可以,请使用 https 协议。
  • 总结

    在分布式微服务技术日趋流行的今天,大型网站的设计都尽量避免使用 session 实现 HTTP 状态化。

    session简单粗暴,在服务端维护会话信息,在客户端保存session id,服务端能够轻易地把会话控制在自己的手中,但服务集群化产生了session共享的负担;

    jwt(token)只在客户端保存会话信息,服务端通过密钥校验会话,(相比session)拿时间换空间,卸下了服务端集群共享会话信息的负担,同时也加大了服务端控制会话的难度。

    大家在工作中使用哪种方案,欢迎在留言区讨论。

    -- End --

    求鼓励,『点赞』、『在看』、『分享』三连支持一下呗,下期见~

    彻底搞懂filterwatchcomputed

    过滤器filterfilter作用:可被用于一些常见的文本格式化使用方式:添加在JavaScript表达式的尾部,由“管道”符号指示全局注册(main.js)//main.jsimportVuefrom'vue';importDemofrom'./demo.vue';import{Button,Modal}from'ant-design-vue';import{translate}fr 查看详情

    彻底搞懂最短路算法

    ...给大二的孩子们又讲了一遍,随手谷歌了N多资料,算是彻底搞懂了最短路径问题。请读者尽情享用……  &n 查看详情

    两张图彻底搞懂mybatis的mapper原理!

    作者:肥朝简单使用这是一个简单的Mybatis保存对象的例子1@Test2publicvoidtestSave()throwsException{3//创建sessionFactory对象4SqlSessionFactorysf=newSqlSessionFactoryBuilder().5build(Resources.getResourceAsStream("mybatis-config.xm 查看详情

    彻底搞懂分布式系统服务注册与发现原理

    目录引入服务注册与发现组件的原因单体架构应用与数据分离集群部署 查看详情

    彻底搞懂html5本地存储技术

    1、cookiescookies的应用比较广泛,但有以下几个问题:(1)每次http请求头上会带着,浪费资源(2)每个域名客户端只能存储4K大小 (3)会造成主Domain污染(4)cookies明文传输很不安全2、UserData(只有IE支持)3、其他非主流方... 查看详情

    怎样才算彻底搞懂一个算法代码

    ...的核心技术。比如有一个现成的算法代码,怎样才算彻底搞懂它?有哪些评价标准?我想到了四点:1.应用层次  应用层次就是你知道算法的功能是什么,输 查看详情

    还没彻底搞懂?我自罚三杯!(代码片段)

    ...了,作为一名Linuxer,大名鼎鼎的分页机制必须要彻底搞懂!我就尽自己的最大努力,正确把我理解的分页机制,用图文形式彻底分解,希望对您有所帮助!一共分3篇文章:这篇文章主要介绍单映射表;下... 查看详情

    彻底搞懂javascript中的this指向

    前言本文将从以下几方面阐述Javascript中this的指向问题。标准函数中,this的引用值是什么箭头函数中,this的引用值是什么使用new关键字创建对象时,this的引用值是什么闭包中使用this时,this的引用值什么标准函数中,this的引用... 查看详情

    彻底搞懂java内存泄露

    Java内存回收方式Java判断对象是否可以回收使用的而是可达性分析算法。在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的。这个算法的基本思路就是通过一系列名为”GCRoots”的对象作为起始点,... 查看详情

    彻底搞懂juc(代码片段)

    点击关注公众号,实用技术文章及时了解来源:blog.csdn.net/wangwenpeng0529/article/details/105769978简介在Java5.0提供了java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类,用于定义类似于线程的自定义子系统,... 查看详情

    彻底搞懂javascript中的this关键字

    本文对JavaScript中的this关键字进行全方位的解析,看完本篇文章,希望读者们能够完全理解this的绑定问题。开篇:对于那些没有投入时间去学习this机制的JavaScript开发者来说,this的绑定是一件令人困惑的事。(包括曾经的自己)... 查看详情

    彻底搞懂css文本空白换行问题

    本文前提:文本的父容器是块级元素。首先,我们来整理一下与换行有关的3个CSS属性: word-break该属性决定文本内容超出容器时,浏览器是否自动插入换行符。属性值:normal:默认换行规则——英文以词为单位换行,... 查看详情

    还没搞懂正则?熬夜到虚脱整理出来的python的正则表达式总结(regularexpression)(代码片段)

    前言:作者:神的孩子在歌唱这是我听老师讲课做的笔记大家好,我叫陈运智,大家可以叫我智正则表达式一.python正则表达式介绍二.re模块2.1match方法2.2匹配规则2.2.1匹配字符2.2.2分组匹配2.2.3限定匹配字符规则2.2.... 查看详情

    一文彻底搞懂zookeeper(代码片段)

    本文是基于CentOS7.9系统环境,进行Zookeeper的学习和使用1.Zookeeper简介1.1什么是ZookeeperZookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。本质上,就是文件系统+通知机制1.2Zookeeper工作机制Zookeepe... 查看详情

    一文彻底搞懂zookeeper(代码片段)

    本文是基于CentOS7.9系统环境,进行Zookeeper的学习和使用1.Zookeeper简介1.1什么是ZookeeperZookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。本质上,就是文件系统+通知机制1.2Zookeeper工作机制Zookeepe... 查看详情

    彻底搞懂juc(代码片段)

    你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起精进!编辑:业余草blog.csdn.net/wangwenpeng0529推荐:https://www.xttblog.com/?p=5271简介在Ja... 查看详情

    一文彻底搞懂slam技术(代码片段)

    什么是SLAM?SLAM (simultaneouslocalizationandmapping),也称为CML(ConcurrentMappingandLocalization),即时定位与地图构建,或并发建图与定位。问题可以描述为:将一个机器人放入未知环境中的未知位置,是否有办法让机器人一边逐步描... 查看详情

    一文彻底搞懂slam技术(代码片段)

    什么是SLAM?SLAM (simultaneouslocalizationandmapping),也称为CML(ConcurrentMappingandLocalization),即时定位与地图构建,或并发建图与定位。问题可以描述为:将一个机器人放入未知环境中的未知位置,是否有办法让机器人一边逐步描... 查看详情