다음을 통해 공유


OAuth 2.0 코드 부여 흐름을 사용하여 Azure Active Directory 웹 애플리케이션에 대한 액세스 권한 부여

경고

이 콘텐츠는 이전 Azure AD v1.0 엔드포인트용입니다. 새 프로젝트에 Microsoft ID 플랫폼 사용합니다.

비고

어떤 리소스를 호출할지 서버에 알리지 않으면 서버는 해당 리소스에 대한 조건부 액세스 정책을 트리거하지 않습니다. 따라서 MFA 트리거를 사용하려면 URL에 리소스를 포함해야 합니다.

Azure AD(Azure Active Directory)는 OAuth 2.0을 사용하여 Azure AD 테넌트에서 웹 애플리케이션 및 웹 API에 대한 액세스 권한을 부여할 수 있습니다. 이 가이드는 언어 독립적이며 오픈 소스 라이브러리를 사용하지 않고 HTTP 메시지를 보내고 받는 방법을 설명합니다.

OAuth 2.0 인증 코드 흐름은 OAuth 2.0 사양의 섹션 4.1에서 설명합니다. 웹앱 및 고유하게 설치된 앱을 포함하여 대부분의 애플리케이션 유형에서 인증 및 권한 부여를 수행하는 데 사용됩니다.

AD 테넌트에 애플리케이션 등록

먼저 Azure AD(Azure Active Directory) 테넌트에 애플리케이션을 등록합니다. 이렇게 하면 애플리케이션에 대한 애플리케이션 ID를 제공할 뿐만 아니라 토큰을 받을 수 있습니다.

  1. Azure Portal에 로그인합니다.

  2. 페이지의 오른쪽 위 모서리에서 계정을 선택한 다음 디렉터리 전환 탐색을 선택한 다음 적절한 테넌트를 선택하여 Azure AD 테넌트를 선택합니다.

    • 계정에 Azure AD 테넌트가 하나만 있거나 적절한 Azure AD 테넌트를 이미 선택한 경우 이 단계를 건너뜁니다.
  3. Azure Portal에서 Azure Active Directory를 검색하고 선택합니다.

  4. Azure Active Directory 왼쪽 메뉴에서 앱 등록을 선택한 다음 새 등록을 선택합니다.

  5. 프롬프트에 따라 새 애플리케이션을 만듭니다. 이 자습서의 웹 애플리케이션 또는 공용 클라이언트(모바일 및 데스크톱) 애플리케이션인지는 중요하지 않지만 웹 애플리케이션 또는 퍼블릭 클라이언트 애플리케이션에 대한 특정 예제를 원하는 경우 빠른 시작을 확인하세요.

    • 이름은 애플리케이션 이름이며 최종 사용자에게 애플리케이션을 설명합니다.
    • 지원되는 계정 유형 아래에서 모든 조직 디렉터리의 계정 및 개인 Microsoft 계정을 선택합니다.
    • 리디렉션 URI를 제공합니다. 웹 애플리케이션의 경우 사용자가 로그인할 수 있는 앱의 기본 URL입니다. 예: http://localhost:12345. 공용 클라이언트(모바일 및 데스크톱)의 경우 Azure AD는 이를 사용하여 토큰 응답을 반환합니다. 애플리케이션과 관련된 값을 입력합니다. 예: http://MyFirstAADApp.
  6. 등록을 완료하면 Azure AD는 애플리케이션에 고유한 클라이언트 식별자( 애플리케이션 ID)를 할당합니다. 다음 섹션에서 이 값이 필요하므로 애플리케이션 페이지에서 복사합니다.

  7. Azure Portal에서 애플리케이션을 찾으려면 앱 등록을 선택한 다음 , 모든 애플리케이션 보기를 선택합니다.

OAuth 2.0 권한 부여 흐름

높은 수준에서 애플리케이션에 대한 전체 권한 부여 흐름은 다음과 같이 표시됩니다.

OAuth 인증 코드 흐름

인증 코드 요청

인증 코드 흐름은 클라이언트가 사용자를 /authorize 엔드포인트로 보내는 것으로 시작됩니다. 이 요청에서 클라이언트는 사용자로부터 획득해야 하는 권한을 나타냅니다. Azure Portal에서 앱 등록 > 엔드포인트를 선택하여 테넌트에 대한 OAuth 2.0 권한 부여 엔드포인트를 가져올 수 있습니다.

// Line breaks for legibility only

https://login.microsoftonline.com/{tenant}/oauth2/authorize?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&response_type=code
&redirect_uri=http%3A%2F%2Flocalhost%3A12345
&response_mode=query
&resource=https%3A%2F%2Fservice.contoso.com%2F
&state=12345
매개 변수 유형 설명
테넌트 필수 요청의 경로에 있는 {tenant} 값을 사용하여 애플리케이션에 로그인할 수 있는 사용자를 제어할 수 있습니다. 허용되는 값은 테넌트 식별자이며, 예를 들어 테넌트에 독립적인 토큰의 경우 8eaef023-2b34-4da1-9baa-8bc8c9d6a490 또는 contoso.onmicrosoft.com 또는 common입니다.
클라이언트_아이디 필수 Azure AD에 등록할 때 앱에 할당된 애플리케이션 ID입니다. Azure Portal에서 찾을 수 있습니다. 서비스 사이드바에서 Azure Active Directory 를 클릭하고 앱 등록을 클릭한 다음 애플리케이션을 선택합니다.
응답 유형 필수 인증 코드 흐름에 대한 code를 포함해야 합니다.
redirect_uri 권장 앱의 redirect_uri는 인증 응답을 보내고 받을 수 있는 주소입니다. URL로 인코딩되어야 한다는 점을 제외하고 포털에 등록한 redirect_uris 중 하나와 정확히 일치해야 합니다. 네이티브 및 모바일 앱의 경우 기본값 https://login.microsoftonline.com/common/oauth2/nativeclient을 사용해야 합니다.
응답 모드 선택 사항 결과 토큰을 앱으로 다시 보내는 데 사용해야 하는 메서드를 지정합니다. query, fragment 또는 form_post일 수 있습니다. query 는 리디렉션 URI에서 코드를 쿼리 문자열 매개 변수로 제공합니다. 암시적 흐름을 사용하여 ID 토큰을 요청하는 경우 OpenID 사양에 지정된 대로 query를 사용할 수 없습니다. 코드만 요청하는 경우 query, fragment, 또는 form_post를 사용할 수 있습니다. form_post는 리디렉션 URI에 대한 코드가 포함된 POST를 실행합니다. 기본값은 query 코드 흐름에 대한 것입니다.
권장 토큰 응답에도 반환되는 요청에 포함된 값입니다. 일반적으로 교차 사이트 요청 위조 공격을 방지하기 위해 임의로 생성된 고유 값이 사용됩니다. 또한 state는 인증 요청이 발생하기 전에 앱에서 사용자 상태에 대한 정보(예: 페이지 또는 보기)를 인코딩하는 데 사용됩니다.
자원 권장 대상 웹 API(보안 리소스)의 앱 ID URI입니다. 앱 ID URI를 찾으려면 Azure Portal에서 Azure Active Directory를 클릭하고 애플리케이션 등록을 클릭한 다음 애플리케이션의 설정 페이지를 연 다음 속성을 클릭합니다. 다음과 같은 https://graph.microsoft.com외부 리소스일 수도 있습니다. 권한 부여 또는 토큰 요청 중 하나에서 필요합니다. 인증 프롬프트 수를 줄이려면 인증 요청에 배치하여 사용자로부터 동의를 받도록 합니다.
범위 무시 v1 Azure AD 앱의 경우 애플리케이션 설정, 필수 권한 아래의 Azure Portal에서 범위를 정적으로 구성해야 합니다.
프롬프트 선택 사항 필요한 사용자 상호 작용 유형을 나타냅니다.

유효한 값은 다음과 같습니다.

로그인: 사용자에게 다시 인증하라는 메시지가 표시됩니다.

select_account: 사용자에게 계정을 선택하라는 메시지가 표시되어 Single Sign-On이 중단됩니다. 사용자는 기존 로그인 계정을 선택하거나, 기억된 계정에 대한 자격 증명을 입력하거나, 다른 계정을 모두 사용하도록 선택할 수 있습니다.

동의: 사용자 동의가 부여되었지만 업데이트해야 합니다. 사용자에게 동의하라는 메시지가 표시됩니다.

admin_consent: 관리자에게 조직의 모든 사용자를 대신하여 동의하라는 메시지가 표시되어야 합니다.

로그인 힌트 선택 사항 사용자 이름을 미리 알고 있는 경우 사용자 로그인 페이지의 사용자 이름/이메일 주소 필드를 미리 채우는 데 사용할 수 있습니다. 앱은 preferred_username 클레임을 사용하여 이전 로그인에서 사용자 이름을 이미 추출한 상태에서, 재인증하는 동안 이 매개 변수를 자주 사용합니다.
domain_hint (도메인 힌트) 선택 사항 사용자가 로그인하는 데 사용해야 하는 테넌트 또는 도메인에 대한 힌트를 제공합니다. domain_hint 값은 테넌트에 등록된 도메인입니다. 테넌트가 온-프레미스 디렉터리에 페더레이션되면 AAD는 지정된 테넌트 페더레이션 서버로 리디렉션됩니다.
코드_챌린지_메서드 권장 code_verifier 매개 변수에 대한 code_challenge를 인코딩하는 데 사용되는 메서드입니다. 또는 . 중 plainS256하나일 수 있습니다. 제외할 경우 code_challenge가 포함되면 code_challenge가 일반 텍스트로 간주됩니다. Azure AAD v1.0은 둘 다 plain 지원합니다 S256. 자세한 내용은 PKCE RFC를 참조하세요.
코드 챌린지 권장 네이티브 또는 퍼블릭 클라이언트에서 PKCE(코드 교환용 증명 키)를 통해 권한 부여 코드 부여를 보호하는 데 사용됩니다. code_challenge_method가 포함되면 필수입니다. 자세한 내용은 PKCE RFC를 참조하세요.

비고

사용자가 조직의 일부인 경우 조직의 관리자는 사용자를 대신하여 동의하거나 거절하거나 사용자가 동의하도록 허용할 수 있습니다. 사용자에게는 관리자가 허용하는 경우에만 동의할 수 있는 옵션이 제공됩니다.

이 시점에서 사용자에게 자격 증명을 입력하고 Azure Portal에서 앱이 요청한 권한에 동의하라는 메시지가 표시됩니다. 사용자가 인증하고 동의를 부여하면 Azure AD는 코드와 함께 요청의 redirect_uri 주소에서 앱에 응답을 보냅니다.

성공적인 응답

성공적인 응답은 다음과 같습니다.

GET  HTTP/1.1 302 Found
Location: http://localhost:12345/?code= AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrqqf_ZT_p5uEAEJJ_nZ3UmphWygRNy2C3jJ239gV_DBnZ2syeg95Ki-374WHUP-i3yIhv5i-7KU2CEoPXwURQp6IVYMw-DjAOzn7C3JCu5wpngXmbZKtJdWmiBzHpcO2aICJPu1KvJrDLDP20chJBXzVYJtkfjviLNNW7l7Y3ydcHDsBRKZc3GuMQanmcghXPyoDg41g8XbwPudVh7uCmUponBQpIhbuffFP_tbV8SNzsPoFz9CLpBCZagJVXeqWoYMPe2dSsPiLO9Alf_YIe5zpi-zY4C3aLw5g9at35eZTfNd0gBRpR5ojkMIcZZ6IgAA&session_state=7B29111D-C220-4263-99AB-6F6E135D75EF&state=D79E5777-702E-4260-9A62-37F75FF22CCE
매개 변수 설명
관리자 동의 관리자가 동의 요청 프롬프트에 동의한 경우 값은 True입니다.
코드 애플리케이션이 요청한 권한 부여 코드입니다. 애플리케이션은 권한 부여 코드를 사용하여 대상 리소스에 대한 액세스 토큰을 요청할 수 있습니다.
세션 상태 현재 사용자 세션을 식별하는 고유 값입니다. 이 값은 GUID이지만 검사 없이 전달되는 불투명 값으로 처리되어야 합니다.
state 매개 변수가 요청에 포함된 경우 동일한 값이 응답에 표시됩니다. 애플리케이션은 응답을 사용하기 전에 요청 및 응답의 상태 값이 동일한지 확인하는 것이 좋습니다. 이렇게 하면 클라이언트에 대한 CSRF(사이트 간 요청 위조) 공격을 검색할 수 있습니다 .

오류 응답

오류 응답은 redirect_uri에 보내져서 애플리케이션에서 적절하게 처리할 수 있습니다.

GET http://localhost:12345/?
error=access_denied
&error_description=the+user+canceled+the+authentication
매개 변수 설명
오류 OAuth 2.0 권한 부여 프레임워크의 섹션 5.2에 정의된 오류 코드 값입니다. 다음 표에서는 Azure AD가 반환하는 오류 코드에 대해 설명합니다.
오류 설명 오류에 대한 자세한 설명입니다. 이 메시지는 최종 사용자에게 친숙하지 않습니다.
상태 값은 요청에서 전송되고 CSRF(교차 사이트 요청 위조) 공격을 방지하기 위해 응답에 반환되는 임의로 생성된 재사용되지 않는 값입니다.

권한 부여 엔드포인트 오류에 대한 오류 코드

다음 테이블은 오류 응답의 error 매개 변수에 반환될 수 있는 여러 오류 코드를 설명합니다.

오류 코드 설명 클라이언트 작업
잘못된_요청 프로토콜 오류(예: 필수 매개 변수 누락). 요청을 수정하여 다시 제출하십시오. 이는 개발 오류이며 일반적으로 초기 테스트 중에 catch됩니다.
승인되지 않은 클라이언트 클라이언트 애플리케이션은 권한 부여 코드를 요청할 수 없습니다. 이는 일반적으로 클라이언트 애플리케이션이 Azure AD에 등록되지 않았거나 사용자의 Azure AD 테넌트에 추가되지 않은 경우에 발생합니다. 애플리케이션은 사용자에게 애플리케이션을 설치하고 Azure AD에 추가하라는 명령을 표시할 수 있습니다.
액세스 거부 리소스 소유자가 동의 거부 클라이언트 애플리케이션은 사용자가 동의하지 않는 한 계속 진행할 수 없음을 사용자에게 알릴 수 있습니다.
지원되지 않는 응답 유형 권한 부여 서버는 요청의 응답 유형을 지원하지 않습니다. 요청을 수정하여 다시 제출하십시오. 이는 개발 오류이며 일반적으로 초기 테스트 중에 catch됩니다.
서버 오류 서버에 예기치 않은 오류가 발생했습니다. 요청을 재시도합니다. 이러한 오류는 일시적인 상태 때문에 발생할 수 있습니다. 클라이언트 애플리케이션은 사용자에게 일시적인 오류로 인해 응답이 지연되었음을 설명할 수 있습니다.
일시적으로 이용 불가능 서버가 일시적으로 사용량이 많아 요청을 처리할 수 없습니다. 요청을 재시도합니다. 클라이언트 애플리케이션은 임시 조건으로 인해 응답이 지연되었음을 사용자에게 설명할 수 있습니다.
잘못된_리소스 대상 리소스가 없거나, Azure AD에서 찾을 수 없거나, 올바르게 구성되지 않았기 때문에 유효하지 않습니다. 이는 리소스가 존재하는 경우 테넌트에 구성되지 않음을 나타냅니다. 애플리케이션은 사용자에게 애플리케이션을 설치하고 Azure AD에 추가하라는 명령을 표시할 수 있습니다.

권한 부여 코드를 사용하여 액세스 토큰 요청

이제 권한 부여 코드를 받았고 사용자로부터 권한을 받았으므로, /token 엔드포인트에 POST 요청을 전송하여 원하는 리소스에 대한 액세스 토큰으로 권한 부여 코드를 교환할 수 있습니다.

// Line breaks for legibility only

POST /{tenant}/oauth2/token HTTP/1.1
Host: https://login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&client_id=2d4d11a2-f814-46a7-890a-274a72a7309e
&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrqqf_ZT_p5uEAEJJ_nZ3UmphWygRNy2C3jJ239gV_DBnZ2syeg95Ki-374WHUP-i3yIhv5i-7KU2CEoPXwURQp6IVYMw-DjAOzn7C3JCu5wpngXmbZKtJdWmiBzHpcO2aICJPu1KvJrDLDP20chJBXzVYJtkfjviLNNW7l7Y3ydcHDsBRKZc3GuMQanmcghXPyoDg41g8XbwPudVh7uCmUponBQpIhbuffFP_tbV8SNzsPoFz9CLpBCZagJVXeqWoYMPe2dSsPiLO9Alf_YIe5zpi-zY4C3aLw5g9at35eZTfNd0gBRpR5ojkMIcZZ6IgAA
&redirect_uri=https%3A%2F%2Flocalhost%3A12345
&resource=https%3A%2F%2Fservice.contoso.com%2F
&client_secret=p@ssw0rd

//NOTE: client_secret only required for web apps
매개 변수 유형 설명
테넌트 필수 요청의 경로에 있는 {tenant} 값을 사용하여 애플리케이션에 로그인할 수 있는 사용자를 제어할 수 있습니다. 허용되는 값은 테넌트 식별자이며, 예를 들어 테넌트에 독립적인 토큰의 경우 8eaef023-2b34-4da1-9baa-8bc8c9d6a490 또는 contoso.onmicrosoft.com 또는 common입니다.
클라이언트_아이디 필수 Azure AD에 등록할 때 앱에 할당된 애플리케이션 ID입니다. Azure Portal에서 찾을 수 있습니다. 애플리케이션 ID는 앱 등록 설정에 표시됩니다.
인증 유형 필수 인증 코드 흐름에 대한 authorization_code 여야 합니다.
코드 필수 authorization_code 이전 섹션에서 획득한 항목
리디렉트_유알아이 필수 redirect_uri 클라이언트 애플리케이션에 A가 등록되었습니다.
클라이언트 비밀번호 공용 클라이언트에는 허용되지 않는 웹앱에 필요 아래의 앱에 대한 Azure Portal에서 만든 애플리케이션 비밀입니다. client_secrets 디바이스에 안정적으로 저장할 수 없으므로 네이티브 앱(공용 클라이언트)에서 사용할 수 없습니다. 서버 쪽에서 안전하게 저장할 client_secret 수 있는 웹앱 및 웹 API(모든 기밀 클라이언트)에 필요합니다. client_secret 보내기 전에 URL로 인코딩되어야 합니다.
자원 권장 대상 웹 API(보안 리소스)의 앱 ID URI입니다. 앱 ID URI를 찾으려면 Azure Portal에서 Azure Active Directory를 클릭하고 애플리케이션 등록을 클릭한 다음 애플리케이션의 설정 페이지를 연 다음 속성을 클릭합니다. 다음과 같은 https://graph.microsoft.com외부 리소스일 수도 있습니다. 권한 부여 또는 토큰 요청 중 하나에서 필요합니다. 인증 프롬프트 수를 줄이려면 인증 요청에 배치하여 사용자로부터 동의를 받도록 합니다. 권한 부여 요청과 토큰 요청 모두에서 리소스의 매개 변수가 일치해야 합니다.
코드_검증자 선택 사항 승인 코드를 얻기 위해 사용된 것과 동일한 코드 검증기. PKCE를 인증 코드 부여 요청에 사용한 경우에 필요합니다. 자세한 내용은 PKCE RFC를 참조하세요.

앱 ID URI를 찾으려면 Azure Portal에서 Azure Active Directory를 클릭하고 애플리케이션 등록을 클릭한 다음 애플리케이션의 설정 페이지를 연 다음 속성을 클릭합니다.

성공적인 응답

Azure AD는 성공적인 응답 시 액세스 토큰 을 반환합니다. 클라이언트 애플리케이션 및 관련 대기 시간의 네트워크 호출을 최소화하기 위해 클라이언트 애플리케이션은 OAuth 2.0 응답에 지정된 토큰 수명에 대한 액세스 토큰을 캐시해야 합니다. 토큰 수명을 결정하려면 expires_in 또는 expires_on 매개 변수 값을 사용합니다.

웹 API 리소스가 오류 코드를 반환 invalid_token 하는 경우 리소스가 토큰이 만료되었음을 확인했음을 나타낼 수 있습니다. 클라이언트 및 리소스 클록 시간이 다른 경우("시간 기울이기"라고 함) 리소스는 토큰이 클라이언트 캐시에서 지워지기 전에 토큰이 만료된 것으로 간주할 수 있습니다. 이 경우 계산된 수명 내에 있는 경우에도 캐시에서 토큰을 지웁니다.

성공적인 응답은 다음과 같습니다.

{
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1THdqcHdBSk9NOW4tQSJ9.eyJhdWQiOiJodHRwczovL3NlcnZpY2UuY29udG9zby5jb20vIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvN2ZlODE0NDctZGE1Ny00Mzg1LWJlY2ItNmRlNTdmMjE0NzdlLyIsImlhdCI6MTM4ODQ0MDg2MywibmJmIjoxMzg4NDQwODYzLCJleHAiOjEzODg0NDQ3NjMsInZlciI6IjEuMCIsInRpZCI6IjdmZTgxNDQ3LWRhNTctNDM4NS1iZWNiLTZkZTU3ZjIxNDc3ZSIsIm9pZCI6IjY4Mzg5YWUyLTYyZmEtNGIxOC05MWZlLTUzZGQxMDlkNzRmNSIsInVwbiI6ImZyYW5rbUBjb250b3NvLmNvbSIsInVuaXF1ZV9uYW1lIjoiZnJhbmttQGNvbnRvc28uY29tIiwic3ViIjoiZGVOcUlqOUlPRTlQV0pXYkhzZnRYdDJFYWJQVmwwQ2o4UUFtZWZSTFY5OCIsImZhbWlseV9uYW1lIjoiTWlsbGVyIiwiZ2l2ZW5fbmFtZSI6IkZyYW5rIiwiYXBwaWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctODkwYS0yNzRhNzJhNzMwOWUiLCJhcHBpZGFjciI6IjAiLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJhY3IiOiIxIn0.JZw8jC0gptZxVC-7l5sFkdnJgP3_tRjeQEPgUn28XctVe3QqmheLZw7QVZDPCyGycDWBaqy7FLpSekET_BftDkewRhyHk9FW_KeEz0ch2c3i08NGNDbr6XYGVayNuSesYk5Aw_p3ICRlUV1bqEwk-Jkzs9EEkQg4hbefqJS6yS1HoV_2EsEhpd_wCQpxK89WPs3hLYZETRJtG5kvCCEOvSHXmDE6eTHGTnEgsIk--UlPe275Dvou4gEAwLofhLDQbMSjnlV5VLsjimNBVcSRFShoxmQwBJR_b2011Y5IuD6St5zPnzruBbZYkGNurQK63TJPWmRd3mbJsGM0mf3CUQ",
  "token_type": "Bearer",
  "expires_in": "3600",
  "expires_on": "1388444763",
  "resource": "https://service.contoso.com/",
  "refresh_token": "AwABAAAAvPM1KaPlrEqdFSBzjqfTGAMxZGUTdM0t4B4rTfgV29ghDOHRc2B-C_hHeJaJICqjZ3mY2b_YNqmf9SoAylD1PycGCB90xzZeEDg6oBzOIPfYsbDWNf621pKo2Q3GGTHYlmNfwoc-OlrxK69hkha2CF12azM_NYhgO668yfcUl4VBbiSHZyd1NVZG5QTIOcbObu3qnLutbpadZGAxqjIbMkQ2bQS09fTrjMBtDE3D6kSMIodpCecoANon9b0LATkpitimVCrl-NyfN3oyG4ZCWu18M9-vEou4Sq-1oMDzExgAf61noxzkNiaTecM-Ve5cq6wHqYQjfV9DOz4lbceuYCAA",
  "scope": "https%3A%2F%2Fgraph.microsoft.com%2Fmail.read",
  "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctODkwYS0yNzRhNzJhNzMwOWUiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC83ZmU4MTQ0Ny1kYTU3LTQzODUtYmVjYi02ZGU1N2YyMTQ3N2UvIiwiaWF0IjoxMzg4NDQwODYzLCJuYmYiOjEzODg0NDA4NjMsImV4cCI6MTM4ODQ0NDc2MywidmVyIjoiMS4wIiwidGlkIjoiN2ZlODE0NDctZGE1Ny00Mzg1LWJlY2ItNmRlNTdmMjE0NzdlIiwib2lkIjoiNjgzODlhZTItNjJmYS00YjE4LTkxZmUtNTNkZDEwOWQ3NGY1IiwidXBuIjoiZnJhbmttQGNvbnRvc28uY29tIiwidW5pcXVlX25hbWUiOiJmcmFua21AY29udG9zby5jb20iLCJzdWIiOiJKV3ZZZENXUGhobHBTMVpzZjd5WVV4U2hVd3RVbTV5elBtd18talgzZkhZIiwiZmFtaWx5X25hbWUiOiJNaWxsZXIiLCJnaXZlbl9uYW1lIjoiRnJhbmsifQ."
}

매개 변수 설명
액세스 토큰 (access_token) 요청된 액세스 토큰입니다. 이 문자열은 불투명 문자열입니다. 리소스가 수신해야 하는 항목에 따라 달라지며 클라이언트가 살펴볼 수 없습니다. 앱에서 이 토큰을 사용하여 보안 리소스(예: 웹 API)를 인증할 수 있습니다.
토큰 유형 토큰 형식 값을 나타냅니다. Azure AD에서 지원하는 유일한 형식은 Bearer입니다. 전달자 토큰에 대한 자세한 내용은 OAuth2.0 권한 부여 프레임워크: 전달자 토큰 사용량(RFC 6750)을 참조하세요.
만료 시간 액세스 토큰의 유효 기간(초)입니다.
만료일 액세스 토큰이 만료되는 시간입니다. 날짜는 만료 시간까지 1970-01-01T0:0:0Z UTC의 초 수로 표시됩니다. 이 값은 캐시된 토큰의 수명을 결정하는 데 사용됩니다.
자원 웹 API(보안 리소스)의 앱 ID URI입니다.
범위 클라이언트 애플리케이션에 부여된 사칭 권한 기본 권한은 .입니다 user_impersonation. 보안 리소스의 소유자는 Azure AD에 추가 값을 등록할 수 있습니다.
새로고침_토큰 OAuth 2.0 새로 고침 토큰입니다. 앱은 현재 액세스 토큰이 만료된 후 이 토큰을 사용하여 추가 액세스 토큰을 획득할 수 있습니다. 새로 고침 토큰은 수명이 길며, 오랜 시간 동안 리소스에 대한 액세스를 유지하는 데 사용할 수 있습니다.
id_token (아이디 토큰) ID 토큰을 나타내는 서명되지 않은 JWT(JSON Web Token)입니다. 앱은 이 토큰의 세그먼트를 base64Url로 디코딩하여 로그인한 사용자에 대한 정보를 요청할 수 있습니다. 앱은 값을 캐시하고 표시할 수 있지만 권한 부여 또는 보안 경계에 의존해서는 안 됩니다.

JSON 웹 토큰에 대한 자세한 내용은 JWT IETF 초안 사양을 참조하세요. 자세한 id_tokens내용은 v1.0 OpenID Connect 흐름을 참조하세요.

오류 응답

토큰 발급 엔드포인트 오류는 클라이언트가 토큰 발급 엔드포인트를 직접 호출하기 때문에 HTTP 오류 코드입니다. HTTP 상태 코드 외에도 Azure AD 토큰 발급 엔드포인트는 오류를 설명하는 개체가 있는 JSON 문서를 반환합니다.

샘플 오류 응답은 다음과 같습니다.

{
  "error": "invalid_grant",
  "error_description": "AADSTS70002: Error validating credentials. AADSTS70008: The provided authorization code or refresh token is expired. Send a new interactive authorization request for this user and resource.\r\nTrace ID: 3939d04c-d7ba-42bf-9cb7-1e5854cdce9e\r\nCorrelation ID: a8125194-2dc8-4078-90ba-7b6592a7f231\r\nTimestamp: 2016-04-11 18:00:12Z",
  "error_codes": [
    70002,
    70008
  ],
  "timestamp": "2016-04-11 18:00:12Z",
  "trace_id": "3939d04c-d7ba-42bf-9cb7-1e5854cdce9e",
  "correlation_id": "a8125194-2dc8-4078-90ba-7b6592a7f231"
}
매개 변수 설명
오류 발생하는 오류 유형을 분류하는 데 사용할 수 있고 오류에 대응하는 데 사용할 수 있는 오류 코드 문자열입니다.
오류 설명 개발자가 인증 오류의 근본 원인을 식별하도록 도울 수 있는 특정 오류 메시지입니다.
오류 코드 진단에 도움이 될 수 있는 STS 특정 오류 코드의 목록입니다.
시간표시 오류가 발생한 시간입니다.
추적_아이디 (trace_id) 진단에 도움이 될 수 있는 요청에 대한 고유 식별자입니다.
correlation_id 여러 구성 요소에서 진단에 도움이 될 수 있는 요청에 대한 고유 식별자입니다.

HTTP 상태 코드

다음 표에서는 토큰 발급 엔드포인트가 반환하는 HTTP 상태 코드를 나열합니다. 경우에 따라 오류 코드는 응답을 설명하기에 충분하지만 오류가 있는 경우 함께 제공되는 JSON 문서를 구문 분석하고 해당 오류 코드를 검사해야 합니다.

HTTP 코드 설명
400 기본 HTTP 코드입니다. 대부분의 경우에 사용되며 보통 잘못된 형식의 요청 때문입니다. 요청을 수정하여 다시 제출하십시오.
401 인증에 실패했습니다. 예를 들어 요청에 client_secret 매개 변수가 없습니다.
403 권한 부여에 실패했습니다. 예를 들어 사용자에게 리소스에 액세스할 수 있는 권한이 없습니다.
500 서비스에서 내부 오류가 발생했습니다. 요청을 재시도합니다.

토큰 엔드포인트 오류에 대한 오류 코드

오류 코드 설명 클라이언트 작업
잘못된_요청 프로토콜 오류(예: 필수 매개 변수 누락). 요청 수정 및 다시 제출
유효하지 않은 권한 부여 권한 부여 코드가 잘못되었거나 만료되었습니다. 엔드포인트에 대한 새 요청 /authorize 시도
승인되지 않은 클라이언트 인증된 클라이언트는 이 권한 부여 유형을 사용할 권한이 없습니다. 이는 일반적으로 클라이언트 애플리케이션이 Azure AD에 등록되지 않았거나 사용자의 Azure AD 테넌트에 추가되지 않은 경우에 발생합니다. 애플리케이션은 사용자에게 애플리케이션을 설치하고 Azure AD에 추가하라는 명령을 표시할 수 있습니다.
잘못된_클라이언트 클라이언트 인증에 실패했습니다. 클라이언트 자격 증명이 잘못되었습니다. 이를 해결하기 위해 애플리케이션 관리자는 자격 증명을 업데이트합니다.
지원되지 않는 인증 유형 권한 부여 서버는 권한 부여 유형을 지원하지 않습니다. 요청에서 권한 부여 유형을 변경하십시오. 이 유형의 오류는 개발 중에만 발생하며 초기 테스트 중에 검색됩니다.
잘못된_리소스 대상 리소스가 없거나, Azure AD에서 찾을 수 없거나, 올바르게 구성되지 않았기 때문에 유효하지 않습니다. 이는 리소스가 존재하는 경우 테넌트에 구성되지 않음을 나타냅니다. 애플리케이션은 사용자에게 애플리케이션을 설치하고 Azure AD에 추가하라는 명령을 표시할 수 있습니다.
상호작용 필요 요청을 위해 사용자 상호 작용이 필요합니다. 예를 들어 추가 인증 단계가 필요합니다. 비대화형 요청 대신 동일한 리소스에 대한 대화형 권한 부여 요청을 사용하여 다시 시도합니다.
일시적으로 이용 불가능 서버가 일시적으로 사용량이 많아 요청을 처리할 수 없습니다. 요청을 재시도합니다. 클라이언트 애플리케이션은 임시 조건으로 인해 응답이 지연되었음을 사용자에게 설명할 수 있습니다.

액세스 토큰을 사용하여 리소스 액세스

이제 토큰을 access_token성공적으로 획득했으므로 헤더에 포함하여 Web API에 대한 요청에서 토큰을 Authorization 사용할 수 있습니다. RFC 6750 사양은 HTTP 요청에서 전달자 토큰을 사용하여 보호된 리소스에 액세스하는 방법을 설명합니다.

샘플 요청

GET /data HTTP/1.1
Host: service.contoso.com
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1THdqcHdBSk9NOW4tQSJ9.eyJhdWQiOiJodHRwczovL3NlcnZpY2UuY29udG9zby5jb20vIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvN2ZlODE0NDctZGE1Ny00Mzg1LWJlY2ItNmRlNTdmMjE0NzdlLyIsImlhdCI6MTM4ODQ0MDg2MywibmJmIjoxMzg4NDQwODYzLCJleHAiOjEzODg0NDQ3NjMsInZlciI6IjEuMCIsInRpZCI6IjdmZTgxNDQ3LWRhNTctNDM4NS1iZWNiLTZkZTU3ZjIxNDc3ZSIsIm9pZCI6IjY4Mzg5YWUyLTYyZmEtNGIxOC05MWZlLTUzZGQxMDlkNzRmNSIsInVwbiI6ImZyYW5rbUBjb250b3NvLmNvbSIsInVuaXF1ZV9uYW1lIjoiZnJhbmttQGNvbnRvc28uY29tIiwic3ViIjoiZGVOcUlqOUlPRTlQV0pXYkhzZnRYdDJFYWJQVmwwQ2o4UUFtZWZSTFY5OCIsImZhbWlseV9uYW1lIjoiTWlsbGVyIiwiZ2l2ZW5fbmFtZSI6IkZyYW5rIiwiYXBwaWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctODkwYS0yNzRhNzJhNzMwOWUiLCJhcHBpZGFjciI6IjAiLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJhY3IiOiIxIn0.JZw8jC0gptZxVC-7l5sFkdnJgP3_tRjeQEPgUn28XctVe3QqmheLZw7QVZDPCyGycDWBaqy7FLpSekET_BftDkewRhyHk9FW_KeEz0ch2c3i08NGNDbr6XYGVayNuSesYk5Aw_p3ICRlUV1bqEwk-Jkzs9EEkQg4hbefqJS6yS1HoV_2EsEhpd_wCQpxK89WPs3hLYZETRJtG5kvCCEOvSHXmDE6eTHGTnEgsIk--UlPe275Dvou4gEAwLofhLDQbMSjnlV5VLsjimNBVcSRFShoxmQwBJR_b2011Y5IuD6St5zPnzruBbZYkGNurQK63TJPWmRd3mbJsGM0mf3CUQ

오류 응답

RFC 6750을 구현하는 보안 리소스는 HTTP 상태 코드를 발급합니다. 요청에 인증 자격 증명이 포함되지 않거나 토큰이 누락된 경우 응답에 헤더가 WWW-Authenticate 포함됩니다. 요청이 실패하면 리소스 서버는 HTTP 상태 코드 및 오류 코드로 응답합니다.

다음은 클라이언트 요청에 전달자 토큰이 포함되지 않은 경우 실패한 응답의 예입니다.

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer authorization_uri="https://login.microsoftonline.com/contoso.com/oauth2/authorize",  error="invalid_token",  error_description="The access token is missing.",

오류 매개 변수

매개 변수 설명
인증 URI 권한 부여 서버의 URI(실제 엔드포인트)입니다. 이 값은 검색 엔드포인트에서 서버에 대한 자세한 정보를 가져오기 위해 조회 키로도 사용됩니다.

클라이언트는 권한 부여 서버가 신뢰할 수 있는지 확인해야 합니다. 리소스가 Azure AD로 보호되는 경우 URL이 Azure AD에서 https://login.microsoftonline.com 지원하는 다른 호스트 이름으로 시작하는지 확인하는 것으로 충분합니다. 테넌트별 리소스는 항상 테넌트별 권한 부여 URI를 반환해야 합니다.

오류 OAuth 2.0 권한 부여 프레임워크의 섹션 5.2에 정의된 오류 코드 값입니다.
오류 설명 오류에 대한 자세한 설명입니다. 이 메시지는 최종 사용자에게 친숙하지 않습니다.
리소스_ID 리소스의 고유 식별자를 반환합니다. 클라이언트 애플리케이션은 리소스에 대한 토큰을 요청할 때 이 식별자를 매개 변수 값 resource 으로 사용할 수 있습니다.

클라이언트 애플리케이션에서 이 값을 확인하는 것이 중요합니다. 그렇지 않으면 악의적인 서비스가 권한 상승 공격을 유도할 수 있습니다.

공격을 방지하기 위한 권장 전략은 액세스되는 웹 API URL의 기준과 일치하는지 확인하는 resource_id 것입니다. 예를 들어 https://service.contoso.com/data에 접근하는 경우 resource_id은/는 https://service.contoso.com/가 될 수 있습니다. ID를 확인하는 신뢰할 수 있는 resource_id 대체 방법이 없는 한 클라이언트 애플리케이션은 기본 URL로 시작되지 않는 것을 거부해야 합니다.

전달자 체계 오류 코드

RFC 6750 사양은 응답에서 WWW-Authenticate 헤더 및 전달자 체계를 사용하는 리소스에 대해 다음 오류를 정의합니다.

HTTP 상태 코드 오류 코드 설명 클라이언트 작업
400 잘못된_요청 요청의 형식이 잘못되었습니다. 예를 들어 매개 변수가 없거나 동일한 매개 변수를 두 번 사용할 수 있습니다. 오류를 수정하고 요청을 다시 시도합니다. 이 유형의 오류는 개발 중에만 발생하며 초기 테스트에서 검색되어야 합니다.
401 유효하지 않은 토큰 액세스 토큰이 없거나, 잘못되었거나, 해지되었습니다. error_description 매개 변수의 값은 추가 세부 정보를 제공합니다. 권한 부여 서버에서 새 토큰을 요청합니다. 새 토큰이 실패하면 예기치 않은 오류가 발생합니다. 사용자에게 오류 메시지를 보내고 임의 지연 후 다시 시도합니다.
403 범위가 충분하지 않음 액세스 토큰에는 리소스에 액세스하는 데 필요한 가장 권한이 포함되어 있지 않습니다. 권한 부여 엔드포인트에 새 권한 부여 요청을 보냅니다. 응답에 범위 매개 변수가 포함된 경우 리소스에 대한 요청의 범위 값을 사용합니다.
403 접근 불충분 토큰의 주체에는 리소스에 액세스하는 데 필요한 권한이 없습니다. 사용자에게 다른 계정을 사용하거나 지정된 리소스에 대한 권한을 요청하라는 메시지를 표시합니다.

액세스 토큰 새로 고침

액세스 토큰은 수명이 짧으며 만료된 후에 새로 고쳐야 리소스에 계속 액세스할 수 있습니다. access_token을 새로 고치려면 POST 요청을 /token 엔드포인트에 제출해야 하며, 이번에는 code 대신 refresh_token를 제공해야 합니다. 새로 고침 토큰은 클라이언트가 이미 액세스에 동의한 모든 리소스에 유효하므로 요청에 resource=https://graph.microsoft.com 대해 발급된 새로 고침 토큰을 사용하여 새 액세스 토큰을 resource=https://contoso.com/api요청할 수 있습니다.

새로 고침 토큰에는 지정된 수명이 없습니다. 일반적으로 새로 고침 토큰의 수명은 비교적 깁니다. 그러나 경우에 따라 새로 고침 토큰이 만료되거나, 해지되거나, 원하는 작업에 대한 충분한 권한이 없습니다. 애플리케이션은 토큰 발급 엔드포인트에서 반환하는 오류를 예상하고 정확히 처리해야 합니다.

새로 고침 토큰 오류가 있는 응답을 받으면 현재 새로 고침 토큰을 삭제하고 새 권한 부여 코드 또는 액세스 토큰을 요청합니다. 특히 권한 부여 코드 부여 흐름에서 새로 고침 토큰을 사용하는 경우 오류 코드와 invalid_grant 함께 interaction_required 응답을 받으면 새로 고침 토큰을 삭제하고 새 권한 부여 코드를 요청합니다.

새로 고침 토큰을 사용하여 새 액세스 토큰을 가져오는 테넌트별 엔드포인트에 대한 샘플 요청( 공통 엔드포인트를 사용할 수도 있습니다)은 다음과 같습니다.

// Line breaks for legibility only

POST /{tenant}/oauth2/token HTTP/1.1
Host: https://login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&refresh_token=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq...
&grant_type=refresh_token
&resource=https%3A%2F%2Fservice.contoso.com%2F
&client_secret=JqQX2PNo9bpM0uEihUPzyrh    // NOTE: Only required for web apps

성공적인 응답

성공적인 토큰 응답은 다음과 같습니다.

{
  "token_type": "Bearer",
  "expires_in": "3600",
  "expires_on": "1460404526",
  "resource": "https://service.contoso.com/",
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1THdqcHdBSk9NOW4tQSJ9.eyJhdWQiOiJodHRwczovL3NlcnZpY2UuY29udG9zby5jb20vIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvN2ZlODE0NDctZGE1Ny00Mzg1LWJlY2ItNmRlNTdmMjE0NzdlLyIsImlhdCI6MTM4ODQ0MDg2MywibmJmIjoxMzg4NDQwODYzLCJleHAiOjEzODg0NDQ3NjMsInZlciI6IjEuMCIsInRpZCI6IjdmZTgxNDQ3LWRhNTctNDM4NS1iZWNiLTZkZTU3ZjIxNDc3ZSIsIm9pZCI6IjY4Mzg5YWUyLTYyZmEtNGIxOC05MWZlLTUzZGQxMDlkNzRmNSIsInVwbiI6ImZyYW5rbUBjb250b3NvLmNvbSIsInVuaXF1ZV9uYW1lIjoiZnJhbmttQGNvbnRvc28uY29tIiwic3ViIjoiZGVOcUlqOUlPRTlQV0pXYkhzZnRYdDJFYWJQVmwwQ2o4UUFtZWZSTFY5OCIsImZhbWlseV9uYW1lIjoiTWlsbGVyIiwiZ2l2ZW5fbmFtZSI6IkZyYW5rIiwiYXBwaWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctODkwYS0yNzRhNzJhNzMwOWUiLCJhcHBpZGFjciI6IjAiLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJhY3IiOiIxIn0.JZw8jC0gptZxVC-7l5sFkdnJgP3_tRjeQEPgUn28XctVe3QqmheLZw7QVZDPCyGycDWBaqy7FLpSekET_BftDkewRhyHk9FW_KeEz0ch2c3i08NGNDbr6XYGVayNuSesYk5Aw_p3ICRlUV1bqEwk-Jkzs9EEkQg4hbefqJS6yS1HoV_2EsEhpd_wCQpxK89WPs3hLYZETRJtG5kvCCEOvSHXmDE6eTHGTnEgsIk--UlPe275Dvou4gEAwLofhLDQbMSjnlV5VLsjimNBVcSRFShoxmQwBJR_b2011Y5IuD6St5zPnzruBbZYkGNurQK63TJPWmRd3mbJsGM0mf3CUQ",
  "refresh_token": "AwABAAAAv YNqmf9SoAylD1PycGCB90xzZeEDg6oBzOIPfYsbDWNf621pKo2Q3GGTHYlmNfwoc-OlrxK69hkha2CF12azM_NYhgO668yfcUl4VBbiSHZyd1NVZG5QTIOcbObu3qnLutbpadZGAxqjIbMkQ2bQS09fTrjMBtDE3D6kSMIodpCecoANon9b0LATkpitimVCrl PM1KaPlrEqdFSBzjqfTGAMxZGUTdM0t4B4rTfgV29ghDOHRc2B-C_hHeJaJICqjZ3mY2b_YNqmf9SoAylD1PycGCB90xzZeEDg6oBzOIPfYsbDWNf621pKo2Q3GGTHYlmNfwoc-OlrxK69hkha2CF12azM_NYhgO668yfmVCrl-NyfN3oyG4ZCWu18M9-vEou4Sq-1oMDzExgAf61noxzkNiaTecM-Ve5cq6wHqYQjfV9DOz4lbceuYCAA"
}
매개 변수 설명
토큰 유형 토큰 유형입니다. 유일하게 지원되는 값은 전달자입니다.
만료 시간 토큰의 남은 수명(초)입니다. 일반적인 값은 3600(1시간)입니다.
만료일 토큰이 만료되는 날짜 및 시간입니다. 날짜는 만료 시간까지 1970-01-01T0:0:0Z UTC의 초 수로 표시됩니다.
자원 액세스 토큰을 사용하여 액세스할 수 있는 보안 리소스를 식별합니다.
범위 네이티브 클라이언트 애플리케이션에 부여된 권한 승인입니다. 기본 권한은 user_impersonation. 대상 리소스의 소유자는 Azure AD에서 대체 값을 등록할 수 있습니다.
액세스 토큰 (access_token) 요청된 새 액세스 토큰입니다.
새로고침_토큰 이 응답의 액세스 토큰이 만료될 때 새 액세스 토큰을 요청하는 데 사용할 수 있는 새 OAuth 2.0 refresh_token.

오류 응답

샘플 오류 응답은 다음과 같습니다.

{
  "error": "invalid_resource",
  "error_description": "AADSTS50001: The application named https://foo.microsoft.com/mail.read was not found in the tenant named 295e01fc-0c56-4ac3-ac57-5d0ed568f872. This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You might have sent your authentication request to the wrong tenant.\r\nTrace ID: ef1f89f6-a14f-49de-9868-61bd4072f0a9\r\nCorrelation ID: b6908274-2c58-4e91-aea9-1f6b9c99347c\r\nTimestamp: 2016-04-11 18:59:01Z",
  "error_codes": [
    50001
  ],
  "timestamp": "2016-04-11 18:59:01Z",
  "trace_id": "ef1f89f6-a14f-49de-9868-61bd4072f0a9",
  "correlation_id": "b6908274-2c58-4e91-aea9-1f6b9c99347c"
}
매개 변수 설명
오류 발생하는 오류 유형을 분류하는 데 사용할 수 있고 오류에 대응하는 데 사용할 수 있는 오류 코드 문자열입니다.
오류 설명 개발자가 인증 오류의 근본 원인을 식별하도록 도울 수 있는 특정 오류 메시지입니다.
에러 코드 진단에 도움이 될 수 있는 STS 특정 오류 코드의 목록입니다.
시간표시 오류가 발생한 시간입니다.
trace_id 진단에 도움이 될 수 있는 요청에 대한 고유 식별자입니다.
상관관계_아이디 여러 구성 요소에서 진단에 도움이 될 수 있는 요청에 대한 고유 식별자입니다.

오류 코드 및 권장되는 클라이언트 작업에 대한 설명은 토큰 엔드포인트 오류에 대한 오류 코드를 참조하세요.

다음 단계

Azure AD v1.0 엔드포인트 및 웹 애플리케이션 및 웹 API에 인증 및 권한 부여를 추가하는 방법에 대한 자세한 내용은 샘플 애플리케이션을 참조하세요.