网易首页 > 网易号 > 正文 申请入驻

快速上手 Token 登录认证

0
分享至

微信搜索逆锋起笔关注后回复编程pdf 领取编程大佬们所推荐的 23 种编程资料! 作者:chrisghb 来源:https://www.jianshu.com/p/a32634a5170c
基于 Cookie/Session 的认证方案
Cookie
  • Cookie的工作原理

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是。cookie指的就是在浏览器里面存储的一种数据,仅仅是浏览器实现的一种数据存储功能。cookie的保存时间,可以自己在程序中设置。如果没有设置保存时间,应该是一关闭浏览器,cookie就自动消失。

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

注意Cookie功能需要浏览器的支持。如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效。不同的浏览器采用不同的方式保存CookieIE浏览器会以文本文件形式保存,一个文本文件保存一个Cookie

  • Cookie的不可跨域名性

Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带GoogleCookie,而不会携带BaiduCookie。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。

Session

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。

session也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。对于浏览器客户端,大家都默认采用cookie的方式,保存这个“身份标识”。

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安。

可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。

提示Session的使用比Cookie方便,但是过多的Session存储在服务器内存中,会对服务器造成压力。

Cookie与Session的区别和联系
  1. cookie数据存放在客户的浏览器上,session数据放在服务器上;

  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session

  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE

  4. 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;

CookieSession的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用。

基于token的认证方式

在大多数使用Web API的互联网公司中,tokens是多用户下处理认证的最佳方式。

以下几点特性会让你在程序中使用基于Token的身份验证

1.无状态、可扩展

2.支持移动设备

3.跨程序调用

4.安全

Token的起源

在介绍基于Token的身份验证的原理与优势之前,不妨先看看之前的认证都是怎么做的。

  • 基于服务器的验证

我们都是知道HTTP协议是无状态的,这种无状态意味着程序需要验证每一次请求,从而辨别客户端的身份。

在这之前,程序都是通过在服务端存储的登录信息来辨别请求的。这种方式一般都是通过存储Session来完成。

  • 基于服务器验证方式暴露的一些问题

1.Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。

2.可扩展性:在服务端的内存中使用Seesion存储登录信息,伴随而来的是可扩展性问题。

3.CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个域的资源,就可以会出现禁止请求的情况。

4.CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。

在这些问题中,可扩展行是最突出的。因此我们有必要去寻求一种更有行之有效的方法。

基于Token的验证原理

基于Token的身份验证是无状态的,我们不将用户信息存在服务器中。这种概念解决了在服务端存储信息时的许多问题。NoSession意味着你的程序可以根据需要去增减机器,而不用去担心用户是否登录。

基于Token的身份验证的过程如下:

  1. 用户通过用户名和密码发送请求。

  2. 服务器端程序验证。

3.服务器端程序返回一个带签名token给客户端。

4.客户端储存token,并且每次访问API都携带Token到服务器端的。

5.服务端验证token,校验成功则返回请求数据,校验失败则返回错误码。


Tokens的优势

  • 无状态、可扩展

在客户端存储的Tokens是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。tokens自己hold住了用户的验证信息。

  • 安全性

请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储tokencookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。

token是有时效的,一段时间之后用户需要重新验证。

  • 可扩展性

Tokens能够创建与其它程序共享权限的程序。

  • 多平台跨域

我们提前先来谈论一下CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。

需要设置有效期吗?

对于这个问题,我们不妨先看两个例子。一个例子是登录密码,一般要求定期改变密码,以防止泄漏,所以密码是有有效期的;另一个例子是安全证书。SSL安全证书都有有效期,目的是为了解决吊销的问题。所以无论是从安全的角度考虑,还是从吊销的角度考虑,Token都需要设有效期。

  • 那么有效期多长合适呢?

只能说,根据系统的安全需要,尽可能的短,但也不能短得离谱

  • 然后新问题产生了,如果用户在正常操作的过程中,Token过期失效了,要求用户重新登录……用户体验岂不是很糟糕?

一种方案,使用Refresh Token,它可以避免频繁的读写操作。这种方案中,服务端不需要刷新Token的过期时间,一旦Token过期,就反馈给前端,前端使用Refresh Token申请一个全新Token继续使用。这种方案中,服务端只需要在客户端请求更新Token的时候对Refresh Token的有效性进行一次检查,大大减少了更新有效期的操作,也就避免了频繁读写。当然Refresh Token也是有有效期的,但是这个有效期就可以长一点了,比如,以天为单位的时间。

  • 时序图表示

使用TokenRefresh Token的时序图如下:

1)登录

2)业务请求

3)Token过期,刷新Token

上面的时序图中并未提到Refresh Token过期怎么办。不过很显然,Refresh Token既然已经过期,就该要求用户重新登录了。

项目中使用token总结

使用基于Token的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

1.前端使用用户名跟密码请求首次登录

2.后服务端收到请求,去验证用户名与密码是否正确

3.验证成功后,服务端会根据用户id、用户名、定义好的秘钥、过期时间生成一个Token,再把这个Token发送给前端

4.前端收到 返回的Token,把它存储起来,比如放在Cookie里或者Local Storage

export interface User {
token: string;
userInfo: UserInfo | any;
companyInfo: CompanyInfo | any;
resources?: string[];
}

save(key: string, value: any, storageType ?: StorageType) {
return this.storageService.put(
{
pool: key,
key: 'chris-app',
storageType: StorageType.localStorage
},
value
);
}
this.storageService.save(CACHE_USER_KEY, user);

5.前端每次路由跳转,判断localStroage有无token,没有则跳转到登录页。有则请求获取用户信息,改变登录状态;6.前端每次向服务端请求资源的时候需要在请求头里携带服务端签发的Token

HttpInterceptor => headers = headers. set( 'token', this.authService.getToken());

7.服务端收到请求,然后去验证前端请求里面带着的Token。没有或者token过期,返回401。如果验证成功,就向前端返回请求的数据。

8.前端得到401状态码,重定向到登录页面。


HttpInterceptor =>401: '用户登陆状态失效,请重新登陆。'


逆锋起笔是一个专注于程序员圈子的技术平台,你可以收获最新技术动态、最新内测资格、BAT等大厂大佬的经验、增长自身、学习资料、职业路线、赚钱思维,微信搜索逆锋起笔关注!

支持下

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
87岁李昌钰去世,留下的巨额遗产分配曝光,两子女的决定让人意外

87岁李昌钰去世,留下的巨额遗产分配曝光,两子女的决定让人意外

天天热点见闻
2026-03-30 06:50:40
一路走好!仅1天又传出3位名人去世,有2位不到50岁,令人唏嘘

一路走好!仅1天又传出3位名人去世,有2位不到50岁,令人唏嘘

兴史兴谈
2026-03-30 08:11:09
愁死人了!有广东村民发文称盖房挖地基挖出个无主祖坟,网友热议

愁死人了!有广东村民发文称盖房挖地基挖出个无主祖坟,网友热议

芭比衣橱
2026-03-31 03:12:00
第一批每天做这些小动作的人,大脑已年轻2.3岁(惊人新发现:坏记性也能零成本变好

第一批每天做这些小动作的人,大脑已年轻2.3岁(惊人新发现:坏记性也能零成本变好

临床营养师刘遂谦
2026-03-30 07:07:20
今天南北经济的失衡,达到了历史上最严重的时期。

今天南北经济的失衡,达到了历史上最严重的时期。

流苏晚晴
2026-03-28 13:37:46
伊朗称击落两架MQ-9“死神”无人机

伊朗称击落两架MQ-9“死神”无人机

国际在线
2026-03-31 06:46:57
堕落的“清纯女星”酒井法子,这张腿间蝴蝶背后,隐藏着的故事

堕落的“清纯女星”酒井法子,这张腿间蝴蝶背后,隐藏着的故事

七阿姨爱八卦
2026-03-29 10:12:33
维尔茨:对瑞士进的世界波是我职业生涯中最漂亮的进球

维尔茨:对瑞士进的世界波是我职业生涯中最漂亮的进球

懂球帝
2026-03-31 08:04:38
特朗普赚翻了,美媒:越来越多证据显示,特朗普利用伊朗战争敛财

特朗普赚翻了,美媒:越来越多证据显示,特朗普利用伊朗战争敛财

爱吃醋的猫咪
2026-03-30 20:27:35
大连深夜突袭!全城急寻“神秘臭味”源头,官方最新进展来了!

大连深夜突袭!全城急寻“神秘臭味”源头,官方最新进展来了!

苗苗情感说
2026-03-31 03:03:10
马卡报关注西班牙人:2026年来联赛0胜却无需保级,堪称奇景

马卡报关注西班牙人:2026年来联赛0胜却无需保级,堪称奇景

懂球帝
2026-03-30 15:41:07
选举制度量身定制,反对派需领先5%才能赢,结果苦战欧尔班

选举制度量身定制,反对派需领先5%才能赢,结果苦战欧尔班

暗香暗香
2026-03-31 04:49:54
打出战争回旋镖:乌克兰如何把战争和痛苦,一起打包寄回莫斯科?

打出战争回旋镖:乌克兰如何把战争和痛苦,一起打包寄回莫斯科?

无月可归辛
2026-03-29 22:12:43
我工作存了300万,大伯问存款我说2万,大伯:你弟结婚你出彩礼

我工作存了300万,大伯问存款我说2万,大伯:你弟结婚你出彩礼

奶茶麦子
2026-03-30 20:25:26
一场6周的封神战役,震惊了世界警醒了中国,让中国军事迅速强大

一场6周的封神战役,震惊了世界警醒了中国,让中国军事迅速强大

超人强动物俱乐部
2026-03-31 07:22:06
学坏了?上汽大众把新势力损了个遍,然后ID. ERA 9X敢卖37.98万

学坏了?上汽大众把新势力损了个遍,然后ID. ERA 9X敢卖37.98万

小李车评李建红
2026-03-31 08:00:06
丁彦雨航:想融入NBA一定得会英语;NBA球员太卷了真的比不了

丁彦雨航:想融入NBA一定得会英语;NBA球员太卷了真的比不了

懂球帝
2026-03-30 10:11:07
世界赛场首次夺冠!国产摩托实现惊天超越 创始人:中国制造不输欧日美

世界赛场首次夺冠!国产摩托实现惊天超越 创始人:中国制造不输欧日美

封面新闻
2026-03-30 22:29:07
分享6个我觉得应该必装的Skills。

分享6个我觉得应该必装的Skills。

数字生命卡兹克
2026-03-30 10:13:22
410次开房记录流出:央企“女老虎”陶荔芳,背后还有多少同伙

410次开房记录流出:央企“女老虎”陶荔芳,背后还有多少同伙

深度报
2025-12-14 22:36:54
2026-03-31 08:35:00
技术小生
技术小生
互联网技术与技术人的职业发展
957文章数 515关注度
往期回顾 全部

科技要闻

一句谎言引发的硅谷血案

头条要闻

伊朗批准对霍尔木兹海峡征收通行费 特朗普设最后期限

头条要闻

伊朗批准对霍尔木兹海峡征收通行费 特朗普设最后期限

体育要闻

想进世界杯,意大利还要过他这一关

娱乐要闻

全红婵聊到体重哭了,每天只吃一顿饭

财经要闻

本轮地缘冲突,A股凭什么走出独立行情

汽车要闻

限时12.58万起 银河星耀8远航家系列上市

态度原创

本地
房产
游戏
手机
军事航空

本地新闻

用Color Walk的方式解锁城市春日

房产要闻

重磅!番禺20宗涉宅地亮相,万博CBD宅地将上新!

CEO暗示《GTA6》定价?并非高达100美元!

手机要闻

古尔曼:Apple Intelligence在中国意外上线,苹果已将其下线

军事要闻

第三艘航母出动数千名士兵抵达 美军大举增兵中东战场

无障碍浏览 进入关怀版