在会话中使用JWT

在黑客新闻,reddit和博客上,该主题已经讨论了很多次。 共识是–请勿使用JWT(用于用户会话)。

而且我在很大程度上同意对JWT的典型论点 , 典型的“但我可以使其工作……”的解释以及JWT标准的缺陷的批评 。 。

我不会在这里重复所有内容,因此请阅读这些文章。 您真的可以使用JWT付诸实践,了解它很复杂,并且对于大多数用例来说几乎没有好处。 我猜对于API调用是有意义的,特别是如果您在单页应用程序中为RESTful客户端重用相同的API,那么我将重点讨论用户会话用例。

受到所有这些批评之后,我违背了以上文章的建议,使用了JWT,浏览了他们的论点并声称我处于最佳状态。 我很可能是错的。

我将用户ID存储在作为cookie存储的JWT令牌中。 不是本地存储,因为这是有问题的。 不是整个状态,因为我不需要那可能导致问题(在链接的文章中指出)。

我想避免在设置中跨节点共享会话。 这是不使用Web服务器/框架的会话机制的非常令人信服的原因。 不,您不需要拥有数百万个用户即可要求您的应用程序在多个节点上运行。 实际上,它应该几乎总是在(至少)两个节点上运行,因为节点会死掉并且您不希望停机。 负载平衡器上的粘性会话是解决该问题的一种方法,但是您只是将集中式会话存储外包给了负载平衡器(有些负载平衡器可能不支持它)。 共享的会话缓存(例如memcached,elasticache,hazelcast)也是一种选择,许多Web服务器(至少在Java中)支持可插入的会话复制机制,但是这为体系结构引入了另一个组件,要支持的堆栈的另一部分以及可能会破裂。 它不一定很坏,但是如果有一种简单的方法可以避免它,那我就去做。

为了避免共享会话存储,您需要在请求/响应周期中传递整个会话状态(作为cookie,请求参数,标头),或者需要接收userId并从数据库或缓存中加载用户。 据我们了解,前者可能是一个错误的选择。 尽管有诸如ASP.NET和JSF之类的框架将整个状态转储到页面HTML中的事实,但这听起来并不好。

至于后者–您可能会说:“好吧,如果您打算在每个请求中从数据库中加载用户,这将会很慢,并且如果您使用缓存,那么为什么不对会话本身使用缓存呢?” 。 好吧,缓存可以是本地的。 记住,我们只有几个应用程序节点。 每个节点可以为当前活动的用户提供一个本地内存缓存。 所有节点都将加载相同的用户(在负载均衡器以循环方式将一些请求路由到它们之后)的事实并不重要,因为该缓存很小。 但是您不必在节点之间复制它,也不必照顾从群集来来回去的新节点,处理节点之间的网络问题,等等。每个应用程序节点都是孤岛应用程序节点。

因此,这里是我对链接文章的第一个反对意见–仅将用户标识符存储在JWT令牌中并不是没有意义的,因为它可以使您免于会话复制。

对JWT标准及其加密的安全性的批评又如何呢? 完全正确,很容易用脚射击。 这就是为什么我仅将JWT与MAC一起使用,并且仅将其与接收令牌时经过验证的特定算法一起使用,从而(有选择地)避免了所有陷阱。 公平地说,我愿意使用其中一篇文章中提出的替代方案PASETO ,但是它没有Java库,实现它需要花费一些时间(将来可能会这样做)。 总结一下–如果存在另一种易于使用的经过身份验证的cookie加密方法,我会使用它。

因此,我基本上是在“ PASETO模式”下使用JWT,它只有一种操作和一种算法。 作为一般方法,这应该很好-本文没有批评在令牌(和无状态应用程序节点)中包含用户标识符的想法,而是批评了标准的复杂性和脆弱性。 这是我的第二个反对意见–“不使用JWT”被广泛理解为“不使用令牌”,而事实并非如此。

我在为简化体系结构和缺乏共享状态而努力时是否引入了一些漏洞? 我希望不是。

翻译自: https://www.javacodegeeks.com/2018/03/using-jwt-sessions.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java案例源代码_求java案例源代码 越多越好!

