OAuth 2.0 베어러 토큰은 정확히 무엇입니까?


171

에 따르면 RFC6750 무기명 토큰 사용, 토큰 (Token) 베어러 : -THE의 OAuth 2.0 인증 프레임 워크 :

토큰을 소유 한 당사자 ( "소지자")가 소유 한 다른 당사자가 토큰을 소유 할 수있는 속성을 가진 보안 토큰.

나 에게이 정의는 모호하며 사양을 찾을 수 없습니다.

  • 권한 부여 제공자를 구현한다고 가정하고 베어러 토큰에 어떤 종류의 문자열을 제공 할 수 있습니까?
  • 임의의 문자열 일 수 있습니까?
  • 일부 속성을 base64로 인코딩해야합니까?
    해시해야합니까?
  • 그리고 서비스 공급자가이 토큰의 유효성을 검사하기 위해 인증 공급자를 쿼리해야합니까?

포인터 주셔서 감사합니다.


권한 부여 제공자를 구현한다고 가정하고 베어러 토큰에 어떤 종류의 문자열을 제공 할 수 있습니까? 임의의 문자열 일 수 있습니까?. 액세스 토큰은 Auth0의 OAuth 2.0 엔드 포인트 (/ authorize 및 / oauth / token)를 통해 발행됩니다. OAuth 2.0 호환 라이브러리를 사용하여 액세스 토큰을 얻을 수 있습니다. 선호하는 OAuth 2.0 라이브러리가없는 경우 Auth0은 많은 언어 및 프레임 워크를위한 라이브러리를 제공합니다.
Bharathkumar V

답변:


146

무기명 토큰
토큰을 소유 한 모든 당사자 ( "소유자")가 소유 한 다른 당사자가 토큰을 소유 할 수있는 속성을 가진 보안 토큰. 베어러 토큰을 사용하면 베어러가 암호화 키 자료 (소지 증명)를 소유하고 있음을 증명할 필요가 없습니다.

베어러 토큰은 인증 서버에 의해 생성됩니다. 사용자가 애플리케이션 (클라이언트)을 인증하면 인증 서버는 토큰을 생성하여 생성합니다. 베어러 토큰은 OAuth 2.0과 함께 사용되는 주요 유형의 액세스 토큰입니다. 베어러 토큰은 기본적으로 "이 토큰 액세스의 베어러를 제공합니다"라고 말합니다.

베어러 토큰은 일반적으로 인증 서버에 의해 생성 된 일종의 불투명 한 값입니다. 무작위가 아닙니다. 액세스 권한을 부여한 사용자와 클라이언트에게 응용 프로그램 액세스 권한을 기반으로 작성됩니다.

예를 들어 API에 액세스하려면 액세스 토큰을 사용해야합니다. 액세스 토큰은 수명이 짧습니다 (1 시간 정도). 베어러 토큰을 사용하여 새 액세스 토큰을 얻습니다. 액세스 토큰을 받으려면 인증 서버에이 베어러 토큰을 클라이언트 ID와 함께 보냅니다. 이런 식으로 서버는 베어러 토큰을 사용하는 애플리케이션이 베어러 토큰이 작성된 애플리케이션과 동일하다는 것을 알고 있습니다. 예 : 응용 프로그램 용으로 생성 된 베어러 토큰을 가져 와서 내 응용 프로그램과 함께 사용할 수는 없습니다. 응용 프로그램이 생성되지 않았기 때문에 작동하지 않습니다.

Google 새로 고침 토큰은 다음과 같습니다 : 1 / mZ1edKKACtPAb7zGlwSzvs72PvhAbGmB8K1ZrGxpcNM

코멘트에서 복사 : 나는 당신이 제공하는 베어러 토큰에 제한이 없다고 생각합니다. 내가 생각할 수있는 유일한 것은 하나 이상을 허용하는 것이 좋습니다. 예를 들어, 사용자는 애플리케이션을 최대 30 회 인증 할 수 있으며 기존 베어러 토큰은 계속 작동합니다. 그리고 6 개월 동안 사용하지 않았다면 시스템에서 제거 할 것입니다. 인증 서버는 그것들을 생성하고 형식을 정하는 방식에 따라 유효성을 검사해야합니다.

최신 정보:

베어러 토큰은 모든 인라인 조치 HTTP 요청의 Authorization 헤더에 설정됩니다. 예를 들면 다음과 같습니다.

POST /rsvp?eventId=123 HTTP/1.1
Host: events-organizer.com
Authorization: Bearer AbCdEf123456
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/1.0 (KHTML, like Gecko; Gmail Actions)

rsvpStatus=YES

"AbCdEf123456"위 예제 의 문자열 은 베어러 권한 부여 토큰입니다. 인증 서버에서 생성 한 암호화 토큰입니다. 조치와 함께 전송 된 모든 베어러 토큰에는 이슈 필드가 있으며, 대상 필드는 발신자 도메인을 https : // 형식의 URL로 지정합니다. 예를 들어 이메일이 noreply@example.com에서 온 경우 대상은 https://example.com 입니다.

베어러 토큰을 사용하는 경우 요청이 인증 서버에서 전송되고 발신자 도메인을위한 것인지 확인하십시오. 토큰이 확인되지 않으면 서비스는 HTTP 응답 코드 401 (무단)로 요청에 응답해야합니다.

베어러 토큰은 OAuth V2 표준의 일부이며 많은 API에서 널리 채택됩니다.


2
@ Xavier Egea Bearer 토큰은 기본 적으로 액세스 토큰이 아니라 새로 고침 토큰입니다.
Akhil Nambiar

13
토큰 베어러는 새로 고침 토큰 @AqeelSmith 의미하지 않는다 tools.ietf.org/html/rfc6750#section-6.1.1
수만 쿤두

9
첫 번째 단락은 베어러 토큰이 액세스 토큰이 아니라 새로 고침 토큰임을 의미합니다. 그렇지 않다. Bearer 토큰 사양에서 "이 사양은 OAuth 액세스 토큰이 베어러 토큰 인 경우 보호 자원 요청을 수행하는 방법을 설명합니다." RFC6750
다니엘

8
답변을 읽은 후 Bearer 토큰과 Refresh 토큰이 동일하다고 생각했습니다. 이를 명확히하기 위해 답변을 업데이트해야합니다.
KurioZ7

2
이 답변은 매우 잘못된 것입니다. 이 답변의 초기 진술서에 명시된 바와 같이 베어러 토큰은 갱신 토큰이 아닙니다. 수정 해주세요.
think01

67

귀하의 질문을 읽으면서 Bearer 토큰이 암호화되거나 서명되는 방법을 인터넷에서 검색하지 못했습니다. 베어러 토큰은 해시되지 않았을 것입니다.

그러나 귀하의 질문은 Bearer 토큰 기능에 대한 답변을 찾으려고합니다.

권한 부여 제공자를 구현한다고 가정하고 베어러 토큰에 어떤 종류의 문자열을 제공 할 수 있습니까? 임의의 문자열 일 수 있습니까? 일부 속성의 base64 인코딩이어야합니까? 해시해야합니까?

Bearer 토큰과 Refresh 토큰의 작동 방식을 설명하려고합니다.

사용자가 SSL을 통해 사용자와 비밀번호를 보내는 토큰을 서버에 요청하면 서버는 액세스 토큰새로 고침 토큰의 두 가지를 리턴합니다 .

액세스 토큰은 구체적인 사용자로 인증하기 위해 모든 요청 헤더에 추가해야하는 베어러 토큰입니다.

Authorization: Bearer <access_token>

액세스 토큰은 원하는 모든 사용자 속성, 클레임 및 역할이 포함 된 암호화 된 문자열입니다. 역할이나 클레임을 더 추가하면 토큰 크기가 증가하는지 확인할 수 있습니다. 리소스 서버가 액세스 토큰을 받으면이를 해독하고 이러한 사용자 속성을 읽을 수 있습니다. 이런 식으로 사용자는 모든 응용 프로그램과 함께 유효성이 검사되고 부여됩니다.

액세스 토큰의 만료 기간이 짧습니다 (예 : 30 분). 액세스 토큰의 만료 기간이 길면 이론적으로 취소 할 가능성이 없기 때문에 문제가됩니다. 따라서 "User"로 변경되는 role = "Admin"을 가진 사용자를 상상하십시오. 사용자가 role = "Admin"으로 이전 토큰을 유지하면 관리자 권한으로 토큰이 만료 될 때까지 액세스 할 수 있습니다. 그렇기 때문에 액세스 토큰의 수명이 짧습니다.

그러나 한 가지 문제가 떠 오릅니다. 액세스 토큰의 만료 기간이 짧은 경우 모든 짧은 기간 동안 사용자와 비밀번호를 보내야합니다. 안전한가요? 아닙니다. 우리는 그것을 피해야합니다. 새로 고침 토큰이이 문제를 해결하는 것처럼 보입니다.

새로 고침 토큰은 DB에 저장되며 만료 기간이 길어집니다 (예 : 1 개월).

사용자는 새로 고침 토큰을 사용하여 사용자가 첫 번째 토큰 요청에서 수신 한 새 액세스 토큰 (예 : 30 분마다 만료)을 얻을 수 있습니다. 액세스 토큰이 만료되면 클라이언트는 새로 고침 토큰을 보내야합니다. 이 새로 고침 토큰이 DB에 존재하면 서버는 클라이언트에게 새 액세스 토큰과 다른 새로 고침 토큰을 반환하고 이전 새로 고침 토큰을 새 것으로 교체합니다.

사용자 액세스 토큰이 손상된 경우 해당 사용자의 새로 고침 토큰을 DB에서 삭제해야합니다. 이렇게하면 해커가 새로 고침 토큰을 보내는 새 액세스 토큰을 얻으려고 할 때이 작업이 거부되므로 액세스 토큰이 만료 될 때까지만 토큰이 유효합니다.


2
"권한 부여 서버가 액세스 토큰을 받으면 암호를 해독하고 이러한 사용자 속성을 읽을 수 있습니다. 이러한 방식으로 모든 응용 프로그램에서 사용자의 유효성을 검사하고 부여합니다." 인증 서버가 액세스 토큰을 부여하는 서버가 아닌가? 이 주제에 대해 머리를 숙이고 노력하고 있으며 많은 예제가 권한 부여 서버와 리소스 서버를 명확하게 구분합니다. 내가 이해 한 것은 Authorization Server에서 액세스 토큰을 얻은 다음 리소스 서버에 대한 모든 요청과 함께 전달한다는 것입니다.
kivikall

1
@kivikall 당신이 맞아요. 나는 대답에서 그것을 바꿨다. 자원 서버는 모든 요청에서 토큰 (권한 부여 서버가 토큰 작성 프로세스에서 암호화 한 토큰)을 수신하여 해독합니다.
Xavier Egea

1
@kivikall 실제로 토큰을 해독하는 것은 권한 부여와 관련된 것이므로 Authorization Server에 속해야합니다. 그래서 답변에 썼습니다. 그러나 실제로 이것은 모든 요청에서 Authorization Server로받은 토큰의 유효성을 검증해야 함을 의미합니다 (다른 요청을 수행 할 수도 있음). 따라서 성능 손실을 피하려면 토큰을 리소스 서버로 해독하는 기능 중 일부를 제공하는 것이 좋습니다. : 다음 링크를 확인 stackoverflow.com/questions/12296017/...
자비에 Egea

그러나 요청이있을 때마다 리소스 서버는 제공된 액세스 토큰이 권한 부여 서버에 유효한지 확인해야합니다. 따라서 역할이 변경되면 인증 서버에 변경 사항이 즉시 반영 될 수 있습니다. 또한 AccessToken이 손상된 경우 RefreshToken을 삭제하는 이유는 무엇입니까? RefreshToken은 AccessToken을 기반으로 계산할 수 없으므로 만료되면 해커가 다시 차단됩니다.
만다린

내가 말했듯이 액세스 토큰에는 역할과 같은 사용자 정보가 포함됩니다. 사용자 역할이 변경되면 현재 토큰이 만료되면이 변경 사항이 다음 토큰에 반영됩니다. 이는 짧은 시간 (액세스 토큰 만료까지)에 사용자가 동일한 역할을 담당하고 토큰이 여전히 유효하기 때문에 인증 서버가이를 허용 함을 의미합니다. 두 번째 질문과 관련하여 Refresh Token을 삭제하면 사용자가 자격 증명을 다시 삽입합니다. 이것은 액세스 토큰이 구성되어있는 경우 원하는 것입니다. 다른 경우, 해커는 (예 1 개월)을 refreshtoken 만료까지 허가 할 수있다
자비에 Egea

9

무기명 토큰은 알파벳, 숫자, "-", "."의 반복입니다. , "_", "~", "+", "/"뒤에 0 개 이상의 "=".

RFC 6750 2.1. 권한 부여 요청 헤더 필드 (형식은 ABNF (증강 BNF) 임)

The syntax for Bearer credentials is as follows:

     b64token    = 1*( ALPHA / DIGIT /
                       "-" / "." / "_" / "~" / "+" / "/" ) *"="
     credentials = "Bearer" 1*SP b64token

Base64처럼 보이지만 헤더의 토큰을 base64로 인코딩해야합니까? 그렇지 않습니다.

"HTTP / 1.1, part 7 : Authentication"**으로 조금 더 깊이 파고 들었지만 b64token은 base64, base64url 등에서 일반적으로 사용되는 문자를 허용하는 ABNF 구문 정의 일뿐입니다. 따라서 b64token은 그렇지 않습니다. 인코딩 또는 디코딩을 정의하되 액세스 토큰을 포함 할 권한 부여 헤더 부분에서 사용할 수있는 문자를 정의하십시오.

참고 문헌


Bearer 토큰의 목적을 전혀 설명하지 않았습니다.
Jaime Hablutzel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.