1. session
session 和cookie的目的相同,都是为了克服http协议无状态的缺陷,但完成的方法不同。session通过cookie,在客户端保存session id,而将用户的其他会话消息保存在服务端的session对象中,与此相对的,cookie需要将所有信息都保存在客户端。因此cookie存在着一定 的安全隐患,例如本地cookie中保存的用户名密码被破译,或cookie被其他网站收集(例如:1. appA主动设置域B cookie,让域B cookie获取;2. XSS,在appA上通过javascript获取document.cookie,并传递给自己的appB)。
2. jwt:
真正讲明白的一篇文章: https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication
The Ins and Outs of Token Based Authentication
0.
JSON Web Tokens (JWT) 用于用户验证
23 Oct 2015
jwt 不仅可用于验证用户还可用于 server 间通信验证
传统验证方式(目前大部分网站使用的方式):
现代网页应用验证用户时面临的困难
-
app server 可能是分布式的, 有很多 server, 在一个 server 上登录了,
其他的没登陆, 需要额外工具来解决这个问题(sticky sessions) -
app 使用 RESTfull api 来获取数据, RESTful api 的原则是 stateless, 但使用 session, 使用 session 和 cookies 会引入 state; 另外, 当 API server 与 app server
可能是两个 server, 需要 允许 CORS(Cross-Origin Resource Sharing), 但是 cookies 只能在同一个 domain 中使用 -
app 可能需要下游服务, 每个 server 都要处理 cookie(???)
解决办法: 使用 JWT 方式来验证用户
JWT 方案不使用 session 基于 token.
用户注册之后, 服务器生成一个 JWT token返回给浏览器, 浏览器向服务器请求
数据时将 JWT token 发给服务器, 服务器用 signature 中定义的方式解码
JWT 获取用户信息.
一个 JWT token包含3部分:
1. header: 告诉我们使用的算法和 token 类型
2. Payload: 必须使用 sub
key 来指定用户 ID, 还可以包括其他信息
比如 email, username 等.
3. Signature: 用来保证 JWT 的真实性. 可以使用不同算法
1. 和Session方式存储id的差异
Session方式存储用户id的最大弊病在于要占用大量服务器内存,对于较大型应用而言可能还要保存许多的状态。一般而言,大型应用还需要借助一些KV数据库和一系列缓存机制来实现Session的存储。
而 JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。除了用户id之外,还可以存储其他的和用户相关的信息,例如该用户是否是管理员、 用户所在的分桶(见[《你所应该知道的A/B测试基础》一文](/2015/08/27/introduction-to-ab-testing/)等。
虽说JWT方式让服务器有一些计算压力(例如加密、编码和解码),但是这些压力相比磁盘I/O而言或许是半斤八两。具体是否采用,需要在不同场景下用数据说话。
2. http://blog.rainy.im/2015/06/10/react-jwt-pretty-good-practice/
区别(仔细揣摩)
##1.
这么基础的问题,居然还是没人说到点子上,最关键的一点是:
* Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端
其它细枝末节的区别,全部是由这一点造成的。
就没人想过为什么token-based的authentication需要一堆secret key来干嘛么?
因为状态信息全部是放在客户端,为了避免被篡改,于是需要用密码学的方法来签名/加密。
可以自己去这里玩玩JWT的Debugger:
http://jwt.io/
一进去你就会注意到两点:
1. Token解码后就包含所有登陆信息
2. Token你随便改一位都会提示无效
##2.
session 和 token 就是个词而已…… 广义来说一切维护用户状态的技术都是session,一切动态生成的服务端有能力鉴别真假而本身无涵义的字符串都是token |
更多的详见:
http://www.slideshare.net/derekperkins/authentication-cookies-vs-jwts-and-why-youre-doing-it-wrong
相关推荐
最通俗的关于Cookie, Session,Token和JWT的相关笔记和理解。在终章笔记中主要介绍一下JWT以及总结Cookie到JWT的区别与发展,包括JWT的定义,特点,重要属性,优缺点,作用和使用场景,Cookie到JWT场景,安全等的...
Cookie、Session、Token、JWT 是常用于身份验证和状态管理的概念和技术。它们在Web应用程序中起到关键的作用。 Cookie:Cookie 是服务器在客户端存储的小型数据文件。它通常用于在客户端存储用户的身份验证信息或...
Cookie、Session、Token、JWT.xmind
JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。 基于session的登录认证 在传统的用户登录认证中,因为http是无状态的,所以都是...
最通俗的关于Cookie, Session,Token和JWT的相关笔记和理解。在上章笔记中主要介绍一下背景和Cookie。包括Cookie的定义,特点,重要属性,优缺点,作用和使用场景,以及如何解决禁用问题,以及Cookie在客户端和...
基于token的身份验证可以替代传统的cookie+session身份验证方法。 JWT由三个部分组成:header.payload.signature 以下示例以JWT官网为例 header部分: { alg: HS256, typ: JWT } 对应base64UrlEncode编码为:...
针对分布式或集群session同步问题,改用jwt的续期解决方案.docx
概述 ...客户端提交用户信息 -> 服务器识别用户 -> 服务端保存用户信息 -> 返回session-id客户端 -> 客户端保存session-id -> 每次请求cookies带上session-id 这种方式也不是不能水平扩展 , 例如 , ses
springboot整和jwt、shiro、redis实现token自动刷新
Springboot整合Spring security+Oauth2+JWT搭建认证服务器,网关,微服务之间权限认证及授权
通过bash/shell生成jwt的脚本
再一次,Cookie、Session、Token、JWT.xmind
签发JWT,验证JWT,解析JWT字符串
springcloud整合oauth2和jwt实现权限认证,整合mybaits
jwt是什么,如何在springboot中整合jwt
正在测试JWT鉴权或者学习JWT的,需要解码token的可以看看。
Spring Boot Security OAuth2 实现支持JWT令牌的服务器源码
jwt-decode, 解码JWT令牌;适用于浏览器应用程序 jwt解码是一个小型浏览器库,可以帮助解码Base64Url编码的JWTs标记。注意:这个库没有验证令牌,任何格式良好的JWT都可以解码。... Owin承载JWT插件等方式验证服务器端
这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 适用场景 1、用于向Web应用传递一些非敏感信息。例如完成加好友、下订单的操作等等。 2、用于设计用户认证和授权系统。 3、实现Web应用的单点...