展开全部import java.awt.*;import java.awt.event.*;import java.lang.*;import javax.swing.*;public class Counter extends Frame{//声明三个面板的布局GridLayout gl1,gl2,gl3;Panel p0,p1,p2,p3;JTextField tf1;TextField tf2;Button b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,…

安卓4.4玩java_Android4.4运行过程中闪退java.lang.NoClassDefFoundError

上周五项目测试时发现一个奇怪的Bug,项目中依赖了一个第三方框架,但是在android4.0-4.4.4之间的系统中运行会直接闪退,抛出错误异常为java.lang.NoClassDefFoundError。第一次遇到这样的问题,google了好久找到了以下几个原因&…

java method方法_Java Method.getTypeParameters方法代碼示例

import java.lang.reflect.Method; //導入方法依賴的package包/類private void validateRuleMethod(MethodRuleDefinition, ?> ruleDefinition, Method ruleMethod, RuleSourceValidationProblemCollector problems) {if (Modifier.isPrivate(ruleMethod.getModifiers())) …

update se_Java SE 7 Update 25 –发行说明进行了解释。

update se昨天是CPU日。 Oracle通过6月的Java重要补丁更新发布了Java SE更新25 。 在4月的最后一次重大更新之后,这是最后一次与Oracle其他所有Oracle产品都不适合的Oracle重要补丁更新计划。 从2013年10月开始 ,Java安全修补程序将遵循四个年度安全发布…

java scavenge_请概述一下Java中都有哪些垃圾收集器

1、Serial(串行GC)收集器Serial收集器是一个新生代收集器,单线程执行,使用复制算法。它在进行垃圾收集时,必须暂停其他所有的工作线程(用户线程)。是Jvmclient模式下默认的新生代收集器。对于限定单个CPU的环境来说,Serial收集器由…

Java中的异步等待

编写异步代码很困难。 试图了解异步代码应该做什么的难度更大。 承诺是尝试描述延迟执行流程的一种常见方式:首先做一件事,然后再做另一件事,以防万一出错再做其他事情。 在许多语言中,承诺已成为协调异步行为的事实上的方法。 J…

java web ssh启动运行程序_[javaweb开发SSH] myeclipse启动tomcat时的bug

以前用的是myeclipse10.0的版本,我也不知道以前设置了什么,比较正常.由于以前的myeclipse无法装svn,所以装了一个10.7当连接数据库正常时,自然是好的一旦连接数据库不正常了(我故意将数...以前用的是myeclipse10.0的版本, 我也不知道以前设置了什么,比较正常.由于以前的myeclip…

java简单文本编译器_java -简易文本编辑器

import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;/*** Title:java -简易文本编辑器 ** Description: 08.5.5 简易功能* 1。 打开文件时,无法选择文件,需手动输入* 2. 文件大小超出 多行文本域时,未实现滚动…

阿帕奇光束

Apache Beam是一个开放源代码统一模型,用于定义批处理和流数据并行处理管道。 使用一种开源的Beam SDK,您可以构建一个定义管道的程序。 然后,该管道由Beam支持的分布式处理后端之一执行,这些后端包括Apache Apex , Ap…

java音乐登陆界面_第四篇——Spring音乐登录界面设计及实现(C#)

Spring音乐播放器,我们小组设计其启动时有一个登录界面,用户初次可以注册,输入用户名和密码,点击注册即将输入信息保存到register文本文件中;如果已有用户名,输入用户名和密码,点击登录&#xf…

java中线性结构的例子_java数据结构--线性结构

一、数据结构数据结构由数据和结构两部分组成,就是将数据按照一定的结构组合起来,这样不同的组合方式有不同的效率,可根据需求选择不同的结构应用在相应在场景。数据结构大致分为两类:线性结构(如数组,链表&#xff0c…

过滤序列,惰性序列_Java 8的惰性序列实现

过滤序列,惰性序列我刚刚在GitHub上发布了LazySeq库-这是我最近进行的Java 8实验的结果。 我希望你会喜欢它。 即使您觉得它不是很有用,它仍然是Java 8(以及一般而言)中的函数式编程的一课。 而且它可能是第一个针对Java 8的社区库&#xff0…

Spring Boot和JSP

本指南展示了如何使用Spring Boot通过JSP创建MVC Web应用程序。 先决条件: Eclipse IDE(最新版本) Maven的4 Java 1.8 1.创建Maven Web项目 打开eclipse,然后创建一个新的Maven Web项目,并将其命名为SpringBootWe…

java相关技术简介_java技术简介?

java技术简介?关注:186 答案:3 信息版本:手机版 电脑版解决时间 2021-01-17 11:41提问者坟地里唱嗨歌2021-01-17 01:04java技术简介?最佳答案二级知识专家哭嗻説侢見2021-01-17 01:13第一页:什么是Java?Java好象随处…

java布尔多少字节,在Java中将字节转换为长度为4的布尔数组

I need to convert a byte into an array of 4 booleans in Java. How might I go about this?解决方案Per Michael Petrottas comment to your question, you need to decide which bits in the 8-bit byte should be tested for the resulting boolean array. For demonstra…

判断用户名和密码是否正确java_facebook中如何判断用户名和密码是否正确

Do you hear the angel?Do you think that this really has the angel in the world?We knew from the story in the book, the angel contain the wing of the beauty, beautiful face , the mind of the docile, generous breadth of view, they would like to sacrifice t…

moxy json介绍_MOXy的@XmlVariableNode – JSON模式示例

moxy json介绍我们正在向EclipseLink MOXy添加从域模型生成JSON模式的 功能 。 为此,我们创建了一个新的变量节点映射。 在本文中,我将通过将Java模型映射到JSON模式来演示新的映射。 您可以使用每晚构建的EclipseLink 2.6.0进行尝试: http…

java 切换后台程序_将 Android 程序切换到后台及从后台切换到前台实现

将 Android 程序切换到后台及从后台切换到前台实现有时候, 我们需要将自己的 Android 程序切换到后台运行, 在必要时, 将其切换到前台运行下面提供了一种实现方式, 首先需要引用三个单元:uses Androidapi.JNI.App,Androidapi.JNI.GraphicsContentViewText,Androidapi.Helpers;将…

使用Spock测试您的代码

Spock是针对Java和Groovy应用程序的测试和规范框架。 Spock是: 极富表现力 促进测试的给定/何时/然后语法 与大多数IDE和CI服务器兼容。 听起来不错? 通过快速访问Spock Web控制台,您可以非常快速地开始使用Spock。 当您有一个喜欢的小测…

i18n php_PHP国际化多语言的实现(非I18N)

PHP开发网站、系统会遇到需要支持多种语言的情况,这时候我们就需要国际化。一般都是推荐使用I18N,而使用I18N我们需要下载相应软件编辑PO文件,然后还要PHP的gettext扩展,有点小烦。下面介绍一种除了I18N以外,最常用的P…