引言

前文介绍了 Session-Cookie 的认证过程,简单回顾下基本步骤:

  1. 客户端(浏览器)向服务器发送用户名和密码
  2. 服务器验证通过后,创建 Session 对象,在 Session 中保存该用户相关的数据,比如用户角色、登录时间等等
  3. 服务器向用户返回这个 Session 对象的唯一标识 SessionId,并写入客户端的 Cookie
  4. 客户端随后的每一次请求,都会通过 Cookie,将 SessionId 传回服务器
  5. 服务器收到 SessionId,并据此找到 Session 对象,由此获取到用户信息

这种方法的缺点就是分布式集群情况下无法保证每台服务器都拥有相同的 Session,上篇文章也简单介绍了几种 Session 如何在多个服务器之间共享的方法。

显然,Session 的维护给服务端造成了很大的困扰,有没有更好的方案,能不能直接不用 Session?

为此,Token 应运而生。

30s 图解 Token 认证

首先,什么是 Token?

简单来说,Token 其实就是一串字符串,一个令牌,客户端访问服务器时,验证通过后服务端会为其签发一张令牌,之后,客户端就可以携带这个令牌访问服务器,服务端只需要验证令牌的有效性即可。

一般来说,Token 的组成是这样的:

uid (用户唯一的身份标识) + time (当前时间的时间戳) + sign (签名,Token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)

基于 token 的认证步骤如下图,配合文字食用:

1)客户端(浏览器):用户向服务器发送登录信息(用户名和密码)来请求登录校验;

2)服务端:验证用户名密码等,验证成功后生成 token 并返回给前端,这个 token 就是之后鉴权的唯一凭证。服务端需要将这个 token 及其对应的用户信息存储在数据库或者缓存中;

3)客户端:将服务端返回的 token 存在 cookie 或者 localStorge 中,之后的每次请求之前,从 cookie 或者 localStorge 取出 token 将其设置进 HTTP Header 中(可以通过 HTTP 请求拦截器实现);

4)服务端:服务端接收到来自客户端的请求,从 HTTP Header 中取出 token,去缓存或者数据库中进行验证(该 token 是否存在 / 根据该 token 能否找到对应的用户),如果验证通过则执行进一步的业务操作,如果不通过则拒绝执行。

附加阅读

Token 认证服务端代码

先来看登录,就是先判断用户名密码是否正确,如果正确,那么会生成并返回一个字符串做为 token(这里偷个懒就直接用 UUID 来生成了),并将其和用户信息(这里就简单的存了 username)一并存入到数据库 or 缓存中(这里采用 Redis,过期时间可自行配置)。

退出登录实质就是删除 Redis 中存储的 token,完整内容如下:

再来个拦截器,前端拿到后端返回的 token 后每次请求前都会在 HTTP header 中带上这个 token,服务端设置个拦截器取出 Header 中的token,然后去 Redis 中进行判断这个 token 是否存在,若存在则允许进行下一步操作,:

Refresh Token

一般来说,为了安全起见,防止 token 被攻击者盗用,token 的有效期不会设置的太长,这样就会由于 token 过期导致用户需要重新登录从而生成新的 token。

如何才能做到不需要用户去频繁的登录呢,Refresh Token 机制出现了。

我们把之前的那个 Token 称之为 Access Token,业务接口用这个 Access Token 进行认证鉴权

而 Refresh Token 呢,就是一个专门用来在 Access Token 过期后重新获取新的 Access Token 的 Token

Refresh Token 的过期时间设置的长一点比如一两个月,Access Token 的过期时间设置短一点比如一周,这样可以缩短 Access Token 的过期时间保证安全,同时又不会因为频繁过期重新要求用户登录

具体认证步骤如下图,配合文字食用:

1)客户端(浏览器):用户向服务器发送登录信息(用户名和密码)来请求登录校验;

2)服务端: 验证用户名密码等,验证成功后生成 Access Token 和 Refresh Token 并返回给前端,服务端需要将这两个 token 及其对应的用户信息存储在数据库或者缓存中;

3)客户端: 将服务端返回的 Access Token 和 Refresh Token 存在 cookie 或者 localStorge 中,之后的每次请求之前,从 cookie 或者 localStorge 取出 Access Token 将其设置进 HTTP Header 中(可以通过 HTTP 请求拦截器实现);

4)服务端:

  • 验证 Access Token 有效:正常返回数据
  • 验证 Access Token 过期:拒绝请求
    • 客户端:重新发起请求,在 HTTP Header 中携带 Refresh Token 发送给服务端
    • 服务端:验证客户端传来的 Refresh Token ,验证成功后生成新的 Access Token 并返回给客户端
    • 客户端:获得服务端返回的新的 Access Token,重新发起请求并携带新的 Access Token

如何理解 Refresh Token 的必要性,或者说为什么使用 Refresh Token 能够更安全?

  • Access Token 每次访问都要带着,因此更容易被盗取
  • 而 Refresh Token 客户端获取到之后就保存起来,Access Token 失效之后,才会用到 Refresh Token,所以粗略来说 Refresh Token 只会在网络上传输两次,一次是你获取的时候,一次是你使用的时候(从上图可以看出来),因此 Refresh Token 被盗的风险远远小于 Access Token

小伙伴们大家好呀,本文首发于公众号@飞天小牛肉,阿里云 & InfoQ 签约作者,分享大厂面试原创高质量题解、原创技术干货和成长经验。回复『春秋招』我拉你进求职吹水交流群,回复『简历修改』免费获取简历修改服务,回复『Echo』免费获取社区项目手把手教程)

