引言

前文介绍了 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 就是之后鉴权的唯一凭证;

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

4)服务端:服务端接收到来自客户端的请求,从 HTTP Header 中取出 token,并根据规则对 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 并返回给客户端;

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. 字符串匹配(BF算法和KMP算法及改进KMP算法)

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include<cstring> ...

  2. docker支持ipv6

    方法 方法一.Pv6地址 不为容器中的服务特别分配IPv6地址. 只要Docker把外部的IPv6地址端口映射到容器的IPv4端口上,随后访问主机的IPv6相应端口即可. 方法二.为Docker网络分 ...

  3. Feign 实现 GET 方法传递 POJO

    Feign 实现 GET 方法传递 POJO 作者:Grey 原文地址: 博客园:Feign 实现 GET 方法传递 POJO CSDN:Feign 实现 GET 方法传递 POJO 需求 Sprin ...

  4. ANSYS安装教程

    ANSYS 16.0 WIN10 64位安装步骤:1.使用"百度网盘客户端"下载ANSYS 16.0软件安装包到电脑磁盘里全英文名称文件夹内,安装前先断开网络,然后找到ANSYS. ...

  5. 基于 MQ 的分布式 Serverless 多租任务处理系统架构演进

    本文作者:史明伟 , 阿里云智能高级技术专家. 1 Serverless 异步任务处理系统诞生和挑战 无论是对于云的开发者,还是尝试业务升级的企业客户,Serverless的三个概念 "极致 ...

  6. mindxdl--common--web_cert_utils.go

    // Copyright (c) 2021. Huawei Technologies Co., Ltd. All rights reserved.// Package common this file ...

  7. [排序算法] 直接/折半插入排序 (C++)

    插入排序解释 插入排序很好理解,其步骤是 :先将第一个数据元素看作是一个有序序列,后面的 n-1 个数据元素看作是未排序序列.对后面未排序序列中的第一个数据元素在这个有序序列中进行从后往前扫描,找到合 ...

  8. Gorm源码学习-数据库连接

    1 前言 gorm源码地址: Gorm , 本文基于commit:cef3de694d9615c574e82dfa0b50fc7ea2816f3e 官方入门指南: Dosc 2 连接数据库代码示例 目 ...

  9. i春秋broken

    点开一个附带超链接的网页,直接点击file跳转到broken网页 网页里面是一个jsfuck代码 Jsfuck代码的执行方法 ①复制 ②打开firefox浏览器 ③按下F12 ④选择上方的控制台 ⑤在 ...

  10. 【数据库】Oracle建表、创建序列、添加触发器生成自增主键

    CREATE TABLE "TEST"."T_ORDER" (    "AUUID_0" VARCHAR2 ( 255 ) NOT NULL ...