阅读器中存储访问令牌的最佳通常-安保-高效且便捷 (阅读器存储空间不足无法打开)
阅读器提供了各种耐久化数据的处置打算。当存储令牌时,您应该掂量存储选用与安保危险。
译自BestPracticesforStoringAccessTokensintheBrowser。
web运行程序不是静态站点,而是静态内容和灵活内容的精心组合。更经常出现的是,web运行程序逻辑在阅读器中运转。与从主机失掉一切内容不同,运行程序在阅读器中运转Script,从后端API失掉数据,并相应地降级web运行程序出现。
为了包全数据访问,组织应该驳回OAuth2.0。经过OAuth2.0,JavaScript运行程序须要在对API的每个恳求中参与访问令牌。出于可用性要素,JavaScript运行程序通常不会按需恳求访问令牌,而是存储它。疑问是,如何在JavaScript中失掉这样的访问令牌?当您失掉一个令牌时,运行程序应该在哪里存储令牌,以便在须要时将其参与到恳求中?
本文探讨了阅读器中可用的各种存储处置打算,并突出了与每种选用关系的安保危险。在审查要挟之后,它形容了一种处置打算,以提供最佳的阅读器安保选项,用于必定与OAuth包全的API集成的JavaScript运行程序。
失掉访问令牌
在运行程序可以存储访问令牌之前,它须要先失掉一个令牌。以后的最佳通常倡导经过授权码流这一方式来失掉访问令牌:授权码流是一个两步流程,首先从用户那里搜集一个授权容许——授权码,而后运行程序在后盾通道中用授权码替换访问令牌。这个恳求称为令牌恳求,例子如下:
constaccessToken=awtfetch(OAuthServerTokenEndpoint,{method:"POST",//tokenrequestwithauthorizationcodeandPKCE//submits>//StoringtheaccesstokenlocalStorage.setItem("token",accessToken);//LoadingtheaccesstokenletaccessToken=localStorage.getItem("token");
每当运行程序调用API时,它都会从存储中失掉令牌并手动参与到恳求中。但是,由于本地存储可以经过JavaScript访问,这象征着该处置打算也容易遭到跨站脚本(XSS)攻打。
假设您在本地存储中经常使用accesstoken,并且攻打者设法在您的运行程序中运转外部JavaScript代码,那么攻打者可以窃取任何令牌并间接调用API。此外,XSS还准许攻打者操作运行程序中的本地存储数据,这象征着攻打者可以更改令牌。
请留意,本地存储中的数据会终身存储,这象征着存储在其中的任何令牌会驻留在用户的设施(笔记本电脑、电脑、手机或其余设施)的文件系统上,即使阅读器封锁后也可以被其余运行程序访问。因此,在经常使用localStorage时,请思考终端安保性。思考并防止阅读器之外的攻打向量,如恶意软件、被盗设施或磁盘。
依据上述探讨,请遵照以下倡导:
会话存储
会话存储是Web存储API提供的另一种存储机制。与本地存储不同,经常使用sessionStorage对象存储的数据在选项卡或阅读器封锁时会被肃清。此外,session存储中的数据在其余选项卡中无法访问。只要以后选项卡和origin中的JavaScript代码可以经常使用相反的会话存储启动读取和写入。
//StoringtheaccesstokensessionStorage.setItem("token",accessToken);//LoadingtheaccesstokenletaccessToken=sessionStorage.getItem("token");
与本地存储相比,会话存储可以被以为更安保,由于阅读器会在窗口封锁时智能删除任何令牌。此外,由于会话存储不在选项卡之间共享,攻打者无法从另一个选项卡(或窗口)读取令牌,这缩小了XSS攻打的影响。
在通常中,经常使用sessionStorage存储令牌的关键安保疑问是XSS。假设您的运行程序容易遭到XSS攻打,攻打者可以从存储中提取令牌并在API调用中重放它。因此,会话存储不适宜存储敏感数据,如令牌。
IndexedDB是索引数据库API的缩写。它是一个用于在阅读器中异步存储少量数据的API。但是,在存储令牌时,这个阅读器API提供的性能和容量通常不是必需的。由于运行程序在每次API调用中都发送令牌,最好是使令牌的大小最小化。
因此,不要在IndexedDB中存储访问令牌或其余敏感数据。IndexedDB更适宜用于运行程序脱机上班所需的数据,如图像。
内存
存储令牌的一个相当安保的方法是将其保管在内存中。与其余方法相比,令牌不存储在文件系统中,从而减轻了与设施文件系统关系的危险。
最佳通常倡导在内存中存储令牌时将其保管在闭包中。例如,您可以定义一个独自的方法来经常使用令牌调用API。它不会向主运行程序(主线程)泄漏令牌。上方的摘录显示了如何在JavaScript中经常使用内存处置令牌的示例。
functionprotectedCalls(tokenResponse){constaccessToken=tokenResponse.accessToken;return{//callAPIwithaccesstokengetOrders:()=>{constreq=newRequest("https://server.example/orders");req.headers.set("Authorization",accessToken);returnfetch(req)}}}constapiClient=protectedCalls(tokenResponse);//callprotectedAPIapiClient.getOrders();
请留意,攻打者或许无法在失掉令牌后间接访问令牌,因此或许无法间接经常使用令牌调用API。即使如此,经过持有令牌援用的apiClient,他们可以随时经过apiClient调用API。但是,任何此类攻打都限于选项卡关上并且接口提供的性能的时段。
除了与潜在的XSS破绽关系的安保疑问外,在内存中坚持令牌的最大缺陷是页面重载气节牌会失落。而后,运行程序必定失掉一个新令牌,这或许会触发新的用户身份验证。安保的设计招思考到用户体验。
经常使用服务上班者的体系结构经过在独立的线程中运转令牌处感性能来减轻可用性疑问,该线程与主网页分别。服务上班者实践上充任运行程序、阅读器和网络之间的代理。因此,它们可以阻拦恳求和照应,例如缓存数据和启用离线访问,或许失掉和参与令牌。
在经常使用JavaScript闭包或服务上班者处置令牌和API恳求时,XSS攻打或许会针对OAuth流程,如回调流或静默流来失掉令牌。它们可以敞开注册并绕过任何服务上班者,或许经常使用原型污染实时读取令牌经过笼罩诸如window.fetch之类的方法。因此,请出于繁难而不是安保性思考JavaScript闭包和服务上班者。
Cookie是存储在阅读器中的数据片段。由设计,阅读器会将cookie参与到对主机的每个恳求中。因此,运行程序必定审慎经常使用cookie。假设未经细心性能,阅读器或许会在跨站恳求时追加cookie,并准许跨站恳求伪造(CSRF)攻打。
Cookie具备控制其安保属性的属性。例如,SameSite属性可以协助缓解CSRF攻打的危险。当一个cookie的SameSite属性设置为Strict时,阅读器只会将其参与到源自并指标与cookie的源站点相反的恳求中。当恳求嵌入在任何第三方网站中时,阅读器不会参与cookie,例如经过链接。
您可以经过JavaScript设置和检索cookie。但是,当经常使用JavaScript读取cookie时,运行程序会变得容易遭到XSS攻打(除了CSRF之外)。因此,首选的选用是让后端组件设置cookie并将其标志为HttpOnly。该标志可以缓解经过XSS攻打暴露数据的疑问,由于它批示阅读器cookie不能经过JavaScript访问。
为防止cookie经过两边人攻打暴露,这或许造成会话劫持,cookie应仅经过加密衔接(HTTPS)发送。要批示阅读器仅在HTTPS恳求中发送cookie,必定将Secure属性设置为cookie。
Set-Cookie:token=myvalue;SameSite=Strict;Secure;HttpOnly
与阅读器中的任何其余终身存储处置打算一样,cookie或许会驻留在文件系统中,即使阅读器已封锁(例如,cookie不用过时,或许阅读器可以将会话cookie作为复原会话性能的一局部保管)。为了减轻从文件系统中窃取令牌的危险,只能在cookie中存储加密的令牌。因此,后端组件只能在Set-Cookie头中前往加密的令牌。
要挟矩阵
下表总结了阅读器中存储处置打算的要挟评价,关键要挟向量标志为白色。橙色要挟须要除Web技术之外的缓解措施。绿色要挟曾经或可以经过适当的设置成功消弭。
无论攻打者何时设法窃取令牌,只需令牌有效,他们就可以独立于用户和运行程序经常使用访问令牌。假设攻打者设法窃取刷新令牌,他们可以显着延伸攻打时期并参与侵害,由于他们可以续新访问令牌。黑客甚至可以将攻打裁减到除JavaScript运行程序经常使用的API之外的其余API。例如,攻打者可以尝试重放访问令牌并应用不同API中的破绽。
被盗的访问令牌或许会形成重大侵害,XSS依然是Web运行程序的关键疑问。因此,防止在客户端代码可以访问的中央存储访问令牌。相反,将访问令牌存储在cookie中。当经常使用适当的属性性能cookie时,阅读器暴露访问令牌的危险为零。而后,XSS攻打与在同一站点上的会话劫持攻打相当。
经常使用Cookie的OAuth语义
Cookie依然是传输令牌和充任API凭据的最佳选用,由于即使攻打者成功应用XSS破绽,也无法从cookie中检索访问令牌。但是,为了做到这一点,cookie必定适当性能。
首先,将cookie标志为HttpOnly,以便它们无法经过JavaScript访问,以处置XSS攻打的危险。另一个关键属性是Secure标志,它确保cookie仅经过HTTPS发送,以减轻两边人攻打。
其次,颁发持久的只在几分钟内有效的访问令牌。在最坏的状况下,具备最小有效期的访问令牌只能在可以接受的短时期内被滥用。通常以为15分钟的有效期是适宜的。让cookie和令牌的过时时期大抵相反。
第三,将令牌视为敏感数据。只在cookie中存储加密令牌。假设攻打者设法失掉加密令牌,他们将无法从中解析任何数据。攻打者也无法将加密的令牌重放就任何其余API,由于其余API无法解密令牌。加密令牌只是限度了被盗令牌的影响。
第四,在发送API凭据时要限度性强。只向须要API凭据的资源发送cookie。这象征着确保阅读器只在实践须要访问令牌的API调用中参与cookie。为此,cookie须要有适当的设置,比如SameSite=Strict、指向API端点域的域属性和门路。
最后,在经常使用刷新令牌时,请确保将它们存储在自己的cookie中。没有必要在每个API恳求中都发送它们,所以请确保不是这种状况。刷新令牌必定只在刷新过时的访问令牌时参与。这象征着蕴含刷新令牌的cookie与蕴含访问令牌的cookie有稍微不同的设置。
令牌处置程序形式
在JavaScript客户端中为OAuth提供最佳通常准则的设计形式是令牌处置程序形式。它遵照OAuth2.0forBrowser-Baseds中形容的BFF(backendforfrontend)方法。该形式引入了一个后端组件,能够收回带有加密令牌和上述必要属性的cookie。
后端组件的责任是:
令牌处置程序形式定义了一个BFF,它为在阅读器中运转的运行程序形象了OAuth。换句话说,令牌处置程序形式倡导一个JavaScript运行程序可以用来认证用户并安保地调用API的API。为此,该形式经常使用cookie来存储和发送访问令牌。
令牌处置程序是一个后端组件,例如可以驻留在API网关中。它由两局部组成:
OAuth代理失掉令牌后,它会收回带有以下属性的cookie:
由于令牌处置程序是一个后端组件,所以OAuth代理是一个隐秘的客户端,可以向授权主机启出发份验证(与地下的JavaScript客户端相比)。这象征着为了取得令牌,OAuth代理须要启出发份验证。因此,攻打者须要失掉客户端凭据才干成功失掉新令牌。在JavaScript中运转静默流而没有客户端凭据将失败。
为了令牌处置程序形式能够上班,JavaScript运行程序和令牌处置程序组件必定部署在同一站点上(换句话说,它们必定在同一域中运转)。否则,由于cookie上的同站限度,阅读器不会将令牌cookie参与到API恳求中。
要失掉数据,JavaScript运行程序只需经过OAuth代理调用API:
//"https://api.example.com/orders",{//Instructthebrowsertoaddcookiestocross-originrequestscredentials:"include"});
阅读器会智能将cookie参与到恳求中。在上方的示例中,阅读器将cookie蕴含在跨域恳求中。但是,由于cookie属性SameSite=Strict,阅读器只会将cookie参与到同一站点(同一域)的跨域恳求中。
OAuth代了解密cookie并将令牌参与到抢先API。cookie属性确保阅读器仅将cookie参与到HTTPS恳求中,以确保它们在传输环节中是安保的。由于令牌是加密的,它们在劳动时也是安保的。而后令牌用于安保访问API。
总结
经常使用OAuth和访问令牌可以最好地包全API访问。但是,JavaScript运行程序处于不利位置。阅读器中没有安保的令牌存储处置打算。一切可用的处置打算在某种水平上都容易遭到XSS攻打。因此,确保任何运行程序安保的首要义务应该是防止XSS破绽。
令牌处置程序形式经过在JavaScript无法访问的cookie中存储加密令牌来缓解XSS危险。它将Web关注点与API关注点分别,并提供指点,经常使用成熟的Web技术加固JavaScript运行程序,而不会破坏Web架构。检查令牌处置程序形式的具体形容,并探求各种示例。
计算机中使用什么方式验证用户身份合法性?
1、静态密码
用户的密码是由用户自己设定的。在网络登录时输入正确的密码,计算机就认为操作者就是合法用户。实际上,由于许多用户为了防止忘记密码,经常采用诸如生日、电话号码等容易被猜测的字符串作为密码,或者把密码抄在纸上放在一个自认为安全的地方,这样很容易造成密码泄漏。
2、智能卡
内嵌有微芯片的塑料卡(通常是一张信用卡的大小)的通称。一些智能卡包含一个微电子芯片,智能卡需要通过读写器进行数据交互。智能卡配备有CPU、RAM和I/O,可自行处理数量较多的数据而不会干扰到主机CPU的工作。
基于USB Key的身份认证方式是近几年发展起来的一种方便、安全的身份认证技术。它采用软硬件相结合、一次一密的强双因子认证模式,很好地解决了安全性与易用性之间的矛盾。
4、短信密码
短信动态密码也称短信密码,是以手机短信形式发送的6位随机数的动态密码,也是一种手机动态口令形式,身份认证系统以短信形式发送随机的6至8位密码到客户的手机上,客户在登录或者交易认证时候输入此动态密码,从而确保系统身份认证的安全性 。
5、动态口令
动态口令牌是客户手持用来生成动态密码的终端,主流的是基于时间同步方式的,每60秒变换一次动态口令,口令一次有效,它产生6位动态数字进行一次一密的方式认证。
计算机中使用什么方式验证用户身份合法性?
1、静态密码
用户的密码是由用户自己设定的。在网络登录时输入正确的密码,计算机就认为操作者就是合法用户。实际上,由于许多用户为了防止忘记密码,经常采用诸如生日、电话号码等容易被猜测的字符串作为密码,或者把密码抄在纸上放在一个自认为安全的地方,这样很容易造成密码泄漏。
2、智能卡
内嵌有微芯片的塑料卡(通常是一张信用卡的大小)的通称。一些智能卡包含一个微电子芯片,智能卡需要通过读写器进行数据交互。智能卡配备有CPU、RAM和I/O,可自行处理数量较多的数据而不会干扰到主机CPU的工作。
基于USB Key的身份认证方式是近几年发展起来的一种方便、安全的身份认证技术。它采用软硬件相结合、一次一密的强双因子认证模式,很好地解决了安全性与易用性之间的矛盾。
4、短信密码
短信动态密码也称短信密码,是以手机短信形式发送的6位随机数的动态密码,也是一种手机动态口令形式,身份认证系统以短信形式发送随机的6至8位密码到客户的手机上,客户在登录或者交易认证时候输入此动态密码,从而确保系统身份认证的安全性 。
5、动态口令
动态口令牌是客户手持用来生成动态密码的终端,主流的是基于时间同步方式的,每60秒变换一次动态口令,口令一次有效,它产生6位动态数字进行一次一密的方式认证。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。