收留 2023 秋招伤心人,秋招补录 & 春招强势开启,现在不投年后要被冲烂啦,信息汇总长期更新:小牛肉 x 互联网春招 & 秋招补录信息汇总

如何用 30s 给面试官讲清楚什么是 Token的更多相关文章

  1. 面试官所问的--Token认证

    写这一篇文章的来源是因为某一天的我被面试官提问:让你设计一个登录页面,你会如何设计? 我当时的脑子只有??? 不就是提交账号.密码给后台就搞定了呢? 不可能那么简单,我弱弱的想,难道要对密码加密?? ...

  2. 我是如何用 ThreadLocal 虐面试官的?

    我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. Thr ...

  3. 如何用json 与jsonp 的区别去回答你的面试官?

    常常 有面试官这样问我们,虽然用过无数次,但是回答不上岂不是尴尬,那我们浅析一下它们的区别? 1. json JSON是一种基于文本的数据交换格式,用于描述复杂的数据,举个例子: var nax=[ ...

  4. 引用面试官文章 :如何准备Java初级和高级的技术面试

    本人最近几年一直在做java后端方面的技术面试官,而在最近两周,又密集了面试了一些java初级和高级开发的候选人,在面试过程中,我自认为比较慎重,遇到问题回答不好的候选人,我总会再三从不同方面提问,只 ...

  5. java面试官如何面试别人

                                                                                      java面试官如何面试别人(一) j ...

  6. 8年经验面试官详解 Java 面试秘诀

      作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三 ...

  7. 一个资深java面试官的“面试心得”

    在公司当技术面试官几年间,从应届生到工作十几年的应聘者都遇到过.先表达一下我自己对面试的观点: 1.笔试.面试去评价一个人肯定是不够准确的,了解一个人最准确的方式就是“路遥知马力,日久见人心”.通过一 ...

  8. iOS开发,这样写简历才能让大厂面试官看重你!

    前言: 对于职场来说,简历就如同门面.若是没想好,出了差错,耽误些时日倒不打紧,便是这简历入不了HR的眼,费力伤神还不能觅得好去处,这数年来勤学苦练的大好光阴,岂不辜负? 简历,简而有力.是对一个人工 ...

  9. (转)史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!

    背景:因为自己的简历写了dubbo,面试时候经常被问到.实际自己对dubbo的认识只停留在使用阶段,所以有必要好好补充下基础的理论知识. https://zhuanlan.zhihu.com/p/45 ...

  10. 面试官问我,使用Dubbo有没有遇到一些坑?我笑了。

    前言 17年的时候,因为一时冲动没把持住(当然最近也有粉丝叫我再冲动一把再更新一波),结合面试题写了一个系列的Dubbo源码解析.目前公众号大部分粉丝都是之前的粉丝,这里不过多介绍. 根据我的面试经验 ...

随机推荐

  1. Annocation(注解)的使用示例

    示例一:生成文档相关的注解示例二:在编译时进行格式检查(JDK内置的三个基本注解)@Override: 限定重写父类方法, 该注解只能用于方法@Deprecated: 用于表示所修饰的元素(类, 方法 ...

  2. 在IDEA中使用Maven将SpringBoot项目打成jar包、同时运行打成的jar包(前后端项目分离)

    1.maven教程官网 https://m.runoob.com/maven/ 2.理解Maven的构建生命周期(clean.Package) 3.在项目中使用maven进行打包 4.运行打包好的ja ...

  3. 齐博x1服务器性能太差,调整系统升级每次校验的文件数

    系统升级需要校验本地的文件是否被修改过,系统默认每次检验1千个文件,一般来说需要分四到五页来处理,如下图所示. 如果你的服务器性能太差的话,就需要手工把数值调小.把下面的代码复制出来.进入后台数据库管 ...

  4. vue2 解决跨域

    vue2.x 解决跨域 通过devServer将接口代理到本地在开发的时候,需要请求同局域网内的接口,发现直接使用http://对方的ip地址/接口路径,会出现类似下图的跨域报错 找到并打开vue.c ...

  5. VS2022连接Oracle数据库所需包和连接字符串

    VS连接ORACLE数据库 l  VS2022连接ORACLE数据库时,需要引入Oracle.ManagedDataAccess.Core包. l  引入方式:打开VS2022==>项目==&g ...

  6. 一、Vue.js介绍

    一.介绍 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手 ...

  7. 七、kubernetes污点和容忍

    Kubernetes污点和容忍 一.Taint 和 Toleration介绍 节点亲和性,是 pod 的一种属性(偏好或硬性要求),它使 pod 被吸引到一类特定的节点.Taint 则相反,它使节点能 ...

  8. day15-Servlet04

    Servlet04 12.ServletConfig 12.1ServletConfig基本介绍 ServletConfig类是为Servlet程序配置信息的类 Servlet对象和ServletCo ...

  9. 图学习【参考资料2】-知识补充与node2vec代码注解

    本项目参考: https://aistudio.baidu.com/aistudio/projectdetail/5012408?contributionType=1 *一.正题篇:DeepWalk. ...

  10. Microsoft Office MSDT代码执行漏洞(CVE-2022-30190)漏洞复现

    目录 免责声明: CVE-2022-30190漏洞复现 漏洞概述: 影响版本: 漏洞复现: 使用方法: 利用: 修复建议: 参考: 免责声明: 本文章仅供学习和研究使用,严禁使用该文章内容对互联网其他 ...