| 인터넷 초안 | OAuth 2.1 권한 부여 프레임워크 | 2026년 9월 |
| Hardt 외 | 2027년 3월 7일 만료 | [페이지] |
OAuth 2.1 권한 부여 프레임워크를 사용하면 애플리케이션이 보호된 리소스에 제한적으로 접근할 수 있습니다. 이는 리소스 소유자와 권한 부여 서비스 간의 승인 상호작용을 조정하여 리소스 소유자를 대신해 접근하거나, 애플리케이션이 자신을 대신하여 접근 권한을 얻도록 허용하는 방식으로 이루어집니다. 이 명세는 RFC 6749에 설명된 OAuth 2.0 권한 부여 프레임워크와 RFC 6750의 Bearer 토큰 사용을 대체하며 폐기합니다.¶
이 주석은 RFC로 게시하기 전에 제거됩니다.¶
이 문서에 대한 논의는 OAuth 작업 그룹 메일링 리스트(oauth@ietf.org)에서 이루어지며, 해당 목록은 https://mailarchive.ietf.org/arch/browse/oauth/에 보관됩니다.¶
이 초안의 소스와 이슈 추적기는 https://github.com/oauth-wg/oauth-v2-1에서 확인할 수 있습니다.¶
이 인터넷 초안은 BCP 78 및 BCP 79의 규정을 완전히 준수하여 제출되었습니다.¶
인터넷 초안은 인터넷 엔지니어링 태스크 포스 (IETF)의 작업 문서입니다. 다른 그룹에서도 작업 문서를 인터넷 초안으로 배포할 수 있습니다. 현재 인터넷 초안 목록은 https://datatracker.ietf.org/drafts/current/에 있습니다.¶
인터넷 초안은 최대 6개월 동안 유효한 초안 문서이며 언제든지 다른 문서에 의해 갱신, 대체 또는 폐기될 수 있습니다. 인터넷 초안을 참조 자료로 사용하거나 "진행 중인 작업" 이외의 것으로 인용하는 것은 적절하지 않습니다.¶
이 인터넷 초안은 2027년 3월 7일에 만료됩니다.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
OAuth는 클라이언트의 역할을 리소스 소유자의 역할과 분리하여 클라이언트-서버 인증 모델에 권한 부여 계층을 도입합니다. OAuth에서 클라이언트는 리소스 소유자가 제어하고 리소스 서버가 호스팅하는 리소스에 대한 접근을 요청합니다. 보호된 리소스에 접근하기 위해 리소스 소유자의 자격 증명을 사용하는 대신, 클라이언트는 액세스 토큰, 즉 범위 및 수명과 같은 특정 접근 속성 집합을 나타내는 자격 증명을 얻습니다. 액세스 토큰은 리소스 소유자의 승인을 받아 권한 부여 서버가 클라이언트에 발급합니다. 클라이언트는 액세스 토큰을 사용하여 리소스 서버가 호스팅하는 보호된 리소스에 접근합니다.¶
더 오래되고 제한적인 클라이언트-서버 인증 모델에서는 클라이언트가 리소스 소유자의 자격 증명을 사용하여 서버에 인증함으로써 서버의 접근 제한 리소스(보호된 리소스)를 요청합니다. 애플리케이션이 제한된 리소스에 접근할 수 있도록 하기 위해 리소스 소유자는 자신의 자격 증명을 애플리케이션과 공유합니다. 이로 인해 다음과 같은 여러 문제와 제한이 발생합니다.¶
애플리케이션은 향후 사용을 위해 리소스 소유자의 자격 증명, 일반적으로 평문 형태의 비밀번호를 저장해야 합니다.¶
서버는 비밀번호에 내재된 보안 취약점에도 불구하고 비밀번호 인증을 지원해야 합니다.¶
애플리케이션은 리소스 소유자의 보호된 리소스에 지나치게 광범위하게 접근할 수 있게 되며, 리소스 소유자는 접근 기간이나 제한된 리소스 하위 집합에 대한 접근을 제한할 수 없습니다.¶
리소스 소유자는 최선의 보안 관행에도 불구하고 관련 없는 다른 서비스에서 비밀번호를 재사용하는 경우가 많습니다. 이러한 비밀번호 재사용은 한 서비스의 취약점이나 노출이 완전히 관련 없는 서비스에 보안 영향을 줄 수 있음을 의미합니다.¶
리소스 소유자는 모든 제3자의 접근을 취소하지 않고서는 개별 애플리케이션에 대한 접근을 취소할 수 없으며, 이를 위해서는 비밀번호를 변경해야 합니다.¶
어떤 애플리케이션이든 침해되면 최종 사용자의 비밀번호와 해당 비밀번호로 보호되는 모든 데이터가 침해됩니다.¶
OAuth가 사용되는 예로, 최종 사용자(리소스 소유자)가 금융 관리 서비스(클라이언트)에 은행 서비스(리소스 서버)에 저장된 민감한 거래 내역에 대한 접근을 허용하면서도, 사용자 이름과 비밀번호를 금융 관리 서비스와 공유하지 않는 경우가 있습니다. 대신 사용자는 자신의 금융 기관 서버(권한 부여 서버)에 직접 인증하고, 이 서버는 금융 관리 서비스에 위임 전용 자격 증명 (액세스 토큰)을 발급합니다.¶
이러한 관심사의 분리는 애플리케이션을 수정하지 않고도 다중 요소 인증이나 심지어 비밀번호 없는 인증과 같은 더 고급 사용자 인증 방법을 사용할 수 있게 합니다. 모든 사용자 인증 로직이 권한 부여 서버에서 처리되므로 애플리케이션은 특정 인증 메커니즘을 구현하는 세부 사항을 고려할 필요가 없습니다. 이를 통해 권한 부여 서버는 사용자 인증 정책을 관리하고 향후 애플리케이션과 변경 사항을 조율하지 않고도 이를 변경할 수 있습니다.¶
권한 부여 계층은 리소스 서버가 요청에 권한이 있는지 판단하는 방식도 단순화할 수 있습니다. 전통적으로 클라이언트를 인증한 후 각 리소스 서버는 모든 API 호출에서 클라이언트에 권한이 있는지 계산하기 위해 정책을 평가했습니다. 분산 시스템에서는 정책을 모든 리소스 서버에 동기화하거나 리소스 서버가 각 요청을 처리하기 위해 중앙 정책 서버를 호출해야 합니다. OAuth에서는 권한 부여 서버가 새 액세스 토큰을 생성할 때만 정책을 평가합니다. 권한이 부여된 접근이 액세스 토큰에 표현되어 있다면 리소스 서버는 더 이상 정책을 평가할 필요가 없으며 액세스 토큰만 검증하면 됩니다. 이러한 단순화는 애플리케이션이 리소스 소유자를 대신해 동작하는 경우뿐 아니라 자신을 대신해 동작하는 경우에도 적용됩니다.¶
OAuth는 사용자 인증을 달성하는 데 필요한 구성 요소를 정의하지 않으므로 인증 프로토콜이 아니라 권한 부여 프로토콜입니다. 목표가 사용자를 인증하는 것이라면 인증 프로토콜이 필요합니다. 그 예로 OpenID Connect [OpenID.Connect]가 있으며, 이는 OAuth를 기반으로 인증 프로토콜에 필요한 보안 특성과 필수 구성 요소를 제공합니다.¶
액세스 토큰은 클라이언트에 부여된 권한을 나타냅니다. 클라이언트가 액세스 토큰을 독점 API에 제시하고, 해당 API가 리소스 소유자의 사용자 식별자를 반환한 다음, 그 API 결과를 사용자 인증의 대용으로 사용하는 것은 일반적인 관행입니다. 이 관행은 OAuth 표준이나 보안 고려 사항의 일부가 아니며 리소스 소유자가 이를 고려하지 않았을 수도 있습니다. 구현자는 이 관행을 채택하기 전에 리소스 서버의 문서를 주의 깊게 확인해야 합니다.¶
이 명세는 HTTP [RFC9110]와 함께 사용하도록 설계되었습니다. HTTP 이외의 프로토콜에서 OAuth를 사용하는 것은 범위에서 제외됩니다.¶
2012년 10월 OAuth 2.0 권한 부여 프레임워크 [RFC6749]가 게시된 이후, 네이티브 앱용 OAuth 2.0 [RFC8252], OAuth 보안 현행 최선 관행 [RFC9700], 브라우저 기반 앱용 OAuth 2.0 [I-D.ietf-oauth-browser-based-apps]에 의해 업데이트되었습니다. OAuth 2.0 권한 부여 프레임워크: Bearer 토큰 사용 [RFC6750]도 [RFC9700]에 의해 업데이트되었습니다. 이 표준 트랙 명세는 이 모든 문서의 정보를 통합하고 [RFC9700]에서 안전하지 않은 것으로 확인된 기능을 제거합니다.¶
OAuth는 네 가지 역할을 정의합니다.¶
보호된 리소스에 대한 접근을 허용할 수 있는 주체입니다. 리소스 소유자가 사람인 경우 최종 사용자라고 합니다. 이를 "RO"로 줄여 부르기도 합니다.¶
보호된 리소스를 호스팅하며 액세스 토큰을 사용하여 보호된 리소스 요청을 수락하고 응답할 수 있는 서버입니다. 리소스 서버는 흔히 API를 통해 접근할 수 있습니다. 이를 "RS"로 줄여 부르기도 합니다.¶
리소스 소유자를 대신하고 그 권한을 받아 보호된 리소스 요청을 하는 애플리케이션입니다. "클라이언트"라는 용어는 특정 구현 특성(예: 애플리케이션이 서버, 데스크톱 또는 기타 장치에서 실행되는지 여부)을 의미하지 않습니다.¶
리소스 소유자를 성공적으로 인증하고 권한을 얻은 후 클라이언트에 액세스 토큰을 발급하는 서버입니다. 이를 "AS"로 줄여 부르기도 합니다.¶
이 명세의 대부분은 클라이언트와 권한 부여 서버 사이의 상호작용뿐 아니라 클라이언트와 리소스 서버 사이의 상호작용을 정의합니다.¶
권한 부여 서버와 리소스 서버 간의 상호작용은 이 명세의 범위를 벗어나지만, 리소스 서버와 권한 부여 서버 간의 상호 운용성을 위한 선택 사항을 제공하는 여러 확장이 정의되어 있습니다. 권한 부여 서버는 리소스 서버와 동일한 서버일 수도 있고 별도의 주체일 수도 있습니다. 하나의 권한 부여 서버가 여러 리소스 서버에서 허용되는 액세스 토큰을 발급할 수 있습니다.¶
리소스 소유자와 권한 부여 서버 간의 상호작용 (예: 최종 사용자가 권한 부여 서버에서 자신을 인증하는 방법)도 최종 사용자에게 동의를 요청하는 것과 관련된 보안 고려 사항 같은 일부 예외를 제외하면 이 명세의 범위를 벗어납니다.¶
리소스 소유자가 최종 사용자인 경우 사용자는 클라이언트와 상호작용합니다. 클라이언트가 웹 기반 애플리케이션인 경우 사용자는 사용자 에이전트를 통해 클라이언트와 상호작용합니다(3.5절의 [RFC9110]에 설명되어 있습니다). 클라이언트가 네이티브 애플리케이션인 경우 사용자는 운영 체제를 통해 클라이언트와 직접 상호작용합니다. 자세한 내용은 2.1절을 참조하십시오.¶
+--------+ +---------------+
| |--(1)- 권한 부여 요청 ------->| 리소스 |
| | | 소유자 |
| |<-(2)-- 권한 부여 -------------| |
| | +---------------+
| |
| | +---------------+
| |--(3)-- 권한 부여 ------------>| 권한 부여 |
| 클라이언트| | 서버 |
| |<-(4)----- 액세스 토큰 --------| |
| | +---------------+
| |
| | +---------------+
| |--(5)----- 액세스 토큰 ------->| 리소스 |
| | | 서버 |
| |<-(6)--- 보호된 리소스 --------| |
+--------+ +---------------+
그림 1에 나타난 추상 OAuth 2.1 흐름은 네 역할 간의 상호작용을 설명하며 다음 단계를 포함합니다.¶
클라이언트는 리소스 소유자에게 권한 부여를 요청합니다. 권한 부여 요청은 리소스 소유자에게 직접 (그림과 같이) 할 수도 있지만, 가급적 권한 부여 서버를 중개자로 사용하여 간접적으로 수행합니다.¶
클라이언트는 리소스 소유자의 권한을 나타내는 자격 증명인 권한 부여를 받으며, 이는 이 명세에 정의된 권한 부여 유형 중 하나 또는 확장 권한 부여 유형을 사용하여 표현됩니다. 권한 부여 유형은 클라이언트가 권한을 요청하는 데 사용한 방법과 권한 부여 서버가 지원하는 유형에 따라 달라집니다.¶
클라이언트는 권한 부여 서버에 인증하고 권한 부여를 제시하여 액세스 토큰을 요청합니다.¶
권한 부여 서버는 클라이언트를 인증하고 권한 부여를 검증하며, 유효한 경우 액세스 토큰을 발급합니다.¶
클라이언트는 리소스 서버에 보호된 리소스를 요청하고 액세스 토큰을 제시하여 인증합니다.¶
리소스 서버는 액세스 토큰을 검증하고, 유효한 경우 요청을 처리합니다.¶
클라이언트가 리소스 소유자에게서 권한 부여를 얻는 바람직한 방법(단계 (1)과 (2)에 나타남)은 권한 부여 서버를 중개자로 사용하는 것이며, 이는 4.1절의 그림 3에 나타나 있습니다.¶
액세스 토큰은 보호된 리소스에 접근하는 데 사용하는 자격 증명입니다. 액세스 토큰은 클라이언트에 발급된 권한을 나타내는 문자열입니다.¶
문자열에 구조가 있더라도 클라이언트는 이를 불투명한 값으로 간주합니다. 클라이언트는 액세스 토큰 값을 파싱할 수 있을 것이라고 기대해서는 안 됩니다. 권한 부여 서버는 리소스 서버가 기대하는 형식 외에는 일관된 액세스 토큰 인코딩이나 형식을 사용할 필요가 없습니다.¶
리소스 소유자가 클라이언트에 부여한 접근은 권한 부여 서버가 생성한 액세스 토큰으로 표현됩니다. 액세스 토큰은 유출된 액세스 토큰의 피해 범위를 줄이기 위해 수명이 짧습니다. 액세스 토큰의 만료는 권한 부여 서버가 설정합니다.¶
권한 부여 서버 구현에 따라, 토큰 문자열은 리소스 서버가 권한 정보를 검색하는 데 사용될 수도 있고, 토큰 자체에 검증 가능한 방식으로 권한 정보를 포함할 수도 있습니다 (즉, 서명된 데이터 페이로드로 구성된 토큰 문자열). 토큰 검색 메커니즘의 한 예는 토큰 검사 [RFC7662]이며, 여기서 RS는 클라이언트가 제시한 토큰을 검증하기 위해 AS의 엔드포인트를 호출합니다. 구조화된 토큰 형식의 한 예는 액세스 토큰용 JWT 프로파일 [RFC9068]이며, 이는 액세스 토큰 데이터를 JSON 웹 토큰 [RFC7519]으로 인코딩하고 서명하는 방법입니다.¶
클라이언트가 액세스 토큰을 사용하려면 이 명세의 범위를 벗어나는 추가 인증 자격 증명이 필요할 수 있습니다. 이는 일반적으로 DPoP [RFC9449] 및 상호 TLS 인증서 바인딩 액세스 토큰 [RFC8705]과 같은 송신자 제한 액세스 토큰이라고 합니다.¶
액세스 토큰은 추상화 계층을 제공하여 서로 다른 권한 부여 구성(예: 사용자 이름 및 비밀번호)을 리소스 서버가 이해하는 하나의 토큰으로 대체합니다. 이 추상화를 통해 토큰을 얻는 데 사용한 권한 부여보다 더 제한적인 액세스 토큰을 발급할 수 있으며, 리소스 서버가 광범위한 인증 방법을 이해할 필요도 없어집니다.¶
액세스 토큰은 리소스 서버의 보안 요구 사항에 따라 서로 다른 형식, 구조 및 사용 방법(예: 암호화 속성)을 가질 수 있습니다. 액세스 토큰 속성과 보호된 리소스에 접근하는 데 사용되는 방법은 이 명세에 설명된 범위를 넘어 확장될 수 있습니다.¶
액세스 토큰(및 모든 기밀 액세스 토큰 속성)은 전송 및 저장 중에 기밀로 유지되어야 하며, 권한 부여 서버, 액세스 토큰이 유효한 리소스 서버, 그리고 액세스 토큰을 발급받은 클라이언트 사이에서만 공유해야 합니다.¶
권한 부여 서버는 권한이 없는 당사자가 유효한 액세스 토큰을 생성하도록 액세스 토큰을 생성, 수정 또는 추측할 수 없도록 보장해야 합니다.¶
액세스 토큰은 접근을 허용하는 사용자가 가진 것보다 더 적은 권한을 가진 클라이언트에 발급되도록 의도됩니다. 이를 제한된 "범위" 액세스 토큰이라고 합니다. 권한 부여 서버와 리소스 서버는 이 범위 메커니즘을 사용하여 특정 클라이언트가 가질 수 있는 리소스 유형이나 접근 수준을 제한할 수 있습니다.¶
예를 들어 클라이언트는 사용자의 리소스에 대해 "읽기" 접근만 필요하고 리소스를 업데이트할 필요는 없을 수 있으므로, 클라이언트는 권한 부여 서버가 정의한 읽기 전용 범위를 요청하고 리소스 업데이트에 사용할 수 없는 액세스 토큰을 얻을 수 있습니다. 이를 위해서는 권한 부여 서버, 리소스 서버 및 클라이언트 간의 조율이 필요합니다. 권한 부여 서버는 클라이언트가 특정 범위를 요청할 수 있게 하고, 해당 범위를 클라이언트에 발급된 액세스 토큰과 연결합니다. 그러면 리소스 서버는 제한된 범위의 액세스 토큰이 제시될 때 범위를 적용할 책임이 있습니다.¶
OAuth는 범위 값을 정의하지 않으며, 대신 범위는 권한 부여 서버 또는 OAuth의 확장이나 프로파일에서 정의합니다. 범위를 정의하는 이러한 확장 중 하나는 [OpenID.Connect]이며, 사용자의 프로필 정보에 대한 세분화된 접근을 제공하는 범위 집합을 정의합니다. 알려진 확장의 범위와 충돌하는 사용자 정의 범위를 정의하지 않는 것이 권장됩니다.¶
제한된 범위의 액세스 토큰을 요청하려면 클라이언트는 사용 중인
권한 부여 유형에 따라 권한 부여 또는 토큰 엔드포인트에서
scope
요청 매개변수를 사용합니다. 이에 따라 권한 부여 서버는 scope
응답 매개변수를 사용하여 발급된 액세스 토큰의 범위를 클라이언트에 알립니다.¶
scope 매개변수의 값은 공백으로 구분된 대소문자를 구분하는 문자열 목록으로 표현됩니다. 문자열은 권한 부여 서버가 정의합니다. 값에 여러 개의 공백 구분 문자열이 포함되어 있는 경우 순서는 중요하지 않으며, 각 문자열은 요청된 범위에 추가 접근 범위를 더합니다.¶
scope = scope-token *( SP scope-token )
scope-token = 1*( %x21 / %x23-5B / %x5D-7E )
¶
권한 부여 서버는 권한 부여 서버 정책 또는
리소스 소유자의 지시에 따라 클라이언트가 요청한 범위를
전체 또는 부분적으로 무시할 수 있습니다. 발급된 액세스 토큰의 범위가
클라이언트가 요청한 범위와 다른 경우 권한 부여
서버는 실제 부여된 범위를 클라이언트에 알리기 위해 토큰 응답
(3.2.3절)에
scope 응답 매개변수를 포함해야 합니다.¶
클라이언트가 권한 부여를 요청할 때 scope 매개변수를 생략하면, 권한 부여 서버는 미리 정의된 기본값을 사용하여 요청을 처리하거나, 유효하지 않은 범위임을 나타내며 요청을 실패시켜야 합니다. 권한 부여 서버는 범위 요구 사항과 기본값(정의된 경우)을 문서화해야 합니다.¶
Bearer 토큰은 토큰을 보유한 모든 당사자("bearer")가 해당 토큰을 보유한 다른 당사자가 사용할 수 있는 모든 방식으로 토큰을 사용할 수 있다는 속성을 가진 보안 토큰입니다. Bearer 토큰을 사용하기 위해 bearer가 암호화 키 자료의 소유를 증명할 필요는 없습니다(소유 증명).¶
Bearer 토큰은 DPoP [RFC9449] 및 mTLS [RFC8705]와 같은 소유 증명 명세를 사용하여 소유 증명 특성을 제공하도록 강화할 수 있습니다.¶
액세스 토큰 공개를 방지하기 위해 클라이언트와 리소스 서버 간의 통신 상호작용은 1.5절에 설명된 대로 기밀성 및 무결성 보호를 사용해야 합니다.¶
Bearer 토큰의 특정 구조나 형식에 대한 요구 사항은 없습니다. Bearer 토큰이 권한 정보에 대한 참조인 경우, 그러한 참조는 충분히 긴 암호학적으로 무작위인 문자열을 사용하는 등 공격자가 추측할 수 없어야 합니다. Bearer 토큰이 인코딩 메커니즘을 사용하여 권한 정보를 토큰 자체에 포함하는 경우 액세스 토큰은 토큰이 수정되는 것을 방지하기에 충분한 무결성 보호를 사용해야 합니다. 액세스 토큰용 인코딩 및 서명 메커니즘의 한 예는 액세스 토큰용 JSON 웹 토큰 프로파일 [RFC9068]에 설명되어 있습니다.¶
송신자 제한 액세스 토큰은 액세스 토큰의 사용을 특정 송신자에 결부합니다. 이 송신자는 수신자(예: 리소스 서버)가 해당 액세스 토큰을 수락하기 위한 전제 조건으로 특정 비밀에 대한 지식을 증명해야 합니다.¶
권한 부여 서버와 리소스 서버는 OAuth 소유 증명(DPoP) [RFC9449] 또는 OAuth 2.0용 상호 TLS [RFC8705]와 같은 송신자 제한 액세스 토큰 메커니즘을 사용해야 합니다. 도난되거나 유출된 액세스 토큰의 오용을 방지하려면 4.10.1절의 [RFC9700]을 참조하십시오.¶
클라이언트와 리소스 서버 사이에 종단 간 TLS를 사용하는 것이 권장됩니다. TLS 트래픽을 중개자에서 종료해야 하는 경우 추가 보안 조언은 4.13절의 [RFC9700]을 참조하십시오.¶
구현은 콘텐츠 또는 헤더 필드의 평문 자격 증명과 토큰 교환을 재생 공격을 가능하게 하는 도청으로부터 보호하기 위해 전송 계층 보안 [RFC9846]과 같이 통신 인증, 무결성 및 기밀성을 제공하는 메커니즘을 사용해야 합니다 (예: 2.4.1절, 7.5.1절, 3.2절, 1.4.2절 참조).¶
모든 OAuth 프로토콜 URL(AS, RS 및 클라이언트가 노출하는 URL)은
루프백 인터페이스 리디렉션 URI를 제외하고
https 스킴을 사용해야 하며,
루프백 인터페이스 리디렉션 URI는 http 스킴을 사용할 수 있습니다.
https를 사용할 때 TLS 인증서는
4.3.4절의 [RFC9110]에 따라 검사해야 합니다.
이 문서를 작성하는 시점에는
TLS 버전 1.3 [RFC9846]이 가장
최신 버전입니다.¶
구현은 보안 요구 사항을 충족하는 추가 전송 계층 보안 메커니즘도 지원할 수 있습니다.¶
TLS 버전 및 알고리즘 식별은 이 명세의 범위를 벗어납니다. 전송 계층 보안에 대한 최신 권고 사항은 [BCP195]을, 인증서 검증 및 기타 보안 고려 사항은 관련 명세를 참조하십시오.¶
이 명세는 HTTP 리디렉션을 광범위하게 사용하며, 클라이언트 또는 권한 부여 서버가 리소스 소유자의 사용자 에이전트를 다른 대상으로 보냅니다. 이 명세의 예에서는 HTTP 302 상태 코드를 사용하지만, HTTP 307을 제외하고 사용자 에이전트를 통해 이 리디렉션을 수행할 수 있는 다른 모든 방법이 허용되며 이는 구현 세부 사항으로 간주됩니다. 자세한 내용은 7.5.4절을 참조하십시오.¶
OAuth 2.1은 잘 정의된 보안 특성을 갖춘 풍부한 권한 부여 프레임워크를 제공합니다.¶
이 명세는 몇 가지 필수 구성 요소를 부분적으로 또는 완전히 정의하지 않은 상태로 둡니다(예: 클라이언트 등록, 권한 부여 서버 기능, 엔드포인트 검색). 이러한 동작 중 일부는 구현이 선택하여 사용할 수 있는 다음과 같은 선택적 확장에서 정의됩니다.¶
[RFC8414]: 권한 부여 서버 메타데이터. 특정 OAuth 서버와 상호작용하는 데 필요한 정보를 클라이언트가 조회할 수 있는 엔드포인트를 정의합니다.¶
[RFC7591]: 동적 클라이언트 등록. 권한 부여 서버에 클라이언트를 프로그래밍 방식으로 등록하는 메커니즘을 제공합니다.¶
[RFC7592]: 동적 클라이언트 관리. 동적으로 등록된 클라이언트 정보를 업데이트하는 메커니즘을 제공합니다.¶
이 문서가 게시되는 시점에 알려진 현재 확장 목록은 부록 D를 참조하십시오.¶
이 명세는 client_id, 권한 부여 코드,
액세스 토큰, 갱신 토큰 또는 대부분의 다른 프로토콜 매개변수에 대한
최대 길이를 정의하지 않습니다. 이러한 값의 길이는
이를 발급하는 당사자가 선택한 구현 방식에 따라 달라지기 때문입니다.
실제로 구현은 자체 제한을 적용하며, 수신 구현의 제한을
초과하는 값은 요청 실패를 초래합니다.¶
구현은 수신한 값이 특정 길이 안에 들어간다고 가정해서는 안 됩니다. 값을 발급하는 당사자는 그 길이를 문서화해야 하며, 이를 전달할 구성 요소의 제한을 고려해야 합니다. 특히 권한 부여 코드와 같이 리디렉션에서 반환되는 값은 URI 쿼리 문자열로 전달되며, HTTP 구현은 일반적으로 요청 라인과 개별 헤더 필드의 길이를 제한합니다(3절 의 [RFC9112] 및 5.4절 의 [RFC9110]). 구현은 요청이 3절 의 [RFC9112]에서 권장하는 8000옥텟 요청 라인 길이 내에 유지될 수 있을 만큼 긴 매개변수 값을 지원해야 합니다. 특히 리소스 서버는 액세스 토큰 길이에 지나치게 작은 제한을 두어서는 안 됩니다. [RFC9068]에 정의된 것과 같은 구조화된 형식의 토큰은 일반적으로 1킬로바이트를 초과합니다.¶
OAuth 2.1은 알려진 현행 최선 관행의 확장 및 제한을 적용한 상태에서 OAuth 2.0과 호환됩니다. 구체적으로 PKCE와 같이 OAuth 2.0 핵심에 지정되지 않은 기능은 OAuth 2.1에서 필수입니다. 또한 암시적 또는 리소스 소유자 자격 증명 권한 부여 유형과 같이 OAuth 2.0에서 사용할 수 있는 일부 기능은 OAuth 2.1에 지정되어 있지 않습니다. 더 나아가 OAuth 2.0에서 허용된 일부 동작은 OAuth 2.1에서 제한됩니다. 예를 들어 OAuth 2.1은 리디렉션 URI의 엄격한 문자열 일치를 요구합니다.¶
이 문서의 핵심어 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", "OPTIONAL"은 여기에 표시된 것처럼 모두 대문자로 나타나는 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 의미로 해석해야 합니다.¶
이 명세는 [RFC5234]의 확장 Backus-Naur 형식(ABNF) 표기법을 사용합니다. 또한 URI-reference 규칙은 "Uniform Resource Identifier (URI): Generic Syntax" [RFC3986]에서 포함됩니다.¶
특정 보안 관련 용어는 [RFC4949]에 정의된 의미로 이해해야 합니다. 이러한 용어에는 "공격", "인증", "권한 부여", "인증서", "기밀성", "자격 증명", "암호화", "식별자", "서명하다", "서명", "신뢰", "검증하다", "확인하다" 등이 포함되지만 이에 한정되지 않습니다.¶
"콘텐츠"라는 용어는 6.4절의 [RFC9110]에 설명된 의미로 해석해야 합니다.¶
"사용자 에이전트"라는 용어는 3.5절의 [RFC9110]에 설명된 의미로 해석해야 합니다.¶
별도로 명시되지 않는 한 모든 프로토콜 매개변수 이름과 값은 대소문자를 구분합니다.¶
프로토콜을 시작하기 전에 클라이언트는 권한 부여 서버에 식별자(2.2절)를 설정해 두어야 합니다. 클라이언트 식별자가 권한 부여 서버에 설정되는 방법은 이 명세의 범위를 벗어나지만, 일반적으로 클라이언트 개발자가 권한 부여 서버의 웹사이트에서 클라이언트를 수동으로 등록하거나(계정을 만들고 서비스 약관에 동의한 후), 동적 클라이언트 등록 [RFC7591]을 사용하는 방식입니다. 확장은 클라이언트 등록을 설정하는 다른 프로그래밍 방식도 정의할 수 있습니다.¶
클라이언트 등록에는 클라이언트와 권한 부여 서버 간의 직접적인 상호작용이 필요하지 않습니다. 권한 부여 서버가 지원하는 경우 등록은 신뢰 설정 및 필요한 클라이언트 속성 (예: 리디렉션 URI, 클라이언트 유형)을 얻기 위한 다른 방법에 의존할 수 있습니다. 예를 들어 자체 발급 또는 제3자 발급 어설션을 사용하거나, 권한 부여 서버가 신뢰할 수 있는 채널을 사용하여 클라이언트 검색을 수행함으로써 등록을 완료할 수 있습니다.¶
클라이언트 등록에는 다음이 포함되어야 합니다.¶
사용 중인 권한 부여 유형에 필요한 클라이언트 세부 정보, 예를 들어 2.3절에 설명된 리디렉션 URI 및¶
권한 부여 서버가 요구하는 기타 정보 (예: 애플리케이션 이름, 웹사이트, 설명, 로고 이미지, 법적 약관 동의).¶
동적 클라이언트 등록 [RFC7591]은 수동 클라이언트 등록에서도 사용할 수 있는 클라이언트용 공통 일반 데이터 모델을 정의합니다.¶
OAuth 2.1은 권한 부여 서버에 안전하게 인증할 수 있는 능력을 기준으로 두 가지 클라이언트 유형을 정의합니다.¶
자격 증명이 있는 모든 클라이언트는 자격 증명의 유출과 오용을 방지하기 위한 예방 조치를 취해야 합니다.¶
클라이언트 인증을 통해 권한 부여 서버는 OAuth 흐름에서
특정 클라이언트(client_id로 식별됨)와 상호작용하고 있음을
확인할 수 있습니다. 권한 부여 서버는 실제로 적법한 클라이언트와
통신하고 있다는 신뢰 수준을 바탕으로
매 권한 부여 때마다 사용자에게 동의를 요청할지 아니면 처음에만 요청할지와 같은 사항에 대해
정책 결정을 내릴 수 있습니다.¶
권한 부여 서버가 클라이언트 또는 해당 클라이언트를 제공/운영하는 당사자의 신원을 검증하는지 여부와 방법은 이 명세의 범위를 벗어납니다. 권한 부여 서버는 클라이언트 자격 증명 권한 부여 유형과 같은 보다 민감한 리소스와 작업에 대한 접근을 클라이언트에 허용할지, 사용자에게 동의를 얼마나 자주 요청할지를 결정할 때 클라이언트 신원에 대한 신뢰 수준을 고려해야 합니다.¶
권한 부여 서버가 특정 클라이언트 유형을 지원해야 한다는 요구 사항은 없습니다.¶
하나의 client_id를 둘 이상의 클라이언트 유형으로 취급해서는 안 됩니다.¶
이 명세는 다음 클라이언트 프로파일을 중심으로 설계되었습니다.¶
웹 애플리케이션은 웹 서버에서 실행되는 클라이언트입니다. 리소스 소유자는 리소스 소유자가 사용하는 장치의 사용자 에이전트에 렌더링된 HTML 사용자 인터페이스를 통해 클라이언트에 접근합니다. 클라이언트 자격 증명과 클라이언트에 발급된 모든 액세스 토큰은 웹 서버에 저장되며 리소스 소유자에게 노출되거나 접근 가능하지 않습니다.¶
브라우저 기반 애플리케이션은 클라이언트 코드가 웹 서버에서 다운로드되어 리소스 소유자가 사용하는 장치의 사용자 에이전트(예: 웹 브라우저)에서 실행되는 클라이언트입니다. 프로토콜 데이터와 자격 증명은 리소스 소유자가 쉽게 접근할 수 있고 흔히 볼 수도 있습니다. 이러한 애플리케이션이 클라이언트 자격 증명을 사용하려는 경우 백엔드 포 프런트엔드 패턴을 사용하는 것이 권장됩니다. 이러한 애플리케이션은 사용자 에이전트 내에 존재하므로 권한을 요청할 때 사용자 에이전트의 기능을 원활하게 활용할 수 있습니다.¶
네이티브 애플리케이션은 리소스 소유자가 사용하는 장치에 설치되어 실행되는 클라이언트입니다. 프로토콜 데이터와 자격 증명은 리소스 소유자가 접근할 수 있습니다. 애플리케이션에 포함된 모든 클라이언트 인증 자격 증명은 추출할 수 있다고 가정합니다. 동적으로 발급된 액세스 토큰과 갱신 토큰은 허용 가능한 수준의 보호를 받을 수 있습니다. 일부 플랫폼에서는 이러한 자격 증명이 동일한 장치에 있는 다른 애플리케이션으로부터 보호됩니다. 이러한 애플리케이션이 클라이언트 자격 증명을 사용하려는 경우 백엔드 포 프런트엔드 패턴을 사용하거나 동적 클라이언트 등록 [RFC7591]을 사용하여 런타임에 자격 증명을 발급하는 것이 권장됩니다.¶
모든 클라이언트는 권한 부여 서버의 맥락에서 클라이언트 식별자, 즉 클라이언트가 제공한 등록 정보를 나타내는 고유 문자열로 식별됩니다. 권한 부여 서버는 일반적으로 클라이언트 식별자를 직접 발급하지만, 권한 부여 서버가 아닌 다른 당사자가 생성한 클라이언트 식별자를 가진 클라이언트도 제공할 수 있습니다. 클라이언트 식별자는 비밀이 아니며 리소스 소유자에게 노출되고, 단독으로 클라이언트 인증에 사용해서는 안 됩니다. 클라이언트 식별자는 권한 부여 서버의 맥락에서 고유합니다.¶
클라이언트 식별자는 불투명한 문자열이며 그 길이는 1.7.1절에 설명된 대로 이 명세에서 정의하지 않습니다.¶
권한 부여 서버가 권한 부여 서버가 아닌 당사자가 발급한 클라이언트 식별자를 가진 클라이언트를 지원하는 경우, 권한 부여 서버는 7.4절에 설명된 것처럼 클라이언트가 리소스 소유자를 사칭하지 못하도록 예방 조치를 취해야 합니다.¶
클라이언트 리디렉션 엔드포인트("리디렉션 엔드포인트"라고도 함)는 권한 부여 서버가 리소스 소유자와의 상호작용을 완료한 후 사용자 에이전트를 다시 보내는 클라이언트의 URI입니다.¶
권한 부여 서버는 클라이언트 등록 과정에서 권한 부여 서버와 미리 설정한 클라이언트의 리디렉션 엔드포인트 중 하나로 사용자 에이전트를 리디렉션합니다.¶
리디렉션 URI는 4.3절의 [RFC3986]에 정의된 절대 URI여야 합니다. 리디렉션 URI에는 쿼리 문자열 구성 요소(부록 C.1)가 포함될 수 있으며, 추가 쿼리 매개변수를 추가할 때 이를 유지해야 합니다. 리디렉션 URI에는 프래그먼트 구성 요소를 포함해서는 안 됩니다.¶
권한 부여 서버는 클라이언트가 전체 리디렉션 URI(경로 구성 요소 포함)를 등록하도록 요구해야 합니다. 권한 부여 서버는 등록된 URI와 정확히 일치하지 않는 리디렉션 URI를 지정하는 권한 부여 요청을 거부해야 합니다. 다만 루프백 리디렉션의 경우 포트 URI 구성 요소를 제외하고 정확히 일치해야 합니다. 자세한 내용은 4.1.1절을 참조하십시오.¶
권한 부여 서버는 클라이언트가 여러 리디렉션 URI를 등록하도록 허용할 수 있습니다.¶
등록은 권한 부여 서버에서 클라이언트 정보를 수동으로 구성하는 단계와 같이 대역 외에서 이루어질 수도 있고, 푸시된 권한 부여 요청 [RFC9126]의 초기 POST와 같이 런타임에 이루어질 수도 있습니다.¶
개인용 URI 스킴 기반 리디렉션 URI의 경우 권한 부여
서버는 클라이언트가 역순 도메인 이름 기반 스킴을 사용해야 한다는
8.4.3절의 요구 사항을
적용해야 합니다. 최소한 마침표 문자(.)가 포함되지 않은
모든 개인용 URI 스킴은 거부해야 합니다.¶
충돌 저항 특성에 더하여,
두 앱이 동일한 개인용 URI 스킴을 주장하는 분쟁이 발생한 경우
이는 소유권을 입증하는 데 도움이 될 수 있습니다(한 앱이
악의적으로 동작하는 경우). 예를 들어 두 앱이 com.example.app을 주장한다면,
example.com 소유자는 앱 스토어 운영자에게 위조 앱을
제거해 달라고 청원할 수 있습니다. 일반적인 URI 스킴을 사용했다면
이러한 청원은 입증하기 더 어렵습니다.¶
클라이언트는 7.13절에 설명된 것처럼 쿼리 매개변수에서 얻은 임의의 URI로 사용자의 브라우저를 전달하는 URL("오픈 리디렉터")을 노출해서는 안 됩니다. 오픈 리디렉터는 권한 부여 코드와 액세스 토큰의 유출을 가능하게 할 수 있습니다.¶
클라이언트는 필요할 경우 요청별
사용자 정의를 위해 리디렉션 URI를 요청마다 변경하는 대신
state 요청 매개변수를 사용할 수 있습니다.¶
리디렉션 URI 등록을 요구하지 않으면 공격자가 7.13절에 설명된 것처럼 권한 부여 엔드포인트를 오픈 리디렉터로 사용할 수 있습니다.¶
클라이언트에 여러 리디렉션 URI가 등록되어 있는 경우
클라이언트는
redirect_uri 요청 매개변수(4.1.1절)를 사용하여
권한 부여 요청에 리디렉션 URI를 포함해야 합니다.
클라이언트에 하나의 리디렉션 URI만 등록되어 있는 경우
redirect_uri 요청 매개변수는 선택 사항입니다.¶
클라이언트는 교차 사이트 요청 위조(CSRF) 공격을 방지해야 합니다.
이
맥락에서 CSRF는 권한 부여 서버가 아니라 악의적인 제3자로부터
발생한 리디렉션 엔드포인트에 대한 요청을 의미합니다
(자세한 내용은 4.4.1.8절의 [RFC6819] 참조). 권한 부여 서버가
code_challenge 매개변수를 지원함을 확인한 클라이언트는
해당 메커니즘이 제공하는 CSRF 보호에 의존할 수 있습니다. OpenID Connect 흐름에서는
nonce 매개변수를 검증하면 CSRF 보호가 제공됩니다. 그 외에는
사용자 에이전트에 안전하게 결부된 state 매개변수로 전달되는
일회용 CSRF 토큰을 CSRF 보호에 사용해야 합니다
(7.10절 참조).¶
OAuth 클라이언트가 하나의 권한 부여 서버와만 상호작용할 수 있는 경우 Mix-Up 방어는 필요하지 않습니다. 그러나 OAuth 클라이언트가 둘 이상의 권한 부여 서버와 상호작용하는 시나리오에서는 클라이언트가 Mix-Up 공격을 방지해야 합니다. Mix-Up 공격을 방지하기 위해 클라이언트는 해당 요청을 보낸 발급자의 리디렉션 응답만, 그리고 해당 권한 부여 요청을 시작한 동일한 사용자 에이전트에서 온 응답만 처리해야 합니다.¶
리디렉션 URI가 누락되었거나, 유효하지 않거나 일치하지 않아 권한 부여 요청 검증에 실패한 경우 권한 부여 서버는 리소스 소유자에게 오류를 알려야 하며 사용자 에이전트를 유효하지 않은 리디렉션 URI로 자동 리디렉션해서는 안 됩니다.¶
클라이언트 엔드포인트로의 리디렉션 요청은 일반적으로 사용자 에이전트가 처리하는 HTML 문서 응답을 생성합니다. HTML 응답이 리디렉션 요청의 결과로 직접 제공되는 경우 HTML 문서에 포함된 모든 스크립트는 리디렉션 URI 및 그 안에 포함된 산출물(예: 권한 부여 코드)에 대한 전체 접근 권한으로 실행됩니다. 또한 권한 부여 코드를 포함한 요청 URL이 페이지에 로드되는 내장 이미지, 스타일시트 및 기타 요소에 HTTP Referer 헤더로 전송될 수 있습니다.¶
클라이언트는 리디렉션 URI 엔드포인트 응답에 제3자 스크립트(예: 제3자 분석, 소셜 플러그인, 광고 네트워크)를 포함해서는 안 됩니다. 대신 URI에서 산출물을 추출하고 산출물(URI 또는 다른 곳)을 노출하지 않은 채 사용자 에이전트를 다른 엔드포인트로 다시 리디렉션해야 합니다. 제3자 스크립트가 포함된 경우 클라이언트는 자신의 스크립트 (URI에서 자격 증명을 추출하고 제거하는 데 사용)가 먼저 실행되도록 보장해야 합니다.¶
권한 부여 서버는 기반 자격 증명의 발급/등록 및 배포 과정이 그 기밀성을 보장하는 경우에만 클라이언트 인증에 의존해야 합니다.¶
기밀 클라이언트의 경우 권한 부여 서버는 보안 요구 사항을 충족하는 모든 형태의 클라이언트 인증 (예: 클라이언트 시크릿, 공개/개인 키 쌍)을 허용할 수 있습니다.¶
클라이언트 인증에는 mTLS [RFC8705] 또는
[RFC7521], [RFC7523] 및 해당 업데이트
[I-D.ietf-oauth-rfc7523bis]에 따라 서명된 JWT
("개인 키 JWT")를 사용하는 것과 같은 비대칭(공개 키 기반) 방법을 사용하는 것이
권장됩니다
([OpenID.Connect]에서는
클라이언트 인증 방법 private_key_jwt로 정의됨).
이러한 클라이언트 인증 방법을 사용할 때 권한 부여
서버는 민감한 대칭 키를 저장할 필요가 없어 여러 공격에
더 강하며, 클라이언트가 자체 키와 키 교체를
관리할 수 있게 됩니다.¶
JWT 기반 클라이언트 인증을 사용할 때 클라이언트와 권한 부여 서버는
[I-D.ietf-oauth-rfc7523bis]의 aud 값에 대한
업데이트된 지침을 따라야 합니다.¶
클라이언트 인증이 불가능한 경우 권한 부여 서버는 클라이언트의 신원을 검증하기 위해 다른 수단을 사용해야 합니다. 예를 들어 클라이언트 리디렉션 URI 등록을 요구하거나 리소스 소유자가 신원을 확인하도록 할 수 있습니다. 유효한 리디렉션 URI는 리소스 소유자에게 권한을 요청할 때 클라이언트의 신원을 확인하기에는 충분하지 않지만, 리소스 소유자의 권한을 얻은 후 위조 클라이언트에 자격 증명을 전달하는 것을 방지하는 데 사용할 수 있습니다.¶
클라이언트는 요청에서 어떤 인증 메커니즘이 권위 있는지 충돌하는 것을 방지하기 위해 각 요청에 하나를 초과하는 인증 방법을 사용해서는 안 됩니다.¶
권한 부여 서버는 인증되지 않은 클라이언트와 상호작용할 때의 보안 영향을 고려하고 해당 클라이언트에 발급되는 토큰의 잠재적 노출을 제한하는 조치를 취해야 합니다 (예: 갱신 토큰 수명 제한).¶
권한 부여 서버가 특정 클라이언트 신원과 연결하는 권한은 클라이언트 식별 및 클라이언트 자격 증명 수명 주기 관리의 전체 프로세스에 대한 평가에 따라 달라져야 합니다. 자세한 내용은 7.2절을 참조하십시오.¶
클라이언트 시크릿을 보유한 기밀 클라이언트를 지원하기 위해 권한 부여 서버는 다음 매개변수를 사용하여 요청 본문 콘텐츠에 클라이언트 자격 증명을 포함하는 방식을 지원해야 합니다.¶
필수입니다. 클라이언트 시크릿입니다.¶
매개변수는 요청 콘텐츠에서만 전송할 수 있으며 요청 URI에 포함해서는 안 됩니다.¶
이는 2절의
[RFC7591]에 정의된
client_secret_post라고도 합니다.¶
예를 들어 콘텐츠 매개변수를 사용하여 액세스 토큰을 갱신하는 요청(4.3절)은 다음과 같습니다(표시 목적으로만 추가 줄바꿈을 사용함).¶
POST /token HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA &client_id=s6BhdRkqt3&client_secret=7Fjfp0ZBr1KtDRbnfVdmIw¶
권한 부여 서버는 클라이언트 시크릿을 발급받은 클라이언트를 인증하기 위해 HTTP Basic 인증 스킴을 지원할 수 있습니다.¶
11절의
[RFC9110]에 정의된
HTTP Basic 인증 스킴을 사용하여 권한 부여 서버에 인증할 때,
클라이언트 식별자는
부록 B에 따라
application/x-www-form-urlencoded 인코딩 알고리즘으로
인코딩되고, 인코딩된 값이 사용자 이름으로 사용됩니다. 클라이언트
시크릿은 동일한 알고리즘으로 인코딩되어
비밀번호로 사용됩니다.¶
이는 2절의
[RFC7591]에 정의된
client_secret_basic이라고도 합니다.¶
예를 들면 다음과 같습니다(표시 목적으로만 추가 줄바꿈을 사용함).¶
Authorization: Basic czZCaGRSa3F0Mzo3RmpmcDBaQnIxS3REUmJuZlZkbUl3¶
참고: 클라이언트 식별자와 시크릿을 먼저 폼 인코딩한 다음, 인코딩된 값을 HTTP Basic 인증 사용자 이름과 비밀번호로 사용하는 이 방법은 과거에 많은 상호 운용성 문제를 일으켰습니다. 일부 구현은 인코딩 단계를 빠뜨리거나 특정 문자만 인코딩하기로 했거나 자격 증명을 검증할 때 인코딩 요구 사항을 무시하여, 클라이언트가 개별 권한 부여 서버에 자격 증명을 제시하는 방법을 특별히 처리해야 했습니다. 요청 본문 콘텐츠에 자격 증명을 포함하면 인코딩 문제를 피할 수 있고 상호 운용성이 더 높은 구현으로 이어집니다.¶
클라이언트 시크릿 인증 방법에는 비밀번호가 포함되므로 권한 부여 서버는 이를 사용하는 모든 엔드포인트를 무차별 대입 공격으로부터 보호해야 합니다.¶
권한 부여 서버는 보안 요구 사항에 맞는 적절한 인증 스킴을 지원할 수 있습니다. 다른 인증 방법을 사용할 때 권한 부여 서버는 클라이언트 식별자(등록 레코드)와 인증 스킴 간의 매핑을 정의해야 합니다.¶
mTLS [RFC8705] 및 개인 키 JWT([RFC7523], [I-D.ietf-oauth-rfc7523bis])와 같은 일부 추가 인증 방법은 "OAuth 토큰 엔드포인트 인증 방법" 레지스트리에 정의되어 있으며, 토큰 엔드포인트를 보호하는 특정 용도를 넘어 일반적인 클라이언트 인증 방법으로도 유용할 수 있습니다.¶
이 명세는 클라이언트를 권한 부여 서버에 등록하도록 요구하지 않습니다. 그러나 등록되지 않은 클라이언트의 사용은 이 명세의 범위를 벗어나며 추가적인 보안 분석과 상호 운용성 영향 검토가 필요합니다.¶
권한 부여 프로세스는 두 개의 권한 부여 서버 엔드포인트 (HTTP 리소스)를 사용합니다.¶
권한 부여 엔드포인트 - 클라이언트가 사용자 에이전트 리디렉션을 통해 리소스 소유자에게서 권한을 얻는 데 사용합니다.¶
토큰 엔드포인트 - 클라이언트가 일반적으로 클라이언트 인증과 함께 권한 부여를 액세스 토큰으로 교환하는 데 사용합니다.¶
또한 하나의 클라이언트 엔드포인트도 사용합니다.¶
리디렉션 엔드포인트 - 권한 부여 서버가 리소스 소유자의 사용자 에이전트를 통해 권한 부여 자격 증명이 포함된 응답을 클라이언트에 반환하는 데 사용합니다.¶
모든 권한 부여 유형이 두 엔드포인트를 모두 사용하는 것은 아닙니다. 확장 권한 부여 유형은 필요에 따라 추가 엔드포인트를 정의할 수 있습니다.¶
토큰 엔드포인트는 클라이언트가 4절 및 4.3절에 설명된 것과 같은 권한 부여를 사용하여 액세스 토큰을 얻는 데 사용됩니다.¶
클라이언트가 토큰 엔드포인트의 URL을 얻는 방법은 이 명세의 범위를 벗어나지만, URL은 일반적으로 서비스 문서에 제공되어 클라이언트 개발 중 구성되거나, 권한 부여 서버의 메타데이터 문서 [RFC8414]에 제공되어 런타임에 프로그래밍 방식으로 가져옵니다.¶
토큰 엔드포인트 URL에는 프래그먼트 구성 요소를 포함해서는 안 되며, 쿼리 문자열 구성 요소(부록 C.1)를 포함할 수 있습니다.¶
클라이언트는 토큰 엔드포인트에 요청할 때 HTTP POST 메서드를
사용해야 합니다.¶
권한 부여 서버는 토큰 엔드포인트로 전송된 인식하지 못하는 요청 매개변수를 무시해야 합니다.¶
값 없이 전송된 매개변수는 요청에서 생략된 것으로 취급해야 합니다. 이 명세에서 정의한 요청 및 응답 매개변수는 두 번 이상 포함해서는 안 됩니다. 이 요구 사항은 특정 매개변수에 대해 확장에서 명시적으로 다르게 정의하지 않는 한 확장에서 정의한 매개변수에도 적용됩니다.¶
브라우저 기반 애플리케이션을 지원하려는 권한 부여 서버 (예: 지원 백엔드 서버에 접근하지 않고 클라이언트 측 JavaScript에서만 실행되는 애플리케이션)는 응답이 애플리케이션에 표시될 수 있도록 토큰 엔드포인트가 필요한 CORS [WHATWG.CORS] 헤더를 지원하도록 해야 합니다. 권한 부여 서버가 메타데이터 URL, 동적 클라이언트 등록, 취소, 검사, 검색 또는 사용자 정보 엔드포인트와 같은 추가 엔드포인트를 애플리케이션에 제공하는 경우 이러한 엔드포인트도 브라우저 기반 애플리케이션이 접근할 수 있으므로 접근을 허용하는 CORS 헤더가 정의되어 있어야 합니다. 자세한 내용은 [I-D.ietf-oauth-browser-based-apps]을 참조하십시오.¶
기밀 클라이언트는 토큰 엔드포인트에 요청할 때 2.4절에 설명된 대로 권한 부여 서버에 인증해야 합니다.¶
클라이언트 인증은 다음에 사용됩니다.¶
갱신 토큰과 권한 부여 코드를 발급 대상 클라이언트에 결부하는 것을 적용합니다. 권한 부여 코드가 안전하지 않은 채널을 통해 리디렉션 엔드포인트로 전송될 때 클라이언트 인증은 추가 보안 계층을 제공합니다.¶
클라이언트를 비활성화하거나 자격 증명을 변경하여 침해된 클라이언트에서 복구하고, 공격자가 도난된 갱신 토큰을 악용하지 못하게 합니다. 하나의 클라이언트 자격 증명 집합을 변경하는 것은 전체 갱신 토큰 집합을 취소하는 것보다 훨씬 빠릅니다.¶
주기적인 자격 증명 교체를 요구하는 인증 관리 최선 관행을 구현합니다. 전체 갱신 토큰 집합의 교체는 어려울 수 있지만, 하나의 클라이언트 자격 증명 집합을 교체하는 것은 훨씬 쉽습니다.¶
클라이언트는 HTTP 요청 콘텐츠에서 UTF-8 문자 인코딩을 사용하여 부록 C.2에 따른 폼 인코딩 직렬화 형식으로 다음 매개변수를 전송하여 토큰 엔드포인트에 요청합니다.¶
필수입니다. 클라이언트가 특정 토큰 요청에서 사용하는
권한 부여 유형의 식별자입니다.
이 명세는 authorization_code,
refresh_token, client_credentials 값을 정의합니다.
권한 부여 유형은 토큰 요청에 필요하거나 지원되는 추가 매개변수를
결정합니다. 이러한 권한 부여 유형의
세부 사항은 아래에 정의되어 있습니다.¶
선택 사항입니다. 해당 매개변수에 의존하는 형태의
클라이언트 인증을 사용하거나 grant_type에서
공개 클라이언트 식별을 요구하는 경우 클라이언트 식별자가 필요합니다.¶
기밀 클라이언트는 3.2.1절에 설명된 대로 권한 부여 서버에 인증해야 합니다.¶
예를 들어 클라이언트는 다음 HTTPS 요청을 합니다 (표시 목적으로만 추가 줄바꿈을 사용함).¶
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=authorization_code &code=SplxlOBeZQQYbYS6WxSbIA &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb &code_verifier=3641a2d12d66101249cdf7a79c000c1f8c05d2aafcf14bf146497bed¶
권한 부여 서버는 다음을 수행해야 합니다.¶
권한 부여 유형별 추가 처리 규칙이 적용되며 각각의 권한 부여 유형에서 지정됩니다.¶
액세스 토큰 요청이 유효하고 권한이 부여된 경우 권한 부여 서버는 액세스 토큰과 선택적 갱신 토큰을 발급합니다.¶
클라이언트 인증에 실패했거나 유효하지 않은 경우 권한 부여 서버는 3.2.4절에 설명된 오류 응답을 반환합니다.¶
권한 부여 서버는 부록 C.3에 따라 HTTP 응답을 생성하고,
[RFC8259]에 정의된
application/json 미디어 유형을 사용하며,
다음 매개변수와 HTTP 200 (OK) 상태 코드를 포함하여
액세스 토큰과 선택적 갱신 토큰을 발급합니다.¶
필수입니다. 권한 부여 서버가 발급한 액세스 토큰입니다.¶
권장됩니다. 액세스 토큰의 수명을
초 단위로 나타내는 JSON 숫자입니다. 예를 들어
3600 값은 응답이 생성된 시점부터 1시간 후
액세스 토큰이 만료됨을 나타냅니다.
생략된 경우 권한 부여 서버는 다른 방법으로
수명을 제공하거나 기본값을 문서화해야 합니다.
권한 부여 서버는 액세스 토큰을 조기에 만료시킬 수 있으며,
클라이언트는 제공된 수명 동안 액세스 토큰이 유효할 것이라고
기대해서는 안 됩니다.¶
클라이언트가 요청한 범위와 동일한 경우 권장되며, 그렇지 않은 경우 필수입니다. 1.4.1절에 설명된 액세스 토큰의 범위입니다.¶
선택 사항입니다. 해당 토큰 요청에서 전달된 권한 부여를 기반으로 새 액세스 토큰을 얻는 데 사용할 수 있는 갱신 토큰입니다.¶
권한 부여 서버는 위험 평가와 자체 정책에 따라 특정 클라이언트에 갱신 토큰을 발급할지 결정해야 합니다. 권한 부여 서버가 갱신 토큰을 발급하지 않기로 결정한 경우 클라이언트는 예를 들어 새 권한 부여 코드 요청을 시작하는 등 OAuth 흐름을 처음부터 다시 시작하여 새 액세스 토큰을 얻을 수 있습니다. 이러한 경우 권한 부여 서버는 사용자 경험을 최적화하기 위해 쿠키와 지속적인 권한 부여를 사용할 수 있습니다.¶
갱신 토큰이 발급되는 경우 해당 갱신 토큰은 리소스 소유자가 동의한 범위 및 리소스 서버에 결부되어야 합니다. 이는 적법한 클라이언트의 권한 상승을 방지하고 갱신 토큰 유출의 영향을 줄이기 위한 것입니다.¶
매개변수는 부록 C.3에 설명된 대로 JavaScript 객체 표기법(JSON) 구조로 직렬화됩니다.¶
권한 부여 서버는 토큰, 자격 증명 또는 기타 민감한
정보가 포함된 모든 응답에
no-store 값을 가진 HTTP Cache-Control
응답 헤더 필드(5.2절
의 [RFC9111] 참조)를
포함해야 합니다.¶
예를 들면 다음과 같습니다.¶
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "2YotnFZFEjr1zCsicMWpAA",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter": "example_value"
}
¶
클라이언트는 응답에서 인식하지 못하는 값 이름을 무시해야 합니다. 권한 부여 서버에서 받은 토큰 및 기타 값의 길이는 1.7.1절에 설명된 대로 정의하지 않습니다.¶
권한 부여 서버는 별도로 지정되지 않는 한 HTTP 400 (Bad Request) 상태 코드로 응답하고 다음 매개변수를 응답에 포함합니다.¶
필수입니다. 다음 중 하나의 ASCII [USASCII] 오류 코드입니다.¶
요청에 필수 매개변수가 누락되어 있거나,
지원되지 않는 매개변수 값(권한 부여 유형 제외)을
포함하거나, 매개변수를 반복하거나, 여러 자격 증명을 포함하거나,
클라이언트를 인증하는 데 둘 이상의 메커니즘을 사용하거나,
권한 부여 요청에서 code_challenge가 전송되지 않았는데
code_verifier를 포함하거나,
그 밖의 이유로 형식이 잘못되었습니다.¶
클라이언트 인증에 실패했습니다(예: 알 수 없는
클라이언트, 클라이언트 인증이 포함되지 않음 또는 지원되지 않는
인증 방법). 권한 부여 서버는
어떤 HTTP 인증 스킴이 지원되는지 나타내기 위해
HTTP 401 (Unauthorized) 상태 코드를 반환할 수 있습니다. 클라이언트가
Authorization 요청 헤더 필드를 통해 인증을 시도한 경우
권한 부여 서버는 HTTP 401 (Unauthorized) 상태 코드로
응답하고 클라이언트가 사용한 인증 스킴에
일치하는 WWW-Authenticate 응답 헤더 필드를
포함해야 합니다.¶
제공된 권한 부여(예: 권한 부여 코드, 리소스 소유자 자격 증명) 또는 갱신 토큰이 유효하지 않거나, 만료되었거나, 취소되었거나, 권한 부여 요청에 사용된 리디렉션 URI와 일치하지 않거나, 다른 클라이언트에 발급되었습니다.¶
인증된 클라이언트는 이 권한 부여 유형을 사용할 권한이 없습니다.¶
권한 부여 유형이 권한 부여 서버에서 지원되지 않습니다.¶
요청된 범위가 유효하지 않거나, 알 수 없거나, 형식이 잘못되었거나, 리소스 소유자가 부여한 범위를 초과합니다.¶
error 매개변수의 값은
%x20-21 / %x23-5B / %x5D-7E 집합 밖의 문자를
포함해서는 안 됩니다.¶
선택 사항입니다. 발생한 오류를 클라이언트 개발자가
이해하는 데 도움을 주는 추가 정보를 제공하는
사람이 읽을 수 있는 ASCII [USASCII] 텍스트입니다.
error_description 매개변수의 값은
%x20-21 / %x23-5B / %x5D-7E 집합 밖의 문자를 포함해서는 안 됩니다.¶
선택 사항입니다. 오류에 대한 정보가 있는
사람이 읽을 수 있는 웹 페이지를 식별하는 URI이며,
클라이언트 개발자에게 오류에 대한 추가 정보를 제공하는 데 사용됩니다.
error_uri 매개변수의 값은
URI-reference 구문을 준수해야 하므로
%x21 / %x23-5B / %x5D-7E 집합 밖의 문자를
포함해서는 안 됩니다.¶
매개변수는 부록
C.3에 정의된
application/json 미디어 유형을 사용하여 HTTP 응답의
콘텐츠에 포함됩니다.¶
예를 들면 다음과 같습니다.¶
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "invalid_request"
}
¶
클라이언트는 액세스 토큰을 리소스 서버에 제시하여 보호된 리소스에 접근합니다. 리소스 서버는 액세스 토큰을 검증하고, 만료되지 않았으며 그 범위가 요청한 리소스를 포함하는지 확인해야 합니다. 리소스 서버가 액세스 토큰을 검증하는 데 사용하는 방법은 이 명세의 범위를 벗어나지만, 일반적으로 리소스 서버와 권한 부여 서버 사이의 상호작용 또는 조율을 포함합니다. 예를 들어 리소스 서버와 권한 부여 서버가 같은 위치에 있거나 동일한 시스템의 일부인 경우 데이터베이스나 다른 저장소를 공유할 수 있습니다. 두 구성 요소가 독립적으로 운영되는 경우 토큰 검사 [RFC7662] 또는 JWT [RFC9068]와 같은 구조화된 액세스 토큰 형식을 사용할 수 있습니다.¶
이 절에서는 리소스 서버로 보내는 리소스 요청에서 Bearer 토큰을 전송하는 두 가지 방법을 정의합니다. 클라이언트는 아래에 정의된 두 방법 중 하나를 사용해야 하며, 각 요청에서 토큰을 전송하기 위해 둘 이상의 방법을 사용해서는 안 됩니다.¶
특히 클라이언트는 URI 쿼리 매개변수에 액세스 토큰을 보내서는 안 되며, 리소스 서버는 URI 쿼리 매개변수의 액세스 토큰을 무시해야 합니다.¶
HTTP 요청 콘텐츠로 액세스 토큰을 보낼 때
클라이언트는 access_token 매개변수를 사용하여
요청 콘텐츠에 액세스 토큰을 추가합니다.
다음 조건이 모두 충족되지 않는 한 클라이언트는 이 방법을 사용해서는 안 됩니다.¶
HTTP 요청에
application/x-www-form-urlencoded로 설정된
Content-Type 헤더 필드가 포함되어야 합니다.¶
콘텐츠는 URL 현행 표준 [WHATWG.URL]에 정의된
application/x-www-form-urlencoded 콘텐츠 유형의
인코딩 요구 사항을 따라야 합니다.¶
HTTP 요청 콘텐츠는 단일 파트여야 합니다.¶
HTTP 요청 메서드는 콘텐츠의 의미가
정의되어 있는 메서드여야 합니다. 특히 이는 GET
메서드를 사용해서는 안 된다는 의미입니다.¶
콘텐츠에는 다른 요청별 매개변수가 포함될 수 있으며,
이 경우 access_token 매개변수는
& 문자(ASCII 코드 38)를 사용하여 요청별 매개변수와
적절히 구분해야 합니다.¶
예를 들어 클라이언트는 전송 계층 보안을 사용하여 다음 HTTP 요청을 합니다.¶
POST /resource HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded access_token=mF_9.B5f-4.1JqM¶
application/x-www-form-urlencoded 방법은
참여 클라이언트가 Authorization 요청 헤더 필드에
접근할 수 없는 애플리케이션 환경을 제외하고는 사용하지 않는 것이 좋습니다.
리소스 서버는 이 방법을 지원할 수 있습니다.¶
액세스 토큰을 받은 후 리소스 서버는 액세스 토큰이 아직 만료되지 않았고, 요청한 리소스에 접근할 권한이 있으며, 적절한 범위로 발급되었고, 보호된 리소스에 접근하기 위한 리소스 서버의 다른 정책 요구 사항을 충족하는지 확인해야 합니다.¶
액세스 토큰은 일반적으로 참조 토큰 또는 자체 인코딩 토큰이라는 두 범주로 나뉩니다. 참조 토큰은 권한 부여 서버에 질의하거나 토큰 데이터베이스에서 토큰을 조회하여 검증할 수 있으며, 자체 인코딩 토큰은 리소스 서버가 추출할 수 있는 암호화 및/또는 서명된 문자열에 권한 정보를 포함합니다.¶
액세스 토큰의 유효성을 확인하기 위해 권한 부여 서버에 질의하는 표준화된 방법은 토큰 검사 [RFC7662]에 정의되어 있습니다.¶
토큰 문자열에 정보를 인코딩하는 표준화된 방법은 액세스 토큰용 JWT 프로파일 [RFC9068]에 정의되어 있습니다.¶
리소스 접근 요청이 실패하면 리소스 서버는 클라이언트에 오류를 알리는 것이 좋습니다. 오류 응답의 세부 사항은 5.3.2절의 Bearer 토큰 설명과 같이 특정 토큰 유형에 따라 결정됩니다.¶
보호된 리소스 요청에 인증
자격 증명이 포함되어 있지 않거나 보호된 리소스에 접근할 수 있게 하는
액세스 토큰이 포함되어 있지 않은 경우, 리소스 서버는 HTTP
WWW-Authenticate 응답 헤더 필드를 포함해야 합니다.
다른 조건에 대한 응답에도 이를 포함할 수 있습니다.
WWW-Authenticate 헤더 필드는
HTTP/1.1 [RFC7235]에서 정의한 프레임워크를
사용합니다.¶
이 토큰 유형에 대한 모든 챌린지는 auth-scheme
값 Bearer를 사용해야 합니다. 이 스킴 뒤에는 하나 이상의
auth-param 값이 와야 합니다. 이
명세가 이 토큰 유형에 사용하거나 정의하는 auth-param 속성은 다음과 같습니다.
다른 auth-param 속성도 사용할 수 있습니다.¶
HTTP/1.1 [RFC7235]에 설명된 방식으로
보호 범위를 나타내기 위해 realm 속성을 포함할 수 있습니다.
realm 속성은 두 번 이상 나타나서는 안 됩니다.¶
scope 속성은 1.4.1절에 정의되어 있습니다.
scope 속성은 요청한 리소스에 접근하는 데
액세스 토큰에 필요한 범위를 나타내는
대소문자를 구분하는 범위 값의 공백 구분 목록입니다.
scope 값은 구현에서 정의하며 중앙 레지스트리가 없고,
허용되는 값은 권한 부여 서버가 정의합니다.
scope 값의 순서는 중요하지 않습니다. 어떤 경우에는
보호된 리소스를 사용하는 데 충분한 접근 범위를 가진
새 액세스 토큰을 요청할 때 scope 값을 사용합니다.
scope 속성 사용은 선택 사항입니다.
scope 속성은 두 번 이상 나타나서는 안 됩니다.
scope 값은 프로그래밍 방식으로 사용하기 위한 것이며
최종 사용자에게 표시하기 위한 것이 아닙니다.¶
다음은 두 가지 범위 값의 예이며, 각각 OpenID Connect [OpenID.Messages] 및 Open Authentication Technology Committee (OATC) 온라인 멀티미디어 권한 부여 프로토콜 [OMAP] OAuth 2.0 사용 사례에서 가져온 것입니다.¶
scope="openid profile email" scope="urn:example:channel=HBO&urn:example:rating=G,PG-13"¶
보호된 리소스 요청에 액세스
토큰이 포함되어 있고 인증에 실패한 경우, 리소스 서버는
접근 요청이 거부된 이유를 클라이언트에 제공하기 위해
error 속성을 포함하는 것이 좋습니다.
매개변수 값은 5.3.2절에
설명되어 있습니다.¶
리소스 서버는 최종 사용자에게 표시하기 위한 것이 아닌,
개발자가 읽을 수 있는 설명을 제공하기 위해
error_description 속성을 포함할 수 있습니다.¶
리소스 서버는 오류를 설명하는
사람이 읽을 수 있는 웹 페이지를 식별하는 절대 URI와 함께
error_uri 속성을 포함할 수 있습니다.¶
error, error_description 및
error_uri 속성은
두 번 이상 나타나서는 안 됩니다.¶
scope 속성의 값(부록 A.4에 지정됨)은
범위 값을 나타낼 때 %x21 / %x23-5B
/ %x5D-7E 집합 밖의 문자를 포함해서는 안 되며,
범위 값 사이의 구분자로는 %x20을 사용해야 합니다.
error 및 error_description
속성의 값(부록 A.7 및 부록 A.8에 지정됨)은
%x20-21 / %x23-5B / %x5D-7E 집합 밖의 문자를 포함해서는 안 됩니다.
error_uri 속성의 값(부록
A.9에 지정됨)은
URI-reference 구문을 준수해야 하므로
%x21 / %x23-5B / %x5D-7E 집합 밖의 문자를 포함해서는 안 됩니다.¶
요청이 실패하면 리소스 서버는 적절한 HTTP 상태 코드(일반적으로 400, 401, 403 또는 405)를 사용하여 응답하고 응답에 다음 오류 코드 중 하나를 포함합니다.¶
요청에 필수 매개변수가 누락되어 있거나, 지원되지 않는 매개변수 또는 매개변수 값을 포함하거나, 동일한 매개변수를 반복하거나, 액세스 토큰을 포함하는 데 둘 이상의 방법을 사용하거나, 그 밖의 이유로 형식이 잘못되었습니다. 리소스 서버는 HTTP 400 (Bad Request) 상태 코드로 응답하는 것이 좋습니다.¶
제공된 액세스 토큰이 만료되었거나, 취소되었거나, 형식이 잘못되었거나, 다른 이유로 유효하지 않습니다. 리소스 서버는 HTTP 401 (Unauthorized) 상태 코드로 응답하는 것이 좋습니다. 클라이언트는 새 액세스 토큰을 요청하고 보호된 리소스 요청을 다시 시도할 수 있습니다.¶
요청에는 클라이언트에 부여되고 액세스 토큰에
표현된 범위가 제공하는 것보다 더 높은 권한(범위)이 필요합니다.
리소스 서버는 HTTP
403 (Forbidden) 상태 코드로 응답하는 것이 좋으며,
보호된 리소스에 접근하는 데 필요한 범위와 함께
scope 속성을 포함할 수 있습니다.¶
확장에서는 추가 오류 코드를 정의하거나 위의 오류 코드가 반환되는 추가 상황을 지정할 수 있습니다.¶
요청에 인증 정보가 전혀 없는 경우 (예: 클라이언트가 인증이 필요하다는 사실을 알지 못했거나 지원되지 않는 인증 방법을 사용하여 시도한 경우) 리소스 서버는 오류 코드나 다른 오류 정보를 포함하지 않는 것이 좋습니다.¶
예를 들면 다음과 같습니다.¶
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="example"¶
그리고 만료된 액세스 토큰을 사용해 인증을 시도한 보호된 리소스 요청에 대한 응답은 다음과 같습니다.¶
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",
error="invalid_token",
error_description="The access token expired"
¶
액세스 토큰 유형은 두 가지 방법 중 하나로 정의할 수 있습니다. 액세스 토큰 유형 레지스트리에 등록하거나 (11.1절의 [RFC6749] 절차를 따름), 고유한 절대 URI를 이름으로 사용할 수 있습니다.¶
[RFC6750]은 OAuth 토큰 인증 스킴 간에 공유할 오류 값을 위한 공통 레지스트리를 11.4절의 [RFC6749]에 설정합니다.¶
주로 OAuth 토큰 인증을 위해 설계된 새로운 인증 스킴은 클라이언트에 오류 상태 코드를 제공하는 메커니즘을 정의하는 것이 좋으며, 허용되는 오류 값은 이 명세에서 설정한 오류 레지스트리에 등록해야 합니다.¶
이러한 스킴은 유효한 오류 코드 집합을
등록된 값의 하위 집합으로 제한할 수 있습니다.
오류 코드가 명명된 매개변수를 사용하여 반환되는 경우
매개변수 이름은 error로 하는 것이 좋습니다.¶
OAuth 토큰 인증에 사용할 수 있지만 주로 그 목적으로 설계되지 않은 다른 스킴도 동일한 방식으로 오류 값을 레지스트리에 결부할 수 있습니다.¶
새 인증 스킴은 이 명세에서의 사용과
유사한 방식으로 오류 정보를 반환하기 위해
error_description 및 error_uri 매개변수 사용을
함께 지정할 수도 있습니다.¶
유형 이름은 type-name ABNF를 준수해야 합니다.
유형 정의에 새 HTTP 인증 스킴이 포함되는 경우
유형 이름은 HTTP 인증 스킴 이름([RFC2617]에
정의됨)과 동일하게 하는 것이 좋습니다.
토큰 유형 example은 예제에서 사용하기 위해 예약되어 있습니다.¶
type-name = 1*name-char name-char = "-" / "." / "_" / DIGIT / ALPHA¶
URI 이름을 사용하는 유형은 일반적으로 적용되지 않고 사용되는 리소스 서버의 구현 세부 사항에 특화된 공급업체별 구현으로 제한하는 것이 좋습니다.¶
그 밖의 모든 유형은 등록해야 합니다.¶
권한 부여 엔드포인트 또는 토큰 엔드포인트에서 사용할 새 요청 또는 응답 매개변수는 11.2절의 [RFC6749] 절차에 따라 OAuth 매개변수 레지스트리에 정의 및 등록됩니다.¶
매개변수 이름은 param-name ABNF를 준수해야 하며, 매개변수 값 구문은 명확하게 정의되어야 합니다 (예: ABNF를 사용하거나 기존 매개변수의 구문을 참조함).¶
param-name = 1*name-char name-char = "-" / "." / "_" / DIGIT / ALPHA¶
일반적으로 적용되지 않으며 사용되는 권한 부여 서버의 구현 세부 사항에 특화된 등록되지 않은 공급업체별 매개변수 확장은 다른 등록된 값과 충돌할 가능성이 낮은 공급업체별 접두사를 사용하는 것이 좋습니다 (예: 'companyname_'으로 시작).¶
권한 부여 엔드포인트에서 사용할 새 응답 유형은 11.3절의 [RFC6749] 절차에 따라 권한 부여 엔드포인트 응답 유형 레지스트리에 정의 및 등록됩니다. 응답 유형 이름은 response-type ABNF를 준수해야 합니다.¶
response-type = response-name *( SP response-name ) response-name = 1*response-char response-char = "_" / DIGIT / ALPHA¶
응답 유형에 하나 이상의 공백 문자(%x20)가 포함되어 있으면 값의 순서가 중요하지 않은 공백 구분 값 목록으로 비교합니다. 값의 순서는 하나만 등록할 수 있으며, 이는 동일한 값 집합의 다른 모든 배열을 포함합니다.¶
예를 들어 확장은
code other_token
응답 유형을 정의하고 등록할 수 있습니다. 일단 등록되면 같은 조합을
other_token code로 등록할 수는 없지만,
두 값 모두 동일한 응답 유형을 나타내는 데 사용할 수 있습니다.¶
프로토콜 확장(즉, 액세스 토큰 유형, 확장 매개변수 또는 확장 권한 부여 유형)에 권한 부여 코드 부여 오류 응답(4.1.2.1절), 토큰 오류 응답(3.2.4절) 또는 리소스 접근 오류 응답(5.3절)과 함께 사용할 추가 오류 코드가 필요한 경우 이러한 오류 코드를 정의할 수 있습니다.¶
확장 오류 코드를 함께 사용하는 확장이 등록된 액세스 토큰 유형, 등록된 엔드포인트 매개변수 또는 확장 권한 부여 유형인 경우 해당 오류 코드는 (11.4절의 [RFC6749] 절차에 따라) 등록해야 합니다. 등록되지 않은 확장에서 사용되는 오류 코드도 등록할 수 있습니다.¶
오류 코드는 error ABNF를 준수해야 하며, 가능한 경우
식별 이름을 접두사로 사용하는 것이 좋습니다. 예를 들어
확장 매개변수 example에 설정된 유효하지 않은 값을 나타내는 오류는
example_invalid로 이름을 정하는 것이 좋습니다.¶
error = 1*error-char error-char = %x20-21 / %x23-5B / %x5D-7E¶
유연하고 확장 가능한 프레임워크인 OAuth의 보안 고려 사항은 여러 요인에 따라 달라집니다. 다음 절에서는 2.1절에 설명된 세 가지 클라이언트 프로파일인 웹 애플리케이션, 브라우저 기반 애플리케이션 및 네이티브 애플리케이션에 초점을 맞춘 보안 지침을 구현자에게 제공합니다.¶
포괄적인 OAuth 보안 모델 및 분석과 프로토콜 설계의 배경은 [RFC6819] 및 [RFC9700]에서 제공합니다.¶
다음 목록은 어떤 형태의 토큰을 사용하는 프로토콜에 대한 몇 가지 일반적인 위협을 제시합니다. 이 위협 목록은 NIST 특별 간행물 800-63 [NIST800-63]을 기반으로 합니다.¶
공격자는 위조된 액세스 토큰을 생성하거나 기존 토큰의 내용(예: 인증 또는 속성 명세)을 수정하여 리소스 서버가 클라이언트에 부적절한 접근을 허용하도록 할 수 있습니다. 예를 들어, 공격자는 유효 기간을 연장하도록 토큰을 수정할 수 있으며, 악의적인 클라이언트는 볼 수 없어야 하는 정보에 접근하기 위해 어설션을 수정할 수 있습니다.¶
액세스 토큰에는 민감한 정보를 포함하는 인증 및 속성 명세가 포함될 수 있습니다.¶
클라이언트가 액세스 토큰의 내용을 볼 수 없도록 해야 하는 경우 콘텐츠 암호화를 적용해야 합니다.¶
쿠키는 기본적으로 평문으로 전송되므로 쿠키에 포함된 모든 정보는 공개될 위험이 있습니다. Bearer 토큰은 평문으로 전송될 수 있는 쿠키에 저장해서는 안 됩니다. 쿠키에 관한 보안 고려 사항은 [RFC6265]의 7절 및 8절을 참조하십시오.¶
공격자는 한 리소스 서버에서 사용하도록 생성된 액세스 토큰을 사용하여 해당 토큰이 자신을 위한 것이라고 잘못 믿는 다른 리소스 서버에 접근합니다.¶
디지털 서명을 사용하여 액세스 토큰의 내용을 보호하고, 주기적인 키 교체와 같은 서명 키 관리의 최선 관행을 따르면 광범위한 위협을 완화할 수 있습니다.¶
또는 Bearer 토큰은 정보를 직접 인코딩하는 대신 권한 정보에 대한 참조를 포함할 수 있습니다. 참조를 사용하면 해당 참조를 권한 정보로 해석하기 위해 리소스 서버와 권한 부여 서버 간의 추가 상호작용이 필요할 수 있습니다. 이러한 상호작용의 구체적인 방식은 이 명세에서 정의하지 않지만, 그러한 메커니즘 중 하나가 토큰 검사 [RFC7662]에 정의되어 있습니다.¶
이 문서는 액세스 토큰의 인코딩이나 내용을 지정하지 않으므로 액세스 토큰의 무결성 보호를 보장하는 수단에 관한 상세한 권고 사항은 이 명세의 범위를 벗어납니다. 액세스 토큰의 인코딩 및 서명 메커니즘의 한 예는 액세스 토큰용 JSON 웹 토큰 프로파일 [RFC9068]에 설명되어 있습니다.¶
액세스 토큰 리디렉션에 대응하려면 권한 부여 서버가 의도된 수신자의 신원(대상)을, 일반적으로 하나의 리소스 서버 (또는 리소스 서버 목록) 형태로 토큰에 포함하는 것이 중요합니다. 토큰 사용을 특정 범위로 제한하는 것도 권장됩니다.¶
1.5절에서는 액세스 토큰 공개를 방지하고 클라이언트, 리소스 서버 및 권한 부여 서버 간 통신의 기밀성과 무결성을 제공하기 위한 정보를 제공합니다.¶
클라이언트 구현은 Bearer 토큰이 의도하지 않은 당사자에게 유출되지 않도록 보장해야 합니다. 그러한 당사자는 이를 사용하여 보호된 리소스에 접근할 수 있기 때문입니다. 이는 Bearer 토큰을 사용할 때의 주요 보안 고려 사항이며 이후의 모든 보다 구체적인 권고 사항의 기반이 됩니다.¶
클라이언트는 보호된 리소스에 요청할 때 TLS 인증서 체인을 검증해야 합니다. 이를 수행하지 않으면 DNS 하이재킹 공격으로 토큰이 도난되고 의도하지 않은 접근이 발생할 수 있습니다.¶
클라이언트는 Bearer 토큰으로 요청할 때 항상 TLS(https) 또는 이에 상응하는 전송 보안을 사용해야 합니다. 이를 수행하지 않으면 토큰이 여러 공격에 노출되어 공격자가 의도하지 않은 접근을 얻을 수 있습니다.¶
권한 부여 서버는 특히 웹 브라우저 내부나 정보 유출이 발생할 수 있는 다른 환경에서 실행되는 클라이언트에 토큰을 발급할 때 수명이 짧은 Bearer 토큰을 발급하는 것이 좋습니다. 수명이 짧은 Bearer 토큰을 사용하면 토큰이 유출되었을 때의 영향을 줄일 수 있습니다.¶
권한 부여 서버는 사용 범위를 의도한 리소스 서버 또는 리소스 서버 집합으로 제한하는 대상 제한을 포함하는 Bearer 토큰을 발급하는 것이 좋습니다.¶
Bearer 토큰은 페이지 URL(예: 쿼리 문자열 매개변수)에서 전달해서는 안 됩니다. 대신 Bearer 토큰은 기밀성 조치가 적용된 HTTP 메시지 헤더나 메시지 본문에서 전달하는 것이 좋습니다. 브라우저, 웹 서버 및 기타 소프트웨어는 브라우저 기록, 웹 서버 로그 및 기타 데이터 구조의 URL을 충분히 보호하지 않을 수 있습니다. Bearer 토큰이 페이지 URL에서 전달되면 공격자는 기록 데이터, 로그 또는 기타 안전하지 않은 위치에서 이를 훔칠 수 있습니다.¶
액세스 토큰과 연결된 권한은 특정 애플리케이션 또는 사용 사례에 필요한 최소한으로 제한하는 것이 좋습니다. 이렇게 하면 클라이언트가 리소스 소유자가 승인한 권한을 초과하는 것을 방지할 수 있습니다. 또한 사용자가 해당 보안 정책으로 승인된 자신의 권한을 초과하는 것도 방지합니다. 권한 제한은 액세스 토큰 유출의 영향을 줄이는 데에도 도움이 됩니다.¶
특히 액세스 토큰은 특정 리소스
서버(대상 제한), 가급적 하나의 리소스
서버로 제한하는 것이 좋습니다. 이를 적용하기 위해 권한 부여 서버는
액세스 토큰을 특정 리소스 서버와 연결하고, 각 리소스
서버는 모든 요청에서 해당 요청과 함께 전송된 액세스
토큰이 그 특정 리소스 서버에서 사용하도록 의도된 것인지
검증해야 합니다. 그렇지 않으면 리소스 서버는 해당 요청의 처리를
거부해야 합니다. 클라이언트와 권한 부여 서버는
각각 이 문서와 [RFC8707]에 지정된
scope 또는 resource 매개변수를 사용하여
접근하려는 리소스 서버를 결정할 수 있습니다.¶
또한 액세스 토큰은 리소스 서버 또는 리소스의 특정
리소스와 작업으로 제한하는 것이 좋습니다. 이를 적용하기 위해
권한 부여 서버는 액세스 토큰을 해당 리소스 및 작업과
연결하고, 모든 리소스 서버는 모든 요청에서 해당
요청과 함께 전송된 액세스 토큰이 특정 리소스에 대한
특정 작업에 사용하도록 의도된 것인지 검증해야 합니다.
그렇지 않으면 리소스 서버는 해당 요청의 처리를
거부해야 합니다. 클라이언트와 권한 부여 서버는
[RFC9396]에 지정된 scope
및
authorization_details 매개변수를 사용하여
이러한 리소스 및/또는 작업을 결정할 수 있습니다.¶
클라이언트 등록과 자격 증명 수명 주기 관리의 전체 과정에 따라 이는 권한 부여 서버가 특정 클라이언트에 대해 가지는 신뢰 수준에 영향을 줄 수 있습니다.¶
예를 들어 동적으로 등록된 클라이언트의 인증은 클라이언트의 신원을 증명하지 않으며, 권한 부여 서버로 반복해서 보낸 요청이 동일한 클라이언트 인스턴스에서 이루어졌음을 보장할 뿐입니다. 이러한 클라이언트는 요청할 수 있는 범위가 제한될 수 있으며, 토큰 수명이 짧아지는 등 다른 제한이 적용될 수도 있습니다.¶
반대로 개발자의 신원이 검증되고, 계약을 체결했으며 안전한 백엔드 서비스에서만 사용되는 클라이언트 시크릿을 발급받은 등록된 애플리케이션이라면 권한 부여 서버는 이 클라이언트가 더 민감한 범위를 요청하거나 수명이 더 긴 토큰을 발급받도록 허용할 수 있습니다.¶
기밀 클라이언트의 자격 증명이 도난되면 악의적인 클라이언트가 해당 클라이언트를 사칭하여 보호된 리소스에 접근할 수 있습니다.¶
권한 부여 서버는 명시적인 리소스 소유자 인증을 적용하고 리소스 소유자에게 클라이언트와 요청된 권한 범위 및 수명에 관한 정보를 제공하는 것이 좋습니다. 현재 클라이언트의 맥락에서 정보를 검토하고 요청을 승인하거나 거부하는 것은 리소스 소유자의 책임입니다.¶
권한 부여 서버는 클라이언트를 인증하거나 반복 요청이 사칭자가 아니라 원래 클라이언트에서 온 것임을 보장하는 다른 조치에 의존하지 않는 한 반복된 권한 부여 요청을 자동으로(리소스 소유자의 능동적인 상호작용 없이) 처리하지 않는 것이 좋습니다.¶
위에서 설명한 것처럼 권한 부여 서버는 클라이언트의 신원을 보장할 수 있는 경우를 제외하고 사용자 동의나 상호작용 없이 권한 부여 요청을 자동으로 처리하지 않는 것이 좋습니다. 여기에는 사용자가 특정 클라이언트 ID에 대한 권한 부여 요청을 이전에 승인한 경우도 포함됩니다. 클라이언트의 신원을 증명할 수 없다면 이전 요청이 승인되지 않은 것처럼 요청을 처리하는 것이 좋습니다.¶
선언된 https 스킴 리디렉션과 같은 조치는
권한 부여 서버가 신원 증명으로 허용할 수 있습니다.
일부 운영 체제는 적절한 경우 허용할 수 있는
다른 플랫폼별 신원 기능을 제공할 수도 있습니다.¶
클라이언트는 필요한 최소 범위의 액세스 토큰을 요청하는 것이 좋습니다. 권한 부여 서버는 요청된 범위를 어떻게 허용할지 선택할 때 클라이언트의 신원을 고려해야 하며, 요청된 것보다 적은 범위의 액세스 토큰을 발급할 수 있습니다.¶
액세스 토큰과 연결된 권한은 특정 애플리케이션 또는 사용 사례에 필요한 최소한으로 제한하는 것이 좋습니다. 이렇게 하면 클라이언트가 리소스 소유자가 승인한 권한을 초과하는 것을 방지할 수 있습니다. 또한 사용자가 해당 보안 정책으로 승인된 자신의 권한을 초과하는 것도 방지합니다. 권한 제한은 액세스 토큰 유출의 영향을 줄이는 데에도 도움이 됩니다.¶
특히 액세스 토큰은 특정 리소스
서버(대상 제한), 가급적 하나의 리소스
서버로 제한하는 것이 좋습니다. 이를 적용하기 위해 권한 부여 서버는
액세스 토큰을 특정 리소스 서버와 연결하고, 모든 리소스
서버는 모든 요청에서 해당 요청과 함께 전송된 액세스
토큰이 그 특정 리소스 서버에서 사용하도록 의도된 것인지
검증해야 합니다. 그렇지 않으면 리소스 서버는 해당 요청의 처리를
거부해야 합니다. 클라이언트와 권한 부여 서버는
[RFC8707]에 각각 지정된
scope 또는 resource
매개변수를 사용하여 접근하려는
리소스 서버를 결정할 수 있습니다.¶
리소스 서버는 액세스 토큰이 발급된
리소스 소유자의 신원 또는 클라이언트 자격 증명 부여에서의
클라이언트 신원을 기반으로 접근 제어 결정을 내릴 수 있습니다.
두 선택지가 모두 가능한 경우 구현 세부 사항에 따라
클라이언트의 신원이 리소스 소유자의 신원으로
잘못 인식될 수 있습니다. 예를 들어 클라이언트가 권한 부여 서버에 등록할 때
자신의 client_id를 선택할 수 있다면
악의적인 클라이언트가 이를 최종 사용자를 식별하는 값
(예: OpenID Connect를 사용하는 경우 sub 값)으로 설정할 수 있습니다.
리소스 서버가 클라이언트에 발급된 액세스 토큰과
최종 사용자에게 발급된 액세스 토큰을 제대로 구분할 수 없다면
클라이언트가 최종 사용자의 리소스에 접근할 수 있게 될 수 있습니다.¶
권한 부여 서버가 클라이언트 ID와 사용자 식별자에
공통 네임스페이스를 사용하여 리소스 서버가
리소스 소유자가 승인한 액세스 토큰과 클라이언트 자체가 승인한 액세스 토큰을
구분할 수 없게 되는 경우, 권한 부여 서버는
실제 리소스 소유자와 혼동을 일으킬 수 있다면 클라이언트가 자신의 client_id 또는
다른 Claim에 영향을 주도록 허용하지 않는 것이 좋습니다.
이를 피할 수 없는 경우 권한 부여 서버는 리소스 서버가
두 유형의 액세스 토큰을 구분할 수 있는 다른 수단을 제공해야 합니다.¶
중간자 공격과 관련된 위험은 권한 부여 및 토큰 엔드포인트와 통신할 때 [RFC9846]과 같은 채널 보안 메커니즘을 의무적으로 사용함으로써 완화됩니다. 자세한 내용은 1.5절을 참조하십시오.¶
권한 부여 서버는 공격자가 액세스 토큰, 권한 부여 코드, 갱신 토큰, 리소스 소유자 비밀번호 및 클라이언트 자격 증명을 추측하지 못하도록 해야 합니다.¶
공격자가 생성된 토큰(및 최종 사용자가 처리하도록 의도되지 않은 기타 자격 증명)을 추측할 확률은 2^(-128) 이하이어야 하며 2^(-160) 이하인 것이 좋습니다.¶
권한 부여 서버는 최종 사용자 사용을 위한 자격 증명을 보호하기 위해 다른 수단을 사용해야 합니다.¶
이 프로토콜 및 유사한 프로토콜이 널리 배포되면 최종 사용자가 비밀번호 입력을 요구하는 웹사이트로 리디렉션되는 관행에 익숙해질 수 있습니다. 최종 사용자가 자격 증명을 입력하기 전에 이러한 웹사이트의 진위를 주의해서 검증하지 않으면 공격자가 이러한 관행을 악용하여 리소스 소유자의 비밀번호와 OTP와 같은 기타 피싱 가능한 자격 증명을 훔칠 수 있습니다.¶
서비스 제공자는 피싱 공격이 초래하는 위험을 최종 사용자에게 교육하고 사이트의 진위를 쉽게 확인할 수 있는 메커니즘을 제공하도록 노력해야 합니다. 예를 들어 피싱 방지 인증기를 사용할 수 있습니다. 피싱 방지 인증기는 플랫폼이 사이트의 출처를 성공적으로 검증한 경우에만 특정 사이트에 로그인하기 위한 자격 증명을 사용자에게 제공합니다. 클라이언트 개발자는 사용자 에이전트(예: 외부, 내장)와 상호작용하는 방식의 보안 영향과 최종 사용자가 권한 부여 서버의 진위를 검증할 수 있는 능력을 고려하는 것이 좋습니다.¶
권한 부여 서버가 피싱 방지 인증 방법을 배포함에 따라
공격자는 인증 단계 대신 권한 부여 단계를
표적으로 전환할 수 있습니다. 동의 피싱 공격에서는
공격자가 자신이 제어하는 클라이언트를 권한 부여 서버에 등록하고,
피해자의 리소스를 표적으로 하는 scope 값을 가진 권한 부여 요청을
구성한 다음, 생성된 권한 부여 엔드포인트 URL을
피싱 메시지를 통해 피해자에게 전달합니다.
권한 부여 요청은 적법한 권한 부여 서버가 처리하므로
리소스 소유자는 피싱 방지 요소를 포함하여 정상적으로 인증한 후
신뢰할 수 있어 보이는 권한 부여 프롬프트를 보게 됩니다.
리소스 소유자가 요청을 허용하면 공격자는
피해자의 리소스에 대한 접근을 허용하는 권한 부여 코드 또는 액세스 토큰을
받습니다.¶
중요하게도 피싱 방지 인증기는 동의 피싱을 방지하지 못합니다. 리소스 소유자는 적법한 권한 부여 서버에 성공적으로 인증합니다. 공격은 인증 단계가 아니라 그 이후의 동의 단계를 악용합니다.¶
권한 부여 서버는 특정 클라이언트가 요청할 수 있는 범위를 제한하는 것을 포함하여 클라이언트 등록에 대한 제어 적용을 고려하는 것이 좋습니다. 가능한 경우 권한 부여 서버는 민감한 범위에 대한 접근을 허용하기 전에 클라이언트 개발자의 신원을 검증하는 것이 좋습니다.¶
권한 부여 서버는 리소스 소유자가 접근을 허용하기 전에 충분한 정보를 바탕으로 결정할 수 있도록 권한 부여 프롬프트에서 클라이언트 이름, 이를 등록한 개발자 또는 조직, 요청 중인 특정 범위를 포함한 명확하고 의미 있는 정보를 제공하는 것이 좋습니다. 동적 클라이언트 등록 [RFC7591]을 사용하는 경우처럼 클라이언트 사전 등록이 불가능하거나, 클라이언트 ID 메타데이터 문서 [I-D.ietf-oauth-client-id-metadata-document]를 사용하는 경우처럼 외부 당사자가 클라이언트 메타데이터를 제공할 수 있는 상황에서는 권한 부여 서버가 사용자가 자신이 승인하는 클라이언트를 이해하고 있는지 검증하기 위한 추가 조치를 취하는 것이 좋습니다.¶
권한 부여 서버는 관리자와 리소스 소유자가 자신의 리소스에 대한 접근 권한을 부여받은 클라이언트 집합을 확인하고 해당 권한 부여를 취소할 수 있도록 하는 것이 좋습니다 ([RFC7009] 참조). 이를 통해 리소스 소유자가 악의적인 권한 부여 요청을 승인하도록 속은 경우 노출 기간을 제한할 수 있습니다.¶
공격자는 피해자의 장치에 있는 적법한 클라이언트의 리디렉션 URI에 요청을 주입하여, 예를 들어 클라이언트가 공격자가 제어하는 리소스에 접근하도록 할 수 있습니다. 이는 교차 사이트 요청 위조(CSRF)로 알려진 공격의 변형입니다.¶
전통적인 대응책은 클라이언트가 설명된 대로
리디렉션 URI에 대한 요청을 사용자 에이전트 세션에 연결하는
state 매개변수에 CSRF 토큰이라고도 하는 임의의 값을 전달하는 것입니다.
이 대응책은 5.3.5절의
[RFC6819]에 자세히 설명되어 있습니다.
code_verifier 매개변수 또는
OpenID Connect nonce 값도 동일한 보호를 제공합니다.¶
CSRF 보호를 위해 state 또는
nonce 대신 code_verifier를 사용할 때는
다음 사항에 유의해야 합니다.¶
클라이언트는 AS가 클라이언트가 사용하려는
code_challenge_method를 지원하는지 확인해야 합니다.
권한 부여 서버가 요청된 방법을 지원하지 않는 경우
대신 state 또는 nonce를 CSRF 보호에 사용해야 합니다.¶
state가 애플리케이션 상태를 전달하는 데 사용되고
그 내용의 무결성이 중요한 경우 클라이언트는
state를 변조 및 교체로부터 보호해야 합니다.
이는 state의 내용을 브라우저 세션에 결부하거나
서명/암호화된 state 값 [I-D.bradley-oauth-jwt-encoded-state]을
사용하여 달성할 수 있습니다.¶
따라서 AS는 [RFC8414]에 따른 AS 메타데이터를 통해 또는 지원 여부를 보장하거나 확인할 수 있는 배포별 방법을 제공하여 지원하는 코드 챌린지 방법을 감지할 수 있는 방법을 제공해야 합니다.¶
4.4.1.9절의 [RFC6819]에 설명된 대로 권한 부여 요청은 사용자 인터페이스 재구성이라고도 하는 클릭재킹 공격에 취약합니다. 이러한 공격에서 공격자는 권한 부여 엔드포인트 사용자 인터페이스를 무해해 보이는 맥락에 삽입합니다. 사용자는 예를 들어 버튼을 클릭하면서 해당 맥락과 상호작용한다고 생각하지만 실제로는 실수로 권한 부여 엔드포인트 사용자 인터페이스와 상호작용합니다. 반대 상황도 가능합니다. 사용자가 권한 부여 엔드포인트와 상호작용한다고 생각하지만 원래 사용자 인터페이스 위에 겹쳐진 공격자가 제공한 입력 필드에 실수로 비밀번호를 입력할 수 있습니다. 클릭재킹 공격은 사용자가 거의 알아차릴 수 없도록 설계될 수 있으며, 예를 들어 다른 요소 위에 거의 보이지 않는 iframe을 겹쳐 놓을 수 있습니다.¶
공격자는 이 공격 경로를 이용하여 사용자의 인증 자격 증명을 얻거나 클라이언트에 부여된 접근 범위를 변경하고, 잠재적으로 사용자의 리소스에 접근할 수 있습니다.¶
권한 부여 서버는 클릭재킹 공격을 방지해야 합니다.
[RFC6819]에는
X-Frame-Options HTTP 응답 헤더 필드와 프레임 차단
JavaScript 사용을 포함한 여러 대응책이 설명되어 있습니다. 그에 더해 권한 부여 서버는
콘텐츠 보안 정책(CSP) 레벨 2 [CSP-2] 이상도 사용하는 것이
좋습니다.¶
효과를 얻으려면 CSP를 권한 부여 엔드포인트 및 해당하는 경우 사용자를 인증하고 클라이언트에 권한을 부여하는 데 사용되는 다른 엔드포인트(예: 장치 권한 부여 엔드포인트, 로그인 페이지, 오류 페이지 등)에도 사용해야 합니다. 이렇게 하면 CSP를 지원하는 사용자 에이전트에서 권한이 없는 출처가 프레임을 구성하는 것을 방지할 수 있습니다. 클라이언트는 자신의 리디렉션 엔드포인트에 사용되는 출처 이외의 일부 출처가 자신을 프레임으로 포함하도록 허용할 수 있습니다. 이러한 이유로 권한 부여 서버는 관리자가 특정 클라이언트에 허용되는 출처를 구성하고/하거나 클라이언트가 이를 동적으로 등록할 수 있도록 하는 것이 좋습니다.¶
CSP를 사용하면 권한 부여 서버는 하나의 응답 헤더 필드에
여러 출처를 지정하고 유연한 패턴으로 이를 제한할 수 있습니다
(자세한 내용은 [CSP-2] 참조).
이 표준의 레벨 2는 프레임의 출처를 제한하는 정책
(frame-ancestors 사용)과 HTML 페이지에서 실행할 수 있는
스크립트의 소스를 제한하는 정책(script-src 사용)을 함께 사용하여
클릭재킹을 방지하는 강력한 메커니즘을 제공합니다.
이러한 정책의 비규범적 예는 다음 목록에 나와 있습니다.¶
HTTP/1.1 200 OK Content-Security-Policy: frame-ancestors https://ext.example.org:8000 Content-Security-Policy: script-src 'self' X-Frame-Options: ALLOW-FROM https://ext.example.org:8000 ...¶
일부 사용자 에이전트는 [CSP-2]를 지원하지 않으므로, 권한 부여 서버가 이러한 레거시 사용자 에이전트를 명시적으로 지원하지 않는 경우를 제외하고 이 기법을 [RFC6819]에 설명된 것을 포함한 다른 기법과 함께 사용하는 것이 좋습니다. 그러한 경우에도 추가적인 대응책을 사용하는 것이 좋습니다.¶
주입 공격은 입력 또는 기타 외부 변수가 애플리케이션에서 정제되지 않은 채 사용되어 애플리케이션 로직을 변경하는 경우 발생합니다. 이를 통해 공격자가 애플리케이션 장치나 그 데이터에 접근하거나 서비스 거부를 유발하거나 광범위한 악의적인 부작용을 일으킬 수 있습니다.¶
권한 부여 서버와 클라이언트는 수신한 매개변수를
잠재적으로 악의적인 외부 입력으로 취급하고 적절한 보호 조치를 적용해야 하며,
특히 state 및 redirect_uri 매개변수 값에 주의해야 합니다.¶
오픈 리디렉터는 쿼리 매개변수에서 얻은 임의의 URI로 사용자의 브라우저를 전달하는 엔드포인트입니다. 이러한 엔드포인트는 예를 들어 사용자를 외부 웹사이트로 리디렉션하기 전에 메시지를 표시하거나, 로그인 프롬프트 등으로 중단되기 전에 사용자가 방문하려던 URL로 사용자를 다시 리디렉션하기 위해 구현되기도 합니다.¶
AS 또는 클라이언트에 오픈 리디렉터가 있으면 다음 공격이 발생할 수 있습니다.¶
클라이언트는 오픈 리디렉터를 노출해서는 안 됩니다. 공격자는 오픈 리디렉터를 사용하여 클라이언트를 가리키는 URL을 만들고 4.1.1절의 [RFC9700]에 설명된 대로 권한 부여 코드를 유출하는 데 이를 이용할 수 있습니다. 또 다른 악용 사례는 클라이언트를 가리키는 것처럼 보이는 URL을 만드는 것입니다. 이는 사용자가 URL을 신뢰하고 브라우저에서 따라가도록 속일 수 있습니다. 이를 피싱에 악용할 수 있습니다.¶
오픈 리디렉션을 방지하기 위해 클라이언트는 대상 URL이 허용 목록에 있거나 요청의 출처와 무결성을 인증할 수 있는 경우에만 리디렉션하는 것이 좋습니다. 오픈 리디렉션에 대한 대응책은 OWASP [owasp_redir]에 설명되어 있습니다.¶
로드 밸런서를 사용하는 경우를 포함한 일부 배포에서는 리소스 서버에 대한 TLS 연결이 실제 리소스를 제공하는 서버에 도달하기 전에 종료됩니다. 이로 인해 TLS 연결이 종료되는 프런트엔드 서버와 리소스를 제공하는 백엔드 서버 사이에서 토큰이 보호되지 않을 수 있습니다. 이러한 배포에서는 프런트엔드와 백엔드 서버 사이에서 액세스 토큰의 기밀성을 보장하기 위한 충분한 조치를 사용해야 하며, 토큰 암호화는 가능한 조치 중 하나입니다.¶
Mix-Up은 OAuth 클라이언트가 둘 이상의 권한 부여 서버와 상호작용하고 그중 하나 이상의 권한 부여 서버가 공격자의 제어 아래 있는 시나리오에 대한 공격입니다. 예를 들어 공격자가 동적 등록을 사용하여 자신의 권한 부여 서버에 클라이언트를 등록하거나 권한 부여 서버가 침해된 경우에 발생할 수 있습니다.¶
OAuth 클라이언트가 하나의 권한 부여 서버와만 상호작용할 수 있는 경우 Mix-Up 방어는 필요하지 않습니다. 그러나 OAuth 클라이언트가 둘 이상의 권한 부여 서버와 상호작용하는 시나리오에서는 클라이언트가 Mix-Up 공격을 방지해야 합니다. 다음에서는 두 가지 서로 다른 방법을 설명합니다.¶
두 방어 모두에서 클라이언트는 각 권한 부여 요청마다 권한 부여 요청을 보낸 발급자를 저장하고, 이 정보를 사용자 에이전트에 결부하며, 권한 부여 응답이 올바른 발급자에게서 수신되었는지 확인해야 합니다. 클라이언트는 해당하는 경우 후속 액세스 토큰 요청도 동일한 발급자에게 전송되도록 해야 합니다. 발급자는 관련 메타데이터를 통해 흐름에서 사용할 권한 부여 엔드포인트와 토큰 엔드포인트의 조합을 나타내는 추상 식별자 역할을 합니다. 예를 들어 OAuth 2.0 권한 부여 서버 메타데이터 [RFC8414]와 OpenID Connect Discovery [OpenID.Discovery]를 모두 사용하지 않아 발급자 식별자를 사용할 수 없는 경우, 이 튜플의 다른 고유 식별자 또는 튜플 자체를 대신 사용할 수 있습니다. 설명의 간결성을 위해 다음에서는 이러한 배포별 식별자도 발급자 (또는 발급자 식별자)에 포함하여 설명합니다.¶
참고: 권한 부여 서버 URL만 저장하는 것으로는 Mix-Up 공격을 식별하기에 충분하지 않습니다. 공격자는 침해되지 않은 AS의 권한 부여 엔드포인트 URL을 "자신의" AS URL이라고 선언하면서 자신이 제어하는 토큰 엔드포인트를 선언할 수 있습니다.¶
여러 유형의 Mix-Up 공격에 대한 자세한 설명은 4.4절의 [RFC9700]을 참조하십시오.¶
이 방어에서는 클라이언트가 권한 부여 서버가 권한 부여 응답에서 클라이언트에 보내는 발급자 식별자 값을 비교해야 합니다. 권한 부여 응답을 받을 때 클라이언트는 수신한 발급자 식별자를 저장된 발급자 식별자와 비교해야 합니다. 일치하지 않으면 클라이언트는 상호작용을 중단해야 합니다.¶
이 발급자 식별자를 클라이언트에 전달하는 방법에는 여러 가지가 있습니다.¶
OpenID Connect를 사용하고 ID 토큰이
권한 부여 응답에 반환되는 경우 클라이언트는
ID 토큰의 iss claim을 평가할 수 있습니다.¶
두 경우 모두 iss 값은
[RFC9207]에 따라 평가해야 합니다.¶
이 방어에서는 발급자 정보를 전달하기 위해 추가 매개변수를 사용해야 할 수 있지만, Mix-Up에 대한 강력하고 비교적 단순한 방어입니다.¶
이 방어에서 클라이언트는 상호작용하는 각 발급자마다 서로 다른 리디렉션 URI를 사용해야 합니다.¶
클라이언트는 발급자별 서로 다른 리디렉션 URI를 권한 부여 응답이 수신된 URI와 비교하여 권한 부여 응답이 올바른 발급자에게서 수신되었는지 확인해야 합니다. 일치하지 않으면 클라이언트는 흐름을 중단해야 합니다.¶
이 방어는 기존 OAuth 기능을 기반으로 하지만, 여러 다른 발급자를 사용하기 위해 클라이언트를 한 번만 등록하는 시나리오(일부 오픈 뱅킹 스킴 등)에서는 사용할 수 없으며 클라이언트 등록과 긴밀히 통합되어 있어 자동으로 배포하기가 더 어렵습니다.¶
또한 공격자는 클라이언트가 공격자의 AS에 할당한 리디렉션 URI를 사용하여 "정직한" AS에 새 클라이언트를 등록함으로써 이 방어가 제공하는 보호를 우회할 수 있습니다. 그런 다음 공격자는 위에 설명된 공격을 실행하면서 클라이언트 ID를 새로 만든 클라이언트의 클라이언트 ID로 바꿀 수 있습니다.¶
따라서 이 방어는 다른 선택지가 없는 경우에만 사용하는 것이 좋습니다.¶
네이티브 애플리케이션은 리소스 소유자가 사용하는 장치에 설치되어 실행되는 클라이언트입니다(즉, 데스크톱 애플리케이션 또는 네이티브 모바일 애플리케이션). 네이티브 애플리케이션은 보안, 플랫폼 기능 및 전체 최종 사용자 경험과 관련하여 특별한 고려가 필요합니다.¶
이 절의 지침은 주로 데스크톱 앱보다는 네이티브 모바일 앱의 맥락에 맞춰져 있습니다. 여기에서 설명하는 OAuth 흐름과 관련하여 앱 개발자에게 제공되는 기능 측면에서 네이티브 모바일 플랫폼이 데스크톱 플랫폼보다 더 성숙했기 때문입니다. 지침은 주로 모바일 앱에 초점을 맞추지만 대부분의 내용은 일반적으로 데스크톱 앱에도 적용할 수 있습니다.¶
권한 부여 엔드포인트에서는 클라이언트와 리소스 소유자의 사용자 에이전트 간 상호작용이 필요합니다. 현행 최선 관행은 OAuth 권한 부여 요청을 내장 사용자 에이전트(예: web-view로 구현된 것) 대신 외부 사용자 에이전트(일반적으로 브라우저)에서 수행하는 것입니다.¶
네이티브 애플리케이션은 각각 다른 보안 특성을 가진 여러 방법으로 권한 부여 서버의 응답을 수신할 수 있습니다. 예를 들어 운영 체제에 등록되어 클라이언트를 처리기로 호출하는 "앱이 선언한 URL" 또는 사용자 정의 URL 스킴을 사용하는 리디렉션 URI, 자격 증명의 수동 복사 및 붙여넣기, 로컬 웹 서버 실행, 사용자 에이전트 확장 설치, 또는 클라이언트가 제어하는 서버 호스팅 리소스를 식별하는 리디렉션 URI를 제공한 뒤 그 리소스가 네이티브 애플리케이션에서 응답을 사용할 수 있도록 하는 방법 등이 있습니다.¶
이전에는 네이티브 앱이 OAuth 권한 부여 요청에 내장 사용자 에이전트(일반적으로 web-view로 구현됨)를 사용하는 것이 일반적이었습니다. 이 접근법에는 호스트 앱이 사용자 자격 증명과 쿠키를 복사할 수 있고 사용자가 각 앱에서 처음부터 다시 인증해야 하는 등 여러 단점이 있습니다. OAuth에 내장 사용자 에이전트를 사용할 때의 단점에 대한 자세한 분석은 8.5.1절을 참조하십시오.¶
시스템 브라우저를 사용하는 네이티브 앱 권한 부여 요청은 더 안전하며 장치의 사용자 인증 상태를 활용할 수 있습니다. 브라우저의 기존 인증 세션을 사용할 수 있으므로 사용자가 새 앱을 사용할 때마다 권한 부여 서버에 인증할 필요가 없어 싱글 사인온을 사용할 수 있습니다 (권한 부여 서버 정책에서 요구하는 경우 제외).¶
네이티브 앱과 브라우저 간 권한 부여 흐름은 OAuth 프로토콜 자체를 변경하지 않고도 지원할 수 있습니다. OAuth 권한 부여 요청과 응답이 이미 URI를 기준으로 정의되어 있기 때문입니다. 여기에는 앱 간 통신에 사용할 수 있는 URI도 포함됩니다. 모든 클라이언트가 기밀 웹 클라이언트라고 가정하는 일부 OAuth 서버 구현은 이 최선 관행을 지원하기 위해 공개 네이티브 앱 클라이언트와 이들이 사용하는 리디렉션 URI 유형을 이해하도록 추가해야 합니다.¶
여러 사용자에게 배포되는 앱의 일부로 정적으로 포함된
비밀 값은 기밀 비밀 값이 아닙니다. 한 사용자가
자신의 사본을 조사하여 공유 비밀 값을 알아낼 수 있기 때문입니다.
이러한 이유로 권한 부여 서버는 공유 비밀 값을 사용한
네이티브 앱 클라이언트의 클라이언트 인증을 요구해서는 안 됩니다.
이는 이미 client_id 요청 매개변수가 제공하는
클라이언트 식별 이상의 가치를 제공하지 않기 때문입니다.¶
네이티브 앱 클라이언트에 정적으로 포함된 공유 비밀 값을 여전히 요구하는 권한 부여 서버는 해당 클라이언트를 공개 클라이언트(2.1절에 정의됨)로 취급해야 하며 비밀 값을 클라이언트 신원의 증명으로 인정해서는 안 됩니다. 추가 조치가 없다면 이러한 클라이언트는 클라이언트 사칭에 취약합니다 (7.3.1절 참조).¶
인스턴스별 자격 증명을 프로비저닝하기 위해 동적 클라이언트 등록 [RFC7591]과 같은 메커니즘을 사용하는 경우를 제외하고 네이티브 앱은 2.1절에 정의된 공개 클라이언트로 분류되며 권한 부여 서버에 그렇게 등록해야 합니다. 권한 부여 서버는 요청을 식별하고 그에 따라 처리할 수 있도록 클라이언트 등록 세부 정보에 클라이언트 유형을 기록해야 합니다.¶
초안 명세 [I-D.ietf-oauth-attestation-based-client-auth]은 네이티브 앱이 권한 부여 서버 또는 리소스 서버에 인증하기 위해 키에 결부된 증명을 얻는 데 사용할 수 있는 메커니즘을 정의합니다. 이를 통해 모바일 앱의 신원에 대해 더 높은 수준의 보장을 제공할 수 있습니다.¶
웹에서 OAuth가 권한 부여 요청을 시작하고 권한 부여 응답을 요청한 웹사이트로 반환하기 위해 URI를 사용하는 것처럼, 네이티브 앱도 URI를 사용하여 장치의 브라우저에서 권한 부여 요청을 시작하고 응답을 요청한 네이티브 앱으로 반환할 수 있습니다.¶
웹에서 OAuth에 사용하는 것과 동일한 방법을 채택하면 싱글 사인온 세션의 사용성 및 별도의 인증 컨텍스트가 제공하는 보안과 같은 웹 환경의 이점을 네이티브 앱 환경에서도 동일하게 얻을 수 있습니다. 동일한 접근법을 재사용하면 특정 플랫폼에 종속되지 않는 표준 기반 웹 흐름에 의존하여 구현 복잡성을 줄이고 상호 운용성을 높일 수도 있습니다.¶
네이티브 앱은 OAuth 권한 부여 요청을 수행할 때 외부 사용자 에이전트를 사용해야 합니다. 이는 브라우저에서 권한 부여 요청을 열고 (8.3절에 자세히 설명됨) 권한 부여 응답을 네이티브 앱으로 다시 반환하는 리디렉션 URI를 사용하여 이루어집니다 (8.4절에 정의됨).¶
내장 사용자 에이전트는 기술적으로 네이티브 앱에 권한을 부여할 수 있는 방법입니다. 이러한 내장 사용자 에이전트는 정의상 권한 부여 서버의 제3자가 사용하기에는 안전하지 않습니다. 내장 사용자 에이전트를 호스팅하는 앱이 앱을 위해 의도된 OAuth 권한 부여뿐 아니라 사용자의 전체 인증 자격 증명에 접근할 수 있기 때문입니다. 또한 일반적으로 운영 체제에 의해 샌드박스 처리되며 웹 출처에 의존하는 WebAuthn과 같은 메커니즘은 비활성화됩니다.¶
일반적인 web-view 기반 내장 사용자 에이전트 구현에서 호스트 애플리케이션은 로그인 폼에 입력되는 모든 키 입력을 기록하여 사용자 이름과 비밀번호를 탈취하고, 사용자 동의를 우회하도록 폼을 자동 제출하며, 세션 쿠키를 복사하여 사용자를 대신한 인증된 작업을 수행할 수 있습니다.¶
권한 부여 서버와 동일한 당사자에 속한 신뢰할 수 있는 앱에서 사용하는 경우에도 내장 사용자 에이전트는 필요한 것보다 더 강력한 자격 증명에 접근할 수 있으므로 최소 권한 원칙을 위반하며 잠재적으로 공격 표면을 증가시킵니다.¶
브라우저에 있는 일반적인 주소 표시줄과 눈에 보이는 인증서 검증 기능이 없는 내장 사용자 에이전트에 자격 증명을 입력하도록 사용자를 유도하면 사용자가 적법한 사이트에 로그인하는지 알 수 없습니다. 실제로 적법한 사이트인 경우에도 사이트를 먼저 검증하지 않고 자격 증명을 입력해도 괜찮다고 사용자를 학습시키게 됩니다.¶
보안 문제 외에도 내장 사용자 에이전트는 다른 앱이나 브라우저와 인증 상태를 공유하지 않으므로 사용자가 모든 권한 부여 요청마다 로그인해야 하며, 이는 일반적으로 더 좋지 않은 사용자 경험으로 간주됩니다.¶
권한 부여 요청을 시작하는 네이티브 앱은 사용자 인터페이스를 상당히 제어할 수 있으며 외부 사용자 에이전트처럼 보이도록 만든 내장 사용자 에이전트인 가짜 외부 사용자 에이전트를 표시할 수 있습니다.¶
모든 정상적인 행위자가 외부 사용자 에이전트를 사용할 때의 장점은 보안 전문가가 악의적인 행위자를 탐지할 수 있다는 것입니다. 외부 사용자 에이전트를 위조하는 행위자는 명백하게 악의적임을 입증할 수 있기 때문입니다. 반대로 정상적인 행위자와 악의적인 행위자가 모두 내장 사용자 에이전트를 사용한다면 악의적인 행위자는 아무것도 위조할 필요가 없으므로 탐지가 더 어려워집니다. 악의적인 앱이 탐지되면 이 정보를 이용하여 악성 코드 검사 소프트웨어에서 앱의 서명을 차단 목록에 올리고, 앱 스토어를 통해 배포된 앱의 경우 제거 조치를 취하는 등 악의적인 앱의 영향과 확산을 줄이는 다른 조치를 취할 수 있습니다.¶
권한 부여 서버는 진정한 외부 사용자 에이전트에서만 사용할 수 있는 인증 요소를 요구함으로써 가짜 외부 사용자 에이전트에 직접 대응할 수도 있습니다.¶
인앱 브라우저 탭을 사용할 때 자신의 보안을 특히 우려하는 사용자는 인앱 브라우저 탭에서 전체 브라우저로 요청을 열고 그곳에서 권한 부여를 완료하는 추가 단계를 수행할 수도 있습니다. 대부분의 인앱 브라우저 탭 패턴 구현은 이러한 기능을 제공합니다.¶
악의적인 앱이 운영 체제에서 https 스킴 URI의
기본 처리기로 자신을 구성할 수 있다면
기본 브라우저를 사용하는 권한 부여 요청을 가로채고
이 신뢰 위치를 악용하여 사용자를 피싱하는 등의
악의적인 목적에 사용할 수 있습니다.¶
이 공격은 OAuth에 한정되지 않습니다. 이러한 방식으로 구성된
악의적인 앱은 네이티브 앱의 OAuth 사용을 넘어
사용자에게 일반적이고 지속적인 위험을 초래합니다.
많은 운영 체제는 http 및 https 스킴 URI의
기본 처리기를 변경할 때 명시적인 사용자 작업을 요구하여
이 문제를 완화합니다.¶
루프백 인터페이스 리디렉션 URI는 http
스킴(즉, TLS 없이)을 사용할 수 있습니다.
HTTP 요청이 장치 밖으로 나가지 않으므로 루프백
인터페이스 리디렉션 URI에서는 이를 허용할 수 있습니다.¶
클라이언트는 권한 부여 요청을 시작할 때만 네트워크 포트를 열고 응답이 반환되면 닫는 것이 좋습니다.¶
클라이언트는 다른 네트워크 행위자의 간섭을 피하기 위해 루프백 네트워크 인터페이스에서만 수신 대기하는 것이 좋습니다.¶
클라이언트는 8.4.2절에 설명된 대로
문자열 localhost 대신 루프백 IP 리터럴을 사용하는 것이 좋습니다.¶
브라우저 기반 앱은 웹 브라우저에서 실행되는 클라이언트로, 일반적으로 JavaScript로 작성되며 "단일 페이지 앱"이라고도 합니다. 이러한 유형의 앱에는 네이티브 앱과 유사한 특별한 보안 고려 사항이 있습니다.¶
TODO: 브라우저 기반 앱 BCP가 최종 확정되면 규범적 텍스트를 가져옵니다.¶
이 초안은 OAuth 2.0 [RFC6749], 네이티브 앱용 OAuth 2.0 [RFC8252], 코드 교환용 증명 키 [RFC7636], 브라우저 기반 앱용 OAuth 2.0 [I-D.ietf-oauth-browser-based-apps], OAuth 보안 현행 최선 관행 [RFC9700], 및 Bearer 토큰 사용 [RFC6750]의 기능을 통합합니다.¶
후속 초안이 원래의 [RFC6749]에 있는 기능을 업데이트하거나 폐기하는 경우, 이 초안의 해당 기능은 후속 초안에 설명된 규범적 변경 사항으로 업데이트되거나 완전히 제거됩니다.¶
OAuth 2.0에서 변경된 사항의 비규범적 목록은 다음과 같습니다.¶
권한 부여 코드 부여는 PKCE [RFC7636]의 기능으로 확장되어 이 명세에 따라 권한 부여 코드 부여를 사용하는 기본 방식에서는 PKCE 매개변수를 추가해야 합니다.¶
암시적 부여(response_type=token)는
2.1.2절의
[RFC9700]에 따라 이 명세에서 제외됩니다.¶
Bearer 토큰 사용에서는 4.3.2절의 [RFC9700]에 따라 URI의 쿼리 문자열에서 Bearer 토큰을 사용하는 방식을 제외합니다.¶
공개 클라이언트의 갱신 토큰은 4.14.2절의 [RFC9700]에 따라 송신자 제한이 적용되거나 일회용이어야 합니다.¶
권한 부여 코드를 포함하는 토큰 엔드포인트 요청에는 더 이상
redirect_uri 매개변수가 포함되지 않습니다.¶
권한 부여 서버는 요청 본문의 클라이언트 자격 증명을 지원해야 합니다.¶
PKCE plain 방법은 제거됩니다.¶
OAuth 2.0 암시적 부여는 [RFC9700]에서 폐기 예정으로 지정되었으므로 OAuth 2.1에서 제외됩니다.¶
암시적 부여를 제거하는 목적은 더 이상 권한 부여 응답에서 액세스 토큰을
발급하지 않는 것입니다. 이러한 토큰은 유출과 주입에 취약하고
클라이언트에 송신자 제한을 적용할 수 없기 때문입니다.
이 동작은 클라이언트가 response_type=token 매개변수를 사용하여 나타냈습니다.
response_type 매개변수의 이 값은 OAuth 2.1에서 더 이상 정의되지 않습니다.¶
response_type=token 제거는 권한 부여 엔드포인트에서
다른 산출물을 반환하는 다른 확장
응답 유형에는 영향을 주지 않습니다. 예를 들어 [OpenID.Connect]에서 정의한 response_type=id_token이
있습니다.¶
OAuth 2.0에서 권한 부여 코드
흐름의 토큰 엔드포인트 요청(4.1.3절의
[RFC6749])에는 선택적
redirect_uri 매개변수가 포함됩니다. 이 매개변수는 권한 부여 코드 주입 공격을
방지하기 위한 것이며, 원래 권한 부여 요청에서 redirect_uri 매개변수가
전송된 경우 필수였습니다. 권한 부여 요청에서는 특정
클라이언트에 여러 리디렉션 URI가 등록된 경우에만
redirect_uri 매개변수가 필요했습니다. 그러나 실제로 많은 권한 부여 서버 구현은
하나만 등록되어 있더라도 권한 부여 요청에
redirect_uri 매개변수를 요구했으며, 그 결과 토큰 엔드포인트에서도
redirect_uri 매개변수가 필요하게 되었습니다.¶
OAuth 2.1에서는
code_challenge와 code_verifier 매개변수로 권한 부여 코드 주입을 방지하므로
토큰 요청에 redirect_uri 매개변수를 포함하는 것은 아무런 목적이 없습니다. 따라서 제거되었습니다.¶
OAuth 2.0과 OAuth 2.1 클라이언트를 모두 지원하려는 권한 부여 서버의
이전 버전 호환성을 위해, 권한 부여 서버는 클라이언트가 토큰 요청(4.1.3절)에
redirect_uri 매개변수를 전송하도록 허용해야 하며, [RFC6749]에 설명된 대로
해당 매개변수를 적용해야 합니다. 권한 부여 서버는 요청의
client_id를 사용하여 이전 OAuth 2.0 동작을 사용할 것으로 알고 있는 특정 클라이언트에
이 동작을 적용할지 결정할 수 있습니다.¶
OAuth 2.1 권고 사항만 따르는 클라이언트는
토큰 요청에 redirect_uri를 전송하지 않으므로, 토큰 요청에서 해당 매개변수를 기대하는
권한 부여 서버와 호환되지 않습니다.¶
이 문서는 어떠한 IANA 조치도 요구하지 않습니다.¶
참조되는 모든 레지스트리는 [RFC6749] 및 이 작업의 기반이 되는 관련 문서에서 정의됩니다. 이 명세에서는 해당 레지스트리를 변경할 필요가 없습니다.¶
이 절에서는 [RFC5234]의 표기법을 사용하여 이 명세에 정의된 요소의 확장 Backus-Naur 형식(ABNF) 구문 설명을 제공합니다. 아래의 ABNF는 Unicode 코드 포인트 [W3C.REC-xml-20081126]를 기준으로 정의되며, 이러한 문자는 일반적으로 UTF-8로 인코딩됩니다. 요소는 처음 정의된 순서대로 제시됩니다.¶
다음 정의 중 일부는 [RFC3986]의 "URI-reference" 정의를 사용합니다.¶
다음 정의 중 일부는 다음 공통 정의를 사용합니다.¶
VSCHAR = %x20-7E NQCHAR = %x21 / %x23-5B / %x5D-7E NQSCHAR = %x20-21 / %x23-5B / %x5D-7E¶
client_id 요소는 2.4.1절에 정의되어 있습니다.¶
client-id = *VSCHAR¶
client_secret 요소는 2.4.1절에 정의되어 있습니다.¶
client-secret = *VSCHAR¶
response_type 요소는 4.1.1절 및 6.4절에 정의되어 있습니다.¶
response-type = response-name *( SP response-name ) response-name = 1*response-char response-char = "_" / DIGIT / ALPHA¶
scope = scope-token *( SP scope-token ) scope-token = 1*NQCHAR¶
error_description 요소는 4.1.2.1절,
3.2.4절 및 5.3절에 정의되어 있습니다.¶
error-description = 1*NQSCHAR¶
grant_type 요소는 3.2.2절에 정의되어 있습니다.¶
grant-type = grant-name / URI-reference grant-name = 1*name-char name-char = "-" / "." / "_" / DIGIT / ALPHA¶
access_token 요소는 3.2.3절에 정의되어 있습니다.¶
access-token = 1*VSCHAR¶
token_type 요소는 3.2.3절 및 6.1절에 정의되어 있습니다.¶
token-type = type-name / URI-reference type-name = 1*name-char name-char = "-" / "." / "_" / DIGIT / ALPHA¶
expires_in 요소는 3.2.3절에 정의되어 있습니다.¶
expires-in = 1*DIGIT¶
새 엔드포인트 매개변수의 구문은 6.2절에 정의되어 있습니다.¶
param-name = 1*name-char name-char = "-" / "." / "_" / DIGIT / ALPHA¶
code_verifier의 ABNF는 다음과 같습니다.¶
code-verifier = 43*128unreserved unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" ALPHA = %x41-5A / %x61-7A DIGIT = %x30-39¶
code_challenge의 ABNF는 다음과 같습니다.¶
code-challenge = 43*128unreserved unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" ALPHA = %x41-5A / %x61-7A DIGIT = %x30-39¶
[RFC6749]가 게시될 당시
application/x-www-form-urlencoded 미디어 유형은
[W3C.REC-html401-19991224]의
17.13.4절에 정의되어 있었지만
IANA MIME 미디어 유형 레지스트리
(http://www.iana.org/assignments/media-types)에는
등록되어 있지 않았습니다.
또한 해당
정의는 US-ASCII 이외의 문자를 고려하지 않으므로 불완전합니다.¶
이 미디어 유형을 사용하여 콘텐츠를 생성할 때 이러한 문제를 해결하기 위해 이름과 값은 먼저 UTF-8 문자 인코딩 스킴 [RFC3629]을 사용하여 인코딩해야 하며, 그 결과로 얻은 옥텟 시퀀스는 [W3C.REC-html401-19991224]에 정의된 이스케이프 규칙을 사용하여 추가로 인코딩해야 합니다.¶
이 미디어 유형을 사용하는 콘텐츠에서 데이터를 파싱할 때 이름/값 인코딩을 역으로 적용하여 얻은 이름과 값은 옥텟 시퀀스로 취급한 후 UTF-8 문자 인코딩 스킴을 사용하여 디코딩해야 합니다.¶
예를 들어 다음 여섯 개의 Unicode 코드 포인트로 구성된 값, (1) U+0020 (공백), (2) U+0025 (퍼센트 기호), (3) U+0026 (앰퍼샌드), (4) U+002B (더하기 기호), (5) U+00A3 (파운드 기호), (6) U+20AC (유로 기호)는 다음 옥텟 시퀀스로 인코딩됩니다(16진수 표기 사용).¶
20 25 26 2B C2 A3 E2 82 AC¶
그런 다음 콘텐츠에서는 다음과 같이 표현됩니다.¶
+%25%26%2B%C2%A3%E2%82%AC¶
이 명세의 다양한 메시지는 아래에 설명된 방법 중 하나를 사용하여 직렬화됩니다. 이 절에서는 이러한 직렬화 방법의 구문을 설명하며, 다른 절에서는 언제 사용할 수 있고 반드시 사용해야 하는지를 설명합니다. 모든 방법을 모든 메시지에 사용할 수 있는 것은 아닙니다.¶
쿼리 문자열 직렬화를 사용하여 매개변수를 직렬화하기 위해 클라이언트는 [WHATWG.URL]에 정의된 application/x-www-form-urlencoded 형식을 사용하여 URL의 쿼리 구성 요소에 매개변수와 값을 추가해 문자열을 구성합니다. 쿼리 문자열 직렬화는 일반적으로 HTTP GET 요청에서 사용됩니다.¶
매개변수와 그 값은 부록 B에 정의된 application/x-www-form-urlencoded 형식을 사용하여 매개변수 이름과 값을 HTTP 요청의 엔터티 본문에 추가함으로써 폼 직렬화됩니다. 폼 직렬화는 일반적으로 HTTP POST 요청에서 사용됩니다.¶
매개변수는 각 매개변수를 최상위 구조에 추가하여 JSON [RFC8259] 객체 구조로 직렬화됩니다. 매개변수 이름과 문자열 값은 JSON 문자열로 표현됩니다. 숫자 값은 JSON 숫자로 표현됩니다. Boolean 값은 JSON Boolean으로 표현됩니다. 생략된 매개변수와 값이 없는 매개변수는 달리 지정되지 않는 한 객체에서 생략하는 것이 좋으며 JSON null 값으로 표현하지 않습니다. 매개변수는 JSON 객체 또는 JSON 배열을 값으로 가질 수 있습니다. 매개변수의 순서는 중요하지 않으며 달라질 수 있습니다.¶
다음은 게시 시점에 잘 정립된 확장 목록입니다.¶
토큰 취소 확장은 클라이언트가 액세스 토큰이 더 이상 필요하지 않음을 권한 부여 서버에 알리는 메커니즘을 정의합니다.¶
동적 클라이언트 등록은 권한 부여 서버에 클라이언트를 프로그래밍 방식으로 등록하는 메커니즘을 제공합니다.¶
토큰 검사 확장은 리소스 서버가 액세스 토큰에 관한 정보를 얻는 메커니즘을 정의합니다.¶
권한 부여 서버 메타데이터(OAuth 검색이라고도 함)는 클라이언트가 권한 부여 및 토큰 엔드포인트의 위치와 지원되는 권한 부여 유형 등 특정 OAuth 서버와 상호작용하는 데 필요한 정보를 조회할 수 있는 엔드포인트를 정의합니다.¶
[RFC8628]: OAuth 2.0 장치 권한 부여¶
장치 권한 부여(이전에는 장치 흐름이라고 함)는 브라우저가 없거나 입력 기능이 제한된 장치가 액세스 토큰을 얻도록 하는 확장입니다. 이는 스마트 TV 앱 또는 스트리밍 비디오 서비스에 비디오를 스트리밍할 수 있는 하드웨어 비디오 인코더와 같은 장치에서 흔히 사용됩니다.¶
상호 TLS는 TLS 인증서 인증을 통해 토큰을 발급받은 클라이언트에 결부하는 메커니즘과 클라이언트 인증 메커니즘을 설명합니다.¶
클라이언트가 요청 중인 액세스 토큰을 어디에서 사용하려는지 권한 부여 서버에 명시적으로 알릴 수 있는 방법을 제공합니다.¶
[RFC9068]: OAuth 2.0 액세스 토큰용 JSON 웹 토큰(JWT) 프로파일¶
이 명세는 JSON 웹 토큰(JWT) 형식으로 OAuth 액세스 토큰을 발급하기 위한 프로파일을 정의합니다.¶
푸시된 권한 부여 요청 확장은 백 채널에서 OAuth 흐름을 시작하여 더 나은 보안과 복잡한 권한 부여 요청을 구성할 때 더 큰 유연성을 제공하는 기법을 설명합니다.¶
권한 부여 응답의 iss 매개변수는
클라이언트에서 Mix-Up 공격을 방지하기 위해 권한 부여 서버의 신원을
나타냅니다.¶
세분화된 권한 부여 요청은 OAuth 권한 부여 요청에서
세밀한 권한 부여 데이터를 전달하는 데 사용하는 새 매개변수
authorization_details를 지정합니다.¶
DPoP는 애플리케이션 계층에서 소유 증명 메커니즘을 통해 OAuth 2.0 토큰에 송신자 제한을 적용하는 메커니즘을 설명합니다.¶
단계 상승 인증은 리소스 서버가 현재 요청의 액세스 토큰과 연결된 인증 이벤트가 자신의 인증 요구 사항을 충족하지 않음을 클라이언트에 알리는 데 사용할 수 있는 메커니즘을 설명합니다.¶
이 명세는 OAuth 작업 그룹의 작업이며, 출발점은 OAuth 2.0 권한 부여 프레임워크(RFC 6749), 네이티브 앱용 OAuth 2.0(RFC 8252), OAuth 보안 현행 최선 관행 및 브라우저 기반 앱용 OAuth 2.0 명세의 내용을 기반으로 했습니다. 편집자들은 이 명세의 기반이 된 해당 명세들을 만드는 데 참여한 모든 분께 감사드립니다.¶
편집자들은 또한 이 명세 버전을 구체화하는 데 도움이 된 아이디어, 피드백, 수정 및 문구를 제공한 다음 분들께 감사드립니다. Andrii Deinega, Bob Hamburg, Brian Campbell, Daniel Fett, Deng Chao, Emelia Smith, Falko, Filip Skokan, Goutam Adwant, Joseph Heenan, Justin Richer, Karsten Meyer zu Selhausen, Michael Jones, Michael Peck, Roberto Polli, Tim Würtele 및 Vittorio Bertocci.¶
이 명세에 관한 논의는 2021년과 2022년의 OAuth 보안 워크숍에서도 이루어졌습니다. 저자들은 협업과 커뮤니티 의견에 도움이 되는 행사를 개최한 워크숍 주최자(Guido Schmitz, Steinar Noem 및 Daniel Fett)에게 감사드립니다.¶
[[ 최종 명세에서 제거 예정 ]]¶
-16¶
PKCE plain 방법 제거¶
권한 부여 엔드포인트 정의 절에서 PAR 언급¶
OAuth 동의 피싱에 관한 보안 고려 사항 절 추가¶
AS가 iss 응답 매개변수를 반드시 전송하도록 변경
(클라이언트가 여전히 Mix-Up 완화 방법을 선택하도록 함)¶
값의 길이에 관한 내용을 새로운 "값 크기" 절로 통합¶
권한 부여 엔드포인트 오류 응답 동작 명확화¶
-15¶
JWT 클라이언트 인증에 관한 추가 맥락을 추가하고 특히 RFC7523bis를 권장¶
편집상 명확화 및 업데이트¶
권한 부여 엔드포인트와 토큰 엔드포인트의 오류 응답 명확화¶
AS 오픈 리디렉션 고려 사항에 대해 RFC9700의 문구와 동기화¶
RFC6750 정오표 3500 및 6613 적용¶
반복된 매개변수에 관한 모호성 해결¶
-14¶
편집상 명확화¶
"relying party"와 "resource server"가 잘못 사용된 한 사례 수정¶
RFC7591의 client_secret_post 및
client_secret_basic 용어 참조 추가¶
"sanitize" 문구를 신뢰할 수 없는 입력으로 취급하는 문구로 대체¶
네이티브 앱 지침이 주로 모바일 앱 플랫폼에 적용됨을 명확화¶
AS가 공개 또는 기밀 클라이언트를 특정하게 지원해야 한다는 요구 사항이 없음을 명확화¶
-13¶
-12¶
OpenID Federation 및 개방형 생태계에서 사용하는 방식과 같은 대체 등록 방법을 더 잘 반영하도록 클라이언트 등록 관련 문구 업데이트¶
확장 부록에 DPoP 및 단계 상승 인증 추가¶
인증 스킴의 대소문자 비구분에 대한 참조를 ABNF 대신 HTTP로 업데이트¶
"relying party"와 "client"가 잘못 사용된 한 사례 수정¶
client_id 요구 사항을 개별 권한 부여 유형으로 이동¶
직렬화 방법 설명을 부록으로 통합¶
-11¶
Bearer가 대소문자를 구분하지 않음을 명시적으로 언급¶
알려진 범위와 충돌하는 사용자 정의 범위를 정의하지 않도록 권고¶
HTTP Basic 인증 인코딩 상호 운용성 문제를 피하기 위해 요청 본문의 클라이언트 자격 증명 지원을 필수로 변경¶
-10¶
클라이언트 ID가 불투명한 문자열임을 명확화¶
확장에서 리소스 요청에 추가 오류 코드를 정의할 수 있음¶
오류 필드 정의 형식 개선¶
"scope" 정의를 서론 절로 이동하고 확장¶
액세스 토큰 절을 구조와 요청으로 분리¶
RFC7235와의 일관성을 위해 b64token을 token68로 이름 변경¶
application/x-www-form-urlencoded에 관한 이전 부록 B의 내용 복원¶
클라이언트가 액세스 토큰을 파싱해서는 안 됨을 명확화¶
권한 부여 요청에서 redirect_uri 매개변수가 필요한 경우에 관한 내용 확장¶
일관성을 위해 갱신 토큰 절의 "permissions"를 "privileges"로 변경¶
권한 부여 코드 흐름 보안 고려 사항 통합¶
권한 부여 코드 재사용 명확화 - 하나의 권한 부여 코드는 액세스 토큰을 한 번만 얻을 수 있음¶
-09¶
AS는 권한 부여 엔드포인트에서 CORS 요청을 지원해서는 안 됨¶
비대칭 클라이언트 인증에 관한 세부 내용 추가¶
보안 BCP의 CSRF 설명과 동기화¶
송신자 제한 액세스 토큰 절 업데이트 및 이동¶
리소스 소유자를 사칭하는 클라이언트 절을 보안 BCP와 동기화¶
리디렉션 URI 등록 절에서 권한 부여 요청 참조 추가¶
갱신 토큰 교체 절을 보안 BCP와 동기화¶
리디렉션 URI 일치 문구를 보안 BCP와 동기화¶
RAR(RFC9396) 참조 업데이트¶
URI 관련 명확화¶
토큰 요청에서 redirect_uri 제거¶
code_verifier 관련 보안 고려 사항 확장¶
서론 절 개정¶
-08¶
감사의 글 업데이트¶
클라이언트 ID 정의에서 "by a trusted party"를 "by an outside party"로 교체¶
"verify the identity of the resource owner"를 "authenticate"로 교체¶
RFC6819와 일치하도록 갱신 토큰 교체 명확화¶
application/x-www-form-urlencoded 예제를 담는 부록 추가¶
부록 항목 참조 수정¶
보안 BCP의 새로운 "AS를 통한 피싱" 절 반영¶
클라이언트 인증의 동기에 관한 설명을 다시 작성¶
OAuth 2.0과 일치하도록 토큰 요청의 "scope" 매개변수를 특정 권한 부여 유형으로 이동¶
최신 보안 BCP 버전에서 클릭재킹 및 오픈 리디렉션 설명 업데이트¶
권한 부여 코드 보안 고려 사항 절에서 규범적 요구 사항 이동¶
보안 고려 사항 명확화 및 중복 절 제거¶
-07¶
초록에서 "third party" 제거¶
서론에 MFA와 비밀번호 없는 인증을 추가적인 동기로 추가¶
리디렉션 URI 등록이 이루어질 수 있는 한 방법으로 PAR 언급¶
토큰 엔드포인트에 CORS 헤더가 필요하다는 참조 추가¶
OMAP 확장 참조 업데이트¶
시퀀스 다이어그램 번호 수정¶
-06¶
"credentialed client" 용어 제거¶
"confidential" 및 "public" 클라이언트 정의 단순화¶
RFC9207을 참조하는 iss 응답 매개변수 반영¶
RS의 액세스 토큰 검증 절 추가¶
권한 부여 서버가 네이티브 앱의 세 가지 리디렉션 방법을 모두 지원해야 한다는 요구 사항 제거¶
일부 참조 수정¶
HTTP 참조를 RFC 9110으로 업데이트¶
"authorization grant" 용어 명확화¶
클라이언트 자격 증명 부여 사용 명확화¶
권한 부여 코드 다이어그램 정리¶
application/x-www-form-urlencoded 참조를 업데이트하고 IANA 레지스트리에 없다는 오래된 참고 사항 제거¶
-05¶
암시적 흐름 제거에 관한 절 추가¶
많은 규범적 요구 사항을 보안 고려 사항에서 적절한 본문 절로 이동¶
TLS 관련 문구 재구성 및 통합¶
localhost/사용자 정의 URL 스킴을 제외한 리디렉션 URI에 TLS 요구¶
보안 BCP와 일치하도록 갱신 토큰 지침 업데이트¶
-04¶
URI 쿼리 문자열에서 액세스 토큰을 전송하지 말아야 함을 명시적으로 언급¶
클라이언트 유형 정의 명확화¶
루프백과 localhost 관련 내용 통합¶
문서 전반의 편집상 명확화¶
-03¶
4절에서 모든 권한 부여 유형을 동일한 최상위 헤더 아래 모으도록 리팩터링¶
규범적 텍스트와 보안 고려 사항 텍스트를 적절한 위치로 더 잘 분리하여, 실제로 보안 고려 사항인 텍스트를 문서 본문에서 보안 고려 사항 절로 이동하는 동시에 보안 고려 사항 절의 규범적 요구 사항을 본문의 적절한 부분으로 이동¶
RFC6749에 게시된 여러 정오표 반영¶
다양한 RFC 참조 업데이트¶
문서 전반의 편집상 명확화¶
-02¶
-01¶
-00¶
초기 개정판¶