在使用JWT时关于将token信息保存在哪里

1、先来讲述一下token保存在浏览器端的几种不同的方式

(1)可以选择在cookie中进行保存,在服务端的代码为

String token = Jwt.createToken(payload);
             Cookie cookie = new Cookie("token", token);
             cookie.setMaxAge(3600);
             cookie.setDomain("localhost");
             cookie.setPath("/");
             response.addCookie(cookie);

这里有一个问题就是关于 setDomain的问题,一般正常的在将用户的信息封装在token中后,

可以通过 new cookie的形式将 token先保存在 cookie中,

也就是将 cookie存在了浏览器中,

具体可以在服务端用 System.out.println(response.getHeader("set-cookie"));的形式找到刚才设置的cookie,因为是第一次登录,所以使用 set-cookie 的形式,

浏览器中也可以进行查看,具体是如图,可以看到是 request第一次请求时是没有 cookie的,但 response中返回后就能看到你所设置的 cookie,被放在set-cookie中

其中也包括我所设置的 token键值对,就是之前的 new cookie 所产生的

将 cookie 存放在了浏览器中

那么接下来谈谈用户请求时如何获取设置在浏览器中的 cookie,这里使用的是ajax请求

接下来就是浏览器的事情了,浏览器会对你的请求进行解析,document 根节点能解析到保存在浏览器中的 cookie的信息,并能获取到这个 header 中的 token 信息,然后将其发送到服务端进行请求,可以看到

通过 dom解析后会在你的请求中带上你所需要的 token,同时你也依然可以看到 cookie 中始终保存着token的key,value字段,没错, token中的信息就是从 cookie中取出来的,其实也就是 客户端发出getCookie("token")请求后浏览器进行解析后将保存在本地的 cookie信息中的token放入了相应的键值对中作为请求去请求服务端

这是服务端获取 token的情况,在服务端设置了一个过滤器来对 token进行过滤,通过request.getHeader("token")就能将经过浏览器转化后的 token信息拿到手,然后对其进行一系列的验证,这就要看 token中存放了什么信息了

这里为什么要设置Domain?

1、设置 cookie 时明确指定 domain 域名,子域名可读取(子域共享该cookie),删除时则也必须明确指定域名,否则无法删除。

2、设置 cookie 时不指定域名,使用默认值,则表示只有当前域名可见(子域不可共享)。删除时也不需要指定域名,否则无法删除。
         转载自:http://blog.csdn.net/wab719591157/article/details/74841605

如果不设置setDomain的信息的话,就会导致能成功登录,但 Cookies中没有任何的信息记录 ,也就是说不会将cookie保存在本地,虽然有set-cookie

当用户请求该域名下的子域名时,会看到 Request中的 token为空,

其实也就是说当用户登录时,确实有cookie的产生,也有token的产生,但浏览器并没有将其保存在本地,也就是cookies中,当用户再次发出请求想要获取数据时,

浏览器对用户请求进行解析,并没有找到本地的 token,于是将其发送到服务端时才显示 token为空,也就无法进行接下来的操作了

(2)localstorage,没有时间限制的存储,会一直存放在浏览器中

设置也是相同的道理,只要将方法换为setItem就行,那么这个localStorage是什么呢,其实就是

Window.prototype.localStorage = 0;

这是HTML5.js中的一个方法,用来获取浏览器存放本地api

LocalStorage可以被 javascript 访问,所以容易受到XSS攻击。尤其是项目中用到很多第三方的Javascript类库。

另外,需要应用程序来保证Token只在HTTPS下传输。

cookie 优点:

可以指定 httponly,来防止被Javascript读取,也可以指定secure,来保证token只在HTTPS下传输。

缺点:

不符合Restful 最佳实践。

容易遭受CSRF攻击 (可以在服务器端检查 Refer 和 Origin)

相比较而言,Web Storage比Cookie更容易受到攻击

转载自:http://blog.itpub.net/10742815/viewspace-2142725/

所以这里选择了cookie进行token信息的存储

(3)sessionStorage

针对一个session的用户存储,也可以被javascript访问,但当用户关闭浏览器时,也会随之消失

时间: 2024-10-08 19:24:28

在使用JWT时关于将token信息保存在哪里的相关文章

JWT(JSON Web Token) 多网站的单点登录,放弃session

多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token)的方式. 参考链接: http://www.tuicool.com/articles/IRJnaa https://coderwall.com/p/8wrxfw/goodbye-php-sessions-hello-json-web-tokens 一.概念和定义 1.什么是jwt? Json web

什么是JWT(JSON WEB TOKEN)

什么是JWT Json web token(JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景.JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密. 起源 说起JWT,我们应该来谈一谈基于token的认证和传统的Session认证的区别

理解JWT(JSON Web Token)认证

最近想做个小程序,需要用到授权认证流程.以前项目都是用的 OAuth2 认证,但是Sanic 使用OAuth2 不太方便,就想试一下 JWT 的认证方式.这一篇主要内容是 JWT 的认证原理,以及python 使用 jwt 认识的实践. 几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth 在HTTP中,基本认证是一种用来允许Web浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式,通常用户名和明码会通过HTTP头传递. 在发送之前是以用

JWT(JSON Web Token)

摘要: 在Web应用中,使用JWT替代session并不是个好主意 适合JWT的使用场景 抱歉,当了回标题党.我并不否认JWT的价值,只是它经常被误用. 什么是JWT 根据维基百科的定义,JSON WEB Token(JWT,读作 [/d??t/]),是一种基于JSON的.用于在网络上声明某种主张的令牌(token).JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature). 头信息指定了该JWT使用的签名算法: header = '{"alg&q

JWT【JSON Web Token】 简述

draft: http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html http://tools.ietf.org/html/draft-jones-json-web-token-10 JWT 是JSON Web Token,用于发送可通过数字签名和认证的东西,它包含一个紧凑的,URL安全的JSON对象,服务端可通过解析该值来验证是否有操作权限,是否过期等安全性检查.由于其紧凑的特点,可放在url中或者 HTTP Auth

表单提交时如何将错误信息传递到页面中,并且保存原来提交数据

曾经何时,你还有我或许都在困惑,如何方便的将验证不通过的表单信息再返回到前台页面,例如我注册一个账号,辛辛苦苦填写了N多项,一个格式验证没有通过,一切都需要充填,虽然Ajax可以解决这个问题,但是我们总不能把所有表单提交都弄成ajax,更何况有若干人就是没事把javascript给禁止了.哎哎,好了解决方案来了,下面以用户登录为例,说说我的解决方案. 服务器端用nodejs实现: login.html 简单的提交表单 <form action="" id="loginF

VS开发ArcEngine时的一个异常信息——“ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS components.”

问题描述:程序报错"ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS components." 解决方法:打开program.cs. 把ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop); 放到Application.SetCompatibleTextRender

SharePoint 创建SSP时出现异常,信息如 设置失败: 找不到 Windows NT 用户或组 &#39;【

1.安装完sharepoint后,使用"sharepoint产品和技术配置向导"配置时,中间有连接sql server时输入的用户名和信息,(如果域是test.com)切记只能输入test/administrator的用户名格式.   2.如果还有这样的问题,可以打上sharepoint的补丁包,参考网址:    http://support.microsoft.com/kb/953471 SharePoint 创建SSP时出现异常,信息如 设置失败: 找不到 Windows NT 用

php测试时不出现错误信息

来源:http://blog.sina.com.cn/s/blog_6c9d65a101013vdj.html 在练习程序时,有时候写错了,在浏览器会打印出出错信息. 可我的程序始终没有出现. 我的环境: 平台软件:apache2+php5+mysql  for linux 浏览器:chromium-browse, IE 几天来测试的时候,如果是谷歌的就显示“服务器错误”,而没有多余的信息.用IE(在阿Q老师的指导下,把IE浏览器本身也设置了)还是显示空白. 这样调试的时候很麻烦,就得一行一行找