选择存储更多的是权衡,而不是试图找到明确的最佳选择 . 我们来看几个选项:

选项1 - Web存储(localStorage或sessionStorage)

优点

浏览器不会自动包含从Web存储到HTTP请求的任何内容,使其容易受到CSRF的影响

只能通过在创建数据的完全相同的域中运行的Javascript来访问

允许使用最语义正确的方法在HTTP中传递令牌身份验证凭据(带有 Bearer 方案的 Authorization 标头)

很容易挑选应该包含身份验证的请求

缺点

无法通过在创建数据的子域中运行的Javascript访问_( example.com 无法读取 example.com 所写的值)

⚠️易受XSS攻击

为了执行经过身份验证的请求,您只能使用允许自定义请求的浏览器/库API(在 Authorization 标头中传递令牌)

用法

您可以利用浏览器localStorage或sessionStorage API在执行请求时存储然后检索令牌 .

localStorage.setItem('token', 'asY-x34SfYPk'); // write

console.log(localStorage.getItem('token')); // read

选项2 - 仅HTTP的cookie

优点

这是 not 易受XSS攻击

浏览器会自动在满足cookie规范的任何请求中包含令牌(域,路径和生命周期)

可以在顶级域创建cookie,并将其用于子域执行的请求

缺点

⚠️它容易受到CSRF的影响

您需要注意并始终考虑子域中cookie的可能用途

Cherry挑选应该包含cookie的请求是可行但更麻烦

您可能(仍然)遇到一些问题,浏览器处理cookie的方式差异很小

⚠️如果您不小心,可以实施易受XSS攻击的CSRF缓解策略

服务器端需要验证cookie以进行身份验证,而不是更合适的 Authorization 标头

用法

您无需在客户端执行任何操作,因为浏览器会自动为您处理任何事情 .

选项3 - 服务器端忽略Javascript可访问的cookie

优点

