Http Only Cookie保护AccessToken
【导读】JWT认证方式目前已被广泛使用,一直以来我们将token放在请求头中的Authorization中,若通过此种方式,一旦token被恶意窃取,攻击者可肆意对用户可访问资源进行任意索取
我们大多都是通过登录成功后,响应AccessToken,然后由前端将token存储在相关Storage中,然后每次将其放请求头而认证请求,由于token是极其敏感信息,所以我们不能将其交由前端去处理,而应由后台获取对前端不可见
对安全有较高要求的平台,我们通过Http Only Cookie来解决token恶意窃取问题
Http Only Cookie
Http Only Cookie简言之则是将相关信息响应时存储在Cookie中,而客户端脚本无法访问,每次请求时,则将自动携带所有信息到服务器。例如,京东存储相关信息
接下来我们看看在.NET Core中如何将AccessToken以Http Only方式存储在Cookie中
[AllowAnonymous]
[HttpGet("api/test/get")]
public IActionResult Get()
{Response.Cookies.Append("x-access-token", GenerateToken(),new CookieOptions(){Path = "/",HttpOnly = true});return Ok();
}
如上,我们模拟登录成功,并不返回AccessToken,而是将其写入到响应头中,上述Cookie选项HttpOnly为true即表示客户端脚本不可访问
此时我们来访问如下需认证接口
[HttpGet("api/test/say")]
public string Say()
{return "Hello World";
}
用过JWT的童鞋都知道,标准模式则是将AccessToken写入到Authorization中,即请求头【Authorization: Bearer ......】,那么上述是如何认证成功而请求到接口的呢?
当我们添加JWT认证时,每次请求在其对应事件OnMessageReceived中将自动获取请求头Authorization中的值,将其赋值给context.Token
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{......options.Events = new JwtBearerEvents{OnMessageReceived = context =>{//Bearer Tokencontext.Token = ""; return Task.CompletedTask;}};
});
你问我是怎么知道的,我是猜的吗,当然不是,丢出官方源码就知道了,直接找到JWT如何处理认证则一目了然
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{string token = null;// Give application opportunity to find from a different location, adjust, or reject tokenvar messageReceivedContext = new MessageReceivedContext(Context, Scheme, Options);// event can set the tokenawait Events.MessageReceived(messageReceivedContext);if (messageReceivedContext.Result != null){return messageReceivedContext.Result;}// If application retrieved token from somewhere else, use that.token = messageReceivedContext.Token;if (string.IsNullOrEmpty(token)){string authorization = Request.Headers[HeaderNames.Authorization];// If no authorization header found, nothing to process furtherif (string.IsNullOrEmpty(authorization)){return AuthenticateResult.NoResult();}}.......
}
到这里我们知道了自动获取Token的原理,我们修改了Token存储方式,照葫芦画瓢就好,如此将覆盖默认标准模式,如下:
OnMessageReceived = context =>
{var accessToken = context.Request.Cookies["x-access-token"];if (!string.IsNullOrEmpty(accessToken)){context.Token = accessToken;}return Task.CompletedTask;
}
从分析自动获取Token原理,我们也可知道,若与第三方对接,依然可以使用请求头Authorization标准模式认证,因为Cookie为空,再次获取Authorization值
注意:发现若将前端未置于wwwroot下,即完全前后分离,涉及到跨域的情况下,比如使用的是axios封装请求,那么应该必须在请求头中添加【withCredentials:true 】,否则使用Http Only将无效,出现401
额外意外发现一个很有意思的问题,未深入研究,这里当做小知识了解下就好,或许是我自以为发现新大陆了呢
当我们创建AccessToken时,都会设置一个过期时间,我们知道此过期时间肯定不会设置过长,但是若在比如移动端微信小程序中,若设置时间不长,必然要考虑刷新Token问题,为了懒一点,我们将Token设置为永不过期,那么JWT支持吗?
当然支持,只不过根据我刚好尝试了几次,找到了JWT永不过期的上限,最大只能是16年,若超过此临界点,比如17年,如下:
将会出现401,具体错误如下:
了解,了解就好,也没啥鸟用,我也是经常会瞎想,比如考虑某些可能存在的极限情况
Http Only Cookie保护AccessToken相关推荐
- 浏览器阻挡cookies_浏览器设置阻止第三方Cookie保护自己隐私
当我们在某些大型网站上搜索一些东西时,在另外的一些网站出现了你搜索的东西的相关广告,这种现象的出现说明我们的隐私已经被跟踪.这种侵犯我们用户隐私现象的出现,要归功于第三方cookie所带来的副作用(隐 ...
- html5 ios cookie,iOS设置cookie到web遇到的坑
获取本地的cookie,[SystemConfigure shareSystemConfigure].get_kHttpURL]留意用自己本地的域名,获取本地的登录的cookie信息 - (NSStr ...
- 15.10. Session/Cookie
为什么我要在这里提Session和Cookie,这也大型站点必须要处理问题. 15.10.1. Session 在集群环境中与单服务器是不一样的,集群组成可分为调度服务器和节点,节点数量不定,单个节点 ...
- 前后端分离单点登录SSO实现方案 淘宝、京东跨域获取Cookie、OAuth2、QQ客户端多种模式
演示Demo站点 http://sso.exrick.cn 开源版Github地址 https://github.com/Exrick/x-boot) 开发文档 https://www.kanclou ...
- springboot操作cookie
在响应中添加cookie @RequestMapping(value="/casLogin", method= RequestMethod.GET) public CommonRe ...
- 网络攻防-20169213-刘晶-第六周作业
教材学习内容 网络安全CIA属性:机密性(Confidentiality).完整性(Integ rity).可用性(Availability).其他两个补充属性:真实性(Authentication) ...
- shell学习笔记--自我总结
一.文件 touch file # 创建空白文件 rm -rf 目录名 # 不提示删除非空目录(-r:递归删除 -f强制) dos2unix # windows文本转linux文本 unix2dos ...
- Windows内存保护机制及绕过方法
0 目录 GS编译 SafeSEH机制 SEH覆盖保护 数据执行保护(DEP) 地址随机化(ASLR) 1 GS编译 1.1 基本原理 Windows操作系统为解决栈溢出漏洞的问题引入了一个对策--G ...
- Yii2 认证实现原理和示例
Yii的用户认证分为两个部分,一个是User组件,负责管理用户认证状态的,包括登录,登出,检测当前登录状态等,源文件位于vender/yiisoft/yii2/web/User.php.另一个是实现接 ...
最新文章
- 华为什么时候开始升级鸿蒙,鸿蒙什么时候开放升级?华为又食言了,官方宣布延期到六月...
- ovirt官方安装文档 第八章
- ubuntu中文wiki
- Android(Xamarin)之旅(三)
- 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理
- ivy maven_将Maven与Ivy集成
- python -- join()
- Jfinal 文件上传
- 高速信号传输约翰逊 pdf_智芯文库 | 高速数字电路的设计与仿真
- 【java】监听器的使用
- I00001 杨辉三角
- HCIE Security PKI 备考笔记(幕布)
- opencv python 鼠标响应操作
- wextend matlab,小波学习之三(多孔算法与MATLAB swt剖析)转载
- Java基于SSH技术的毕业设计管理系统
- CASS 10.1.6 安装教程
- Linux shell脚本文件的各种执行方式
- 计算机导论课程思政,《计算机导论》课程教学中的思政教育.doc
- 巴伦变压器的选型和设计
- 企业微信三方开发(三):网页授权登录
热门文章
- 将 iOS 应用的体积控制在 20MB 以内对于其下载量有很明显的影响吗?
- NLB+Cluster(一)
- 使用HTML5、CSS3和jQuery增强网站用户体验
- 关于wpf,datagrid,双向数据绑定用法解决方案
- JS框架_(JQuery.js)纯css3进度条动画
- windows编译libevent时报告“缺少print_winsock_errors.obj”的解决
- 静态 非静态代码块和构造器的执行顺序测试方法
- QM课程02-外部功能
- C#实现ByteBuffer类 .
- 火狐 增强查找工具栏_在“提示”框中:简单的IE至Firefox同步,轻松的Windows工具栏和识别USB电缆...