您现在的位置是:首页 > 学无止境 > 其他网站首页其他 API安全之OAuth2和JWT的区别

API安全之OAuth2和JWT的区别

  • 莫愁
  • 其他
  • 2019-06-12
简介本文主要用于讲解两种常见的保证API安全性的方法:OAuth2和JSON Web Token(JWT)。
字数 2539.5

JWT和OAuth2

JWT和OAuth2 是两种完全不同的东西,这两个东西没有可比性。

JWT

JWT是一种用于发布接入令牌(Access Token),并对发布的签名接入令牌进行验证的方法。令牌(Token)本身包含了一系列的声明,应用程序可以根据这些声明限制用户对资源的访问。

JWT的标准定义

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。基本实现就是用户提供用户凭证给认证服务器,由认证服务器验证提交凭证的合法性;如果认证成功,那么就会产生一个Token,用户可以使用这个token访问服务器上受限制的资源。

 

JWT的结构组成

JWT由三部分组成,他们之间使用圆点(.)进行连接,这三部分是:

  1. Header
  2. Payload
  3. Signature

因此一个典型的JWT的结构是这样的:

xxxxxxxxxx.yyyyyyyyyyyyyyyyy.zzzzzzzzzzzzzz

接下来具体的看每一部分的组成:

Header:

header典型由两部分组成:token的类型(“JWT”)和算法名称(如:SHA256或者RSA等)

比如:

 

{
  "alg": "HS256",
  "typ": "JWT"
}

然后使用Base64对这个部分编码就得到了JWT的第一部分。

 

Payload:

JWT的第二部分是Payload,它包含声明(要求)。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型:registered、public、private。

  1. Registered Claims:这是一组预定义的声明,不是强制的,但是推荐。比如:exp(expirationtime)、sub(subject)、aud(audience)等
  2. Public Claims:可随意定制。
  3. Private Claims:用户在同一他们的各方之间共享信息。

比如:

 

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

对Payload使用Base64进行编码后就得到JWT的第二部分。

 

Signature:

为了得到签名部分,必须要具备:已经编码过的header、已经编码过的payload、一个秘钥,然后对他们进行签名即可。下图是来自官网的截图:

API安全之OAuth2和JWT

 

JWT是如何工作的

在认证的时候,当用户用他们的凭证成功登陆的时候,一个JSON%20Web%20Token将被返回。此后,token就是用户凭证了。在用户先要访问受保护的资源的时候,浏览器都应该带上JWT。典型的是放在Authorization%20Header中。

服务器会检查Authorization%20是否有效。如果有效就可以访问被保护的资源。如果token是在授权头中发送的,那么跨域的问题就不会存在了,因为它们不使用Cookie。

下面这张图表示了如何获取JWT以及如何使用它们来访问API。

client-credentials-grant

  1. 应用(或客户端)向授权服务器请求授权;
  2. 当授权成功,授权服务器返回一个access token 给应用;
  3. 应用使用access token访问受保护的资源(API)

和传统方法的区别

基于服务器的身份认证:

由于HTTP协议是无状态的,为了保证服务器认识当前用户,一般是将认证过的用户信息保存在服务器上,用户请求的时候带上SessionID,然后服务器根据此确认用户身份。

这样的认证方式存在以下的问题:

  1. Sessions:每次用户认证通过后,在服务器的内存中都会新建一条记录保存信息,随着用户越来越多,服务器的压力也就越来越大。
  2. Scalability :因为SessionID是存在内存中的,在扩展性方面会受到影响。尽管现在大多将SessionId存在数据库中,比如当前的博客系统。
  3. CORS(跨域资源共享):存在资源跨域的问题。
  4. CSRF:容易受到CSRF攻击。

JWT和Session的差异:

相同点都是用于存储用户信息,区别在于Session在服务端,JWT是在客户端。Session最大的问题是用户信息需要占用服务器资源,增加服务器压力。而JWT明显的将用户信息保存在客户端,减轻了服务端的内存压力。Session的窗台是存储在服务端,客户端只有sessionId,而Token的状态是保存在客户端的。

是如何工作的

基于Token的身份认证是无状态的,服务器或者Session中不会存储用户的信息,基本的实现主要流程如下:

1、用户携带用户名和密码等凭证请求访问;

2、服务器校验用户凭证;

3、服务器生成一个JWT,返回给用户;

4、客户端存储Token,每一次请求都需要携带它;

5、服务器校验Token并返回数据。

注意:

  1. 每次请求都应该携带Token;
  2. Token应该放在header中;
  3. 需要将服务器设置未接收来自所有域的请求,用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”。

文章评论

    • 评论
    人参与,条评论

技术在线

服务时间

周一至周日 12:00-22:00

关闭下雪
关闭背景特效