这是 not 易受CSRF攻击( because it's ignored by the server )

可以在顶级域创建cookie,并将其用于子域执行的请求

允许使用最语义正确的方法在HTTP中传递令牌身份验证凭据(带有 Bearer 方案的 Authorization 标头)

樱桃挑选应该包含身份验证的请求有点容易

缺点

⚠️它容易受到XSS的攻击

如果您不小心设置cookie的路径,那么浏览器会在请求中自动包含cookie,这将增加不必要的开销

为了执行经过身份验证的请求,您只能使用允许自定义请求的浏览器/库API(在 Authorization 标头中传递令牌)

用法

您可以利用浏览器document.cookie API在执行请求时存储然后检索令牌 . 此API不像Web存储那样精细(你得到了所有的cookie)所以你需要额外的工作来解析你需要的信息 .

document.cookie = "token=asY-x34SfYPk"; // write

console.log(document.cookie); // read

附加说明

这似乎是一个奇怪的选择,但它确实有一个很好的好处,你可以让存储可用于顶级域和所有子域,这是Web存储不会给你的东西 . 但是,实施起来更复杂 .

结论 - 最终说明

我的 recommendation for most common scenarios would be to go with Option 1 ,主要是因为:

如果您创建Web应用程序,则需要处理XSS;始终,独立于您存储令牌的位置

如果你不想担心的话

另请注意,基于cookie的选项也大不相同,因为选项3 cookie仅用作存储机制,因此它几乎就像是客户端的实现细节 . 但是,备选方案2意味着更传统的处理身份验证的方式;有关此cookie与令牌的进一步阅读,您可能会发现这篇文章很有趣:Cookies vs Tokens: The Definitive Guide .

最后,没有一个选项提到它,但当然必须使用HTTPS,这意味着应该适当地创建cookie以考虑到这一点 .

浏览器中java在什么位置,在基于浏览器的应用程序中保存JWT的位置以及如何使用它...相关推荐

  1. 屏蔽基于对话框的MFC程序中按下ESC关闭窗口的功能

    在基于对话框的MFC程序中,如果你按下ESC,将会关闭对话框.如何屏蔽这个键呢,其实很简单,只要重载下PreTranslateMessage()即可. 方法:在对话框类上右击,选择"Add ...

  2. Win7-其中的文件夹或文件已在另一个程序中打开

    Win7-其中的文件夹或文件已在另一个程序中打开 如何解决Win7系统在删除或移动文件时提示,"操作无法完成,因为其中的文件夹或文件已在另一个程序中打开,请关闭该文件夹或文件,然后重试&qu ...

  3. java集成lucene_将Lucene搜索集成到应用程序中

    java集成lucene 本文是我们名为" Apache Lucene基础知识 "的学院课程的一部分. 在本课程中,您将了解Lucene. 您将了解为什么这样的库很重要,然后了解L ...

  4. java面试题8 牛客:在Web应用程序中,( )负责将HTTP请求转换为HttpServletRequest对象

    在Web应用程序中,(    )负责将HTTP请求转换为HttpServletRequest对象 A Servlet对象 B HTTP服务器 C Web容器 D JSP网页 首先我们来看看web程序的 ...

  5. java beans 组件_如何利用JavaBeans在应用程序中创建组件?

    JavaBeans模块使开发人员能够创建称之为组件的软件单元(也就是我们熟知的beans).你可以把beans加载在更复杂的组件.Java小型应用程序(applets)或应用程序上.JavaBeans ...

  6. java如何使用水晶报表_在Windows应用程序中使用水晶报表的方法

    在Windows应用程序中使用水晶报表的方法 举例说明: (1)创建一个Windows应用程序,选择[解决方案资源管理器] à[添加新项]à[crystal report],输入报表名Reportl. ...

  7. android固定位置拍照,Android调用系统相机拍照并保存到指定位置

    Android调用系统相机拍照并保存到指定位置 @Click(R.id.btn_takePhoto) void onclick() { Intent intent = new Intent(Media ...

  8. Essential Studio for mobile MVC中2种添加移动图表到MVC3 ASPX应用程序中的方法

    在Essential Studio for mobile MVC中有两种方式可以实现添加移动图表到MVC3 ASPX应用程序中.如下: (1)使用生成器 以下的步骤是解释如何使用生成器图表的添加到应用 ...

  9. 哪个是python程序中与缩进有关的正确说法_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()。_学小易找答案...

    [单选题]白内障的主要症状 [多选题]白内障病人手术后护理重点观察是 [单选题]某女,21岁.排球比赛时与队员发生碰撞,后诉鼻梁疼痛来院就诊,检查鼻腔发现鼻中隔有一小血肿.正确处理方法是 [单选题]开 ...

最新文章

  1. C#和nodejs的互操作
  2. @RequestMapping 用法详解之地址映射
  3. windows上的python能否在unix上使用_怎么用python在Windows系统下,生成UNIX格式文件
  4. 每天进步一点点《ML - 线性回归》
  5. Gartner:CIO需破解建立数字化领导力的四大障碍
  6. Hadoop,MapReduce
  7. 已遭利用的微软0day CVE-2020-1464,原来是两年前的老相识
  8. PDE34 Transport equation: derivation general solution
  9. 多数据源切换(拦截器)
  10. 3使用技巧_办公小技巧:3+2 灵活使用WPS集成环境
  11. js-权威指南学习笔记21
  12. MySQL使用SQL语句修改字段长度、字段名称
  13. 6096. 咒语和药水的成功对数
  14. Android使用Activity用作弹出式对话框Dialog
  15. matlab数据处理的优缺点,数字滤波的优缺点分析
  16. DEVC艹如何设置初始的源码
  17. 一起走过的日子.大学本科和同学拍的DV,还有全家福~
  18. Java环境下运行fastqc_在Ubuntu上安装FastQC
  19. TheDAO悲剧重演,SpankChain重入漏洞分析
  20. 相似度计算的三种方式

热门文章

  1. Mysql数据库,表,字符集,主外键等创建的sql模板
  2. 处理字符串_3_处理含引号的字符串
  3. Qt翻译相关类之QDataStream
  4. import caffe失败 No module named caffe
  5. 如何使用网络库实现应用级消息收发
  6. 普及一下equals和==的区别的误区
  7. 《敏捷可执行需求说明 Scrum提炼及实现技术》—— 1.2 识别不确定性的影响
  8. spring 配置多数据源
  9. windows下安装composer抛出Composer\Downloader\TransportException异常解决办法
  10. Windows的Win键被自动按下解决方案