您现在的位置是:首页 > 学无止境 > 其他网站首页其他 API安全之OAuth2和JWT的区别
API安全之OAuth2和JWT的区别
- 其他
- 2019-06-12
简介本文主要用于讲解两种常见的保证API安全性的方法:OAuth2和JSON Web Token(JWT)。字数
1185.5
JWT和OAuth2
JWT和OAuth2 是两种完全不同的东西,这两个东西没有可比性。
JWT
JWT是一种用于发布接入令牌(Access Token),并对发布的签名接入令牌进行验证的方法。令牌(Token)本身包含了一系列的声明,应用程序可以根据这些声明限制用户对资源的访问。
JWT的标准定义
JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。基本实现就是用户提供用户凭证给认证服务器,由认证服务器验证提交凭证的合法性;如果认证成功,那么就会产生一个Token,用户可以使用这个token访问服务器上受限制的资源。
JWT的结构组成
JWT由三部分组成,他们之间使用圆点(.)进行连接,这三部分是:
- Header
- Payload
- Signature
因此一个典型的JWT的结构是这样的:
xxxxxxxxxx.yyyyyyyyyyyyyyyyy.zzzzzzzzzzzzzz
接下来具体的看每一部分的组成:
Header:
header典型由两部分组成:token的类型(“JWT”)和算法名称(如:SHA256或者RSA等)
比如:
{
"alg": "HS256",
"typ": "JWT"
}
然后使用Base64对这个部分编码就得到了JWT的第一部分。
Payload:
JWT的第二部分是Payload,它包含声明(要求)。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型:registered、public、private。
- Registered Claims:这是一组预定义的声明,不是强制的,但是推荐。比如:exp(expirationtime)、sub(subject)、aud(audience)等
- Public Claims:可随意定制。
- Private Claims:用户在同一他们的各方之间共享信息。
比如:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
对Payload使用Base64进行编码后就得到JWT的第二部分。
Signature:
为了得到签名部分,必须要具备:已经编码过的header、已经编码过的payload、一个秘钥,然后对他们进行签名即可。下图是来自官网的截图:
JWT是如何工作的
在认证的时候,当用户用他们的凭证成功登陆的时候,一个JSON%20Web%20Token将被返回。此后,token就是用户凭证了。在用户先要访问受保护的资源的时候,浏览器都应该带上JWT。典型的是放在Authorization%20Header中。
服务器会检查Authorization%20是否有效。如果有效就可以访问被保护的资源。如果token是在授权头中发送的,那么跨域的问题就不会存在了,因为它们不使用Cookie。
下面这张图表示了如何获取JWT以及如何使用它们来访问API。
- 应用(或客户端)向授权服务器请求授权;
- 当授权成功,授权服务器返回一个access token 给应用;
- 应用使用access token访问受保护的资源(API)
和传统方法的区别
基于服务器的身份认证:
由于HTTP协议是无状态的,为了保证服务器认识当前用户,一般是将认证过的用户信息保存在服务器上,用户请求的时候带上SessionID,然后服务器根据此确认用户身份。
这样的认证方式存在以下的问题:
- Sessions:每次用户认证通过后,在服务器的内存中都会新建一条记录保存信息,随着用户越来越多,服务器的压力也就越来越大。
- Scalability :因为SessionID是存在内存中的,在扩展性方面会受到影响。尽管现在大多将SessionId存在数据库中,比如当前的博客系统。
- CORS(跨域资源共享):存在资源跨域的问题。
- CSRF:容易受到CSRF攻击。
JWT和Session的差异:
相同点都是用于存储用户信息,区别在于Session在服务端,JWT是在客户端。Session最大的问题是用户信息需要占用服务器资源,增加服务器压力。而JWT明显的将用户信息保存在客户端,减轻了服务端的内存压力。Session的窗台是存储在服务端,客户端只有sessionId,而Token的状态是保存在客户端的。
是如何工作的
基于Token的身份认证是无状态的,服务器或者Session中不会存储用户的信息,基本的实现主要流程如下:
1、用户携带用户名和密码等凭证请求访问;
2、服务器校验用户凭证;
3、服务器生成一个JWT,返回给用户;
4、客户端存储Token,每一次请求都需要携带它;
5、服务器校验Token并返回数据。
注意:
- 每次请求都应该携带Token;
- Token应该放在header中;
- 需要将服务器设置未接收来自所有域的请求,用Access-Control-Allow-Origin:*
使用Token的好处
无状态性和可扩展性:Token存储在客户端,完全无状态、可扩展。
安全:Token不是Cookie,每次请求的时候Token都会被发送,由于没有Cookie被发送,还可以防止CSRF攻击。
Token在一段时间后会过期,这个时候用户需要再次登录,这样有助于保持安全。
OAuth2
OAuth2是一种授权框架,提供了一套详细的授权机制。用户或应用可以通过公开或者私有的设置,授权第三方访问特定的资源。
很多情况下,会将JSON Web Token一种认证机制和OAuth2一起使用。
转载:
感谢您对莫愁个人博客网站平台的认可,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源莫愁个人博客 https://www.mochoublog.com/study/254.html”。
- 其他
- 2019-06-12
JWT和OAuth2
JWT和OAuth2 是两种完全不同的东西,这两个东西没有可比性。
JWT
JWT是一种用于发布接入令牌(Access Token),并对发布的签名接入令牌进行验证的方法。令牌(Token)本身包含了一系列的声明,应用程序可以根据这些声明限制用户对资源的访问。
JWT的标准定义
JWT的结构组成
JWT由三部分组成,他们之间使用圆点(.)进行连接,这三部分是:
- Header
- Payload
- Signature
因此一个典型的JWT的结构是这样的:
xxxxxxxxxx.yyyyyyyyyyyyyyyyy.zzzzzzzzzzzzzz
接下来具体的看每一部分的组成:
Header:
header典型由两部分组成:token的类型(“JWT”)和算法名称(如:SHA256或者RSA等)
比如:
{
"alg": "HS256",
"typ": "JWT"
}
然后使用Base64对这个部分编码就得到了JWT的第一部分。
Payload:
JWT的第二部分是Payload,它包含声明(要求)。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型:registered、public、private。
- Registered Claims:这是一组预定义的声明,不是强制的,但是推荐。比如:exp(expirationtime)、sub(subject)、aud(audience)等
- Public Claims:可随意定制。
- Private Claims:用户在同一他们的各方之间共享信息。
比如:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
对Payload使用Base64进行编码后就得到JWT的第二部分。
Signature:
为了得到签名部分,必须要具备:已经编码过的header、已经编码过的payload、一个秘钥,然后对他们进行签名即可。下图是来自官网的截图:
JWT是如何工作的
在认证的时候,当用户用他们的凭证成功登陆的时候,一个JSON%20Web%20Token将被返回。此后,token就是用户凭证了。在用户先要访问受保护的资源的时候,浏览器都应该带上JWT。典型的是放在Authorization%20Header中。
服务器会检查Authorization%20是否有效。如果有效就可以访问被保护的资源。如果token是在授权头中发送的,那么跨域的问题就不会存在了,因为它们不使用Cookie。
下面这张图表示了如何获取JWT以及如何使用它们来访问API。
- 应用(或客户端)向授权服务器请求授权;
- 当授权成功,授权服务器返回一个access token 给应用;
- 应用使用access token访问受保护的资源(API)
和传统方法的区别
基于服务器的身份认证:
由于HTTP协议是无状态的,为了保证服务器认识当前用户,一般是将认证过的用户信息保存在服务器上,用户请求的时候带上SessionID,然后服务器根据此确认用户身份。
这样的认证方式存在以下的问题:
- Sessions:每次用户认证通过后,在服务器的内存中都会新建一条记录保存信息,随着用户越来越多,服务器的压力也就越来越大。
- Scalability :因为SessionID是存在内存中的,在扩展性方面会受到影响。尽管现在大多将SessionId存在数据库中,比如当前的博客系统。
- CORS(跨域资源共享):存在资源跨域的问题。
- CSRF:容易受到CSRF攻击。
JWT和Session的差异:
相同点都是用于存储用户信息,区别在于Session在服务端,JWT是在客户端。Session最大的问题是用户信息需要占用服务器资源,增加服务器压力。而JWT明显的将用户信息保存在客户端,减轻了服务端的内存压力。Session的窗台是存储在服务端,客户端只有sessionId,而Token的状态是保存在客户端的。
是如何工作的
基于Token的身份认证是无状态的,服务器或者Session中不会存储用户的信息,基本的实现主要流程如下:
1、用户携带用户名和密码等凭证请求访问;
2、服务器校验用户凭证;
3、服务器生成一个JWT,返回给用户;
4、客户端存储Token,每一次请求都需要携带它;
5、服务器校验Token并返回数据。
注意:
- 每次请求都应该携带Token;
- Token应该放在header中;
- 需要将服务器设置未接收来自所有域的请求,用Access-Control-Allow-Origin:*
使用Token的好处
无状态性和可扩展性:Token存储在客户端,完全无状态、可扩展。
安全:Token不是Cookie,每次请求的时候Token都会被发送,由于没有Cookie被发送,还可以防止CSRF攻击。
Token在一段时间后会过期,这个时候用户需要再次登录,这样有助于保持安全。
OAuth2
OAuth2是一种授权框架,提供了一套详细的授权机制。用户或应用可以通过公开或者私有的设置,授权第三方访问特定的资源。
很多情况下,会将JSON Web Token一种认证机制和OAuth2一起使用。
转载: 感谢您对莫愁个人博客网站平台的认可,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源莫愁个人博客 https://www.mochoublog.com/study/254.html”。