경고
이 콘텐츠는 이전 Azure AD v1.0 엔드포인트용입니다. 새 프로젝트에 Microsoft ID 플랫폼 사용합니다.
OAuth 2.0 OBO(On-Behalf-Of) 흐름을 사용하면 서비스 또는 웹 API를 호출하는 애플리케이션이 다른 서비스 또는 웹 API에 사용자 인증을 전달할 수 있습니다. OBO 흐름은 요청 체인을 통해 위임된 사용자 ID 및 권한을 전파합니다. 중간 계층 서비스가 다운스트림 서비스에 대해 인증된 요청을 하려면 사용자를 대신하여 Azure AD(Azure Active Directory)에서 액세스 토큰을 보호해야 합니다.
중요합니다
2018 id_token 년 5월을 기준으로 온-Behalf-Of 흐름에 사용할 수 없습니다. OBO 흐름을 수행하려면 SPA(단일 페이지 앱)가 중간 계층 기밀 클라이언트에 액세스 토큰을 전달해야 합니다. 온-Behalf-Of 호출을 수행할 수 있는 클라이언트에 대한 자세한 내용은 제한 사항을 참조하세요.
온-Behalf-Of 흐름 다이어그램
OBO 흐름은 OAuth 2.0 인증 코드 부여 흐름을 사용하는 애플리케이션에서 사용자가 인증된 후에 시작됩니다. 이 시점에서 애플리케이션은 액세스 토큰(토큰 A)을 사용자의 클레임 및 API A에 대한 액세스 동의가 포함된 중간 계층 웹 API(API A)로 보냅니다. 다음으로, API A는 다운스트림 웹 API(API B)에 대해 인증된 요청을 합니다.
이러한 단계는 On-Behalf-Of 흐름을 구성합니다. 
- 클라이언트 애플리케이션은 토큰 A를 사용하여 API A에 요청합니다.
- API A는 Azure AD 토큰 발급 엔드포인트에 인증하고 API B에 액세스하기 위해 토큰을 요청합니다.
- Azure AD 토큰 발급 엔드포인트는 토큰 A를 사용하여 API A의 자격 증명의 유효성을 검사하고 API B(토큰 B)에 대한 액세스 토큰을 발급합니다.
- API B에 대한 요청에는 권한 부여 헤더에 토큰 B가 포함됩니다.
- API B는 보안 리소스에서 데이터를 반환합니다.
비고
다운스트림 서비스에 대한 토큰을 요청하는 데 사용되는 액세스 토큰의 대상 그룹 클레임은 OBO 요청을 만드는 서비스의 ID여야 합니다. 또한 토큰은 Azure Active Directory 전역 서명 키(포털에서 앱 등록 을 통해 등록된 애플리케이션의 기본값)로 서명해야 합니다.
Azure AD에서 애플리케이션 및 서비스 등록
중간 계층 서비스와 클라이언트 애플리케이션을 모두 Azure AD에 등록합니다.
중간 계층 서비스 등록
- Azure Portal에 로그인합니다.
- 위쪽 표시줄에서 계정을 선택하고 디렉터리 목록을 확인하여 애플리케이션에 대한 Active Directory 테넌트를 선택합니다.
- 왼쪽 창에서 추가 서비스를 선택하고 Azure Active Directory를 선택합니다.
- 앱 등록을 선택한 다음 새 등록을 선택합니다.
- 애플리케이션의 이름을 입력하고 애플리케이션 유형을 선택합니다.
- 지원되는 계정 유형 아래에서 모든 조직 디렉터리의 계정 및 개인 Microsoft 계정을 선택합니다.
- 리디렉션 URI를 기본 URL로 설정합니다.
- 등록을 선택하여 애플리케이션을 만듭니다.
- Azure Portal에서 애플리케이션을 선택하고 인증서 및 비밀을 선택합니다.
- 새 클라이언트 비밀을 선택하고 1년 또는 2년의 기간으로 비밀을 추가합니다.
- 이 페이지를 저장하면 Azure Portal에 비밀 값이 표시됩니다. 비밀 값을 복사하여 안전한 위치에 저장합니다.
- 앱의 API 노출 페이지에서 애플리케이션에서 범위를 만들고 "범위 추가"를 클릭합니다. 포털에서 애플리케이션 ID URI도 만들어야 할 수 있습니다.
중요합니다
구현에서 애플리케이션 설정을 구성하려면 비밀이 필요합니다. 이 비밀 값은 다시 표시되지 않으며 다른 어떤 수단으로도 검색할 수 없습니다. Azure Portal에 표시되는 즉시 기록합니다.
클라이언트 애플리케이션 등록
- Azure Portal에 로그인합니다.
- 위쪽 표시줄에서 계정을 선택하고 디렉터리 목록을 확인하여 애플리케이션에 대한 Active Directory 테넌트를 선택합니다.
- 왼쪽 창에서 추가 서비스를 선택하고 Azure Active Directory를 선택합니다.
- 앱 등록을 선택한 다음 새 등록을 선택합니다.
- 애플리케이션의 이름을 입력하고 애플리케이션 유형을 선택합니다.
- 지원되는 계정 유형 아래에서 모든 조직 디렉터리의 계정 및 개인 Microsoft 계정을 선택합니다.
- 리디렉션 URI를 기본 URL로 설정합니다.
- 등록을 선택하여 애플리케이션을 만듭니다.
- 애플리케이션에 대한 권한을 구성합니다. API 사용 권한에서 사용 권한 추가를 선택한 다음 내 API를 선택합니다.
- 텍스트 필드에 중간 계층 서비스의 이름을 입력합니다.
- 사용 권한 선택을 선택한 다음 중간 계층을 등록하는 마지막 단계에서 만든 범위를 선택합니다.
알려진 클라이언트 애플리케이션 구성
이 시나리오에서 중간 계층 서비스는 사용자 상호 작용 없이 다운스트림 API에 액세스하기 위한 사용자의 동의를 얻어야 합니다. 다운스트림 API에 대한 액세스 권한을 부여하는 옵션은 인증 중에 동의 단계의 일부로 미리 제시되어야 합니다.
아래 단계에 따라 Azure AD에서 클라이언트 앱의 등록을 중간 계층 서비스의 등록과 명시적으로 바인딩합니다. 이 작업은 클라이언트와 중간 계층 모두에 필요한 동의를 단일 대화 상자에 병합합니다.
- 중간 계층 서비스 등록으로 이동하고 매니페스트 를 선택하여 매니페스트 편집기를 엽니다.
-
knownClientApplications배열 속성을 찾아 클라이언트 애플리케이션의 클라이언트 ID를 요소로 추가합니다. - 저장을 선택하여 매니페스트를 저장합니다.
서비스 간 액세스 토큰 요청
액세스 토큰을 요청하려면 다음 매개 변수를 사용하여 테넌트별 Azure AD 엔드포인트에 HTTP POST를 만듭니다.
https://login.microsoftonline.com/<tenant>/oauth2/token
클라이언트 애플리케이션은 공유 비밀 또는 인증서로 보호됩니다.
첫 번째 사례: 공유 암호를 사용하여 액세스 토큰 요청
공유 비밀을 사용하는 경우 서비스-서비스 액세스 토큰 요청에는 다음 매개 변수가 포함됩니다.
| 매개 변수 | 유형 | 설명 |
|---|---|---|
| 인증 유형 | 필수 | 토큰 요청의 형식입니다. OBO 요청은 JWT(JSON Web Token)를 사용하므로 값은 urn:ietf:params:oauth:grant-type:jwt-bearer여야 합니다. |
| 주장 | 필수 | 요청에 사용되는 액세스 토큰의 값입니다. |
| 클라이언트_아이디 | 필수 | Azure AD에 등록하는 동안 호출 서비스에 할당된 앱 ID입니다. Azure Portal에서 앱 ID를 찾으려면 Active Directory를 선택하고 디렉터리를 선택한 다음 애플리케이션 이름을 선택합니다. |
| 클라이언트 비밀번호 | 필수 | Azure AD에서 호출 서비스에 등록된 키입니다. 이 값은 등록 시 기록되어야 합니다. |
| 자원 | 필수 | 수신 서비스(보안 리소스)의 앱 ID URI입니다. Azure Portal에서 앱 ID URI를 찾으려면 Active Directory 를 선택하고 디렉터리를 선택합니다. 애플리케이션 이름을 선택하고 모든 설정을 선택한 다음 속성을 선택합니다. |
| 요청된 토큰 사용 | 필수 | 요청을 처리하는 방법을 지정합니다. On-Behalf-Of 흐름에서 값은 on_behalf_of이어야 합니다. |
| 범위 | 필수 | 공백으로 구분된 토큰 요청에 대한 범위의 목록입니다. OpenID Connect의 경우 범위 openid 를 지정해야 합니다. |
예시
다음 HTTP POST는 웹 API에 대한 액세스 토큰을 https://graph.microsoft.com 요청합니다. 액세스 client_id 토큰을 요청하는 서비스를 식별합니다.
// line breaks for legibility only
POST /oauth2/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer
&client_id=625391af-c675-43e5-8e44-edd3e30ceb15
&client_secret=0Y1W%2BY3yYb3d9N8vSjvm8WrGzVZaAaHbHHcGbcgG%2BoI%3D
&resource=https%3A%2F%2Fgraph.microsoft.com
&assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCIsImtpZCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCJ9.ewogICJhdWQiOiAiaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tIiwKICAiaXNzIjogImh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzI2MDM5Y2NlLTQ4OWQtNDAwMi04MjkzLTViMGM1MTM0ZWFjYi8iLAogICJpYXQiOiAxNDkzNDIzMTY4LAogICJuYmYiOiAxNDkzNDIzMTY4LAogICJleHAiOiAxNDkzNDY2OTUxLAogICJhY3IiOiAiMSIsCiAgImFpbyI6ICJBU1FBMi84REFBQUE1NnZGVmp0WlNjNWdBVWwrY1Z0VFpyM0VvV2NvZEoveWV1S2ZqcTZRdC9NPSIsCiAgImFtciI6IFsKICAgICJwd2QiCiAgXSwKICAiYXBwaWQiOiAiNjI1MzkxYWYtYzY3NS00M2U1LThlNDQtZWRkM2UzMGNlYjE1IiwKICAiYXBwaWRhY3IiOiAiMSIsCiAgImVfZXhwIjogMzAyNjgzLAogICJmYW1pbHlfbmFtZSI6ICJUZXN0IiwKICAiZ2l2ZW5fbmFtZSI6ICJOYXZ5YSIsCiAgImlwYWRkciI6ICIxNjcuMjIwLjEuMTc3IiwKICAibmFtZSI6ICJOYXZ5YSBUZXN0IiwKICAib2lkIjogIjFjZDRiY2FjLWI4MDgtNDIzYS05ZTJmLTgyN2ZiYjFiYjczOSIsCiAgInBsYXRmIjogIjMiLAogICJwdWlkIjogIjEwMDMzRkZGQTEyRUQ3RkUiLAogICJzY3AiOiAiVXNlci5SZWFkIiwKICAic3ViIjogIjNKTUlaSWJlYTc1R2hfWHdDN2ZzX0JDc3kxa1l1ekZKLTUyVm1Zd0JuM3ciLAogICJ0aWQiOiAiMjYwMzljY2UtNDg5ZC00MDAyLTgyOTMtNWIwYzUxMzRlYWNiIiwKICAidW5pcXVlX25hbWUiOiAibmF2eWFAZGRvYmFsaWFub3V0bG9vay5vbm1pY3Jvc29mdC5jb20iLAogICJ1cG4iOiAibmF2eWFAZGRvYmFsaWFub3V0bG9vay5vbm1pY3Jvc29mdC5jb20iLAogICJ1dGkiOiAieEN3ZnpoYS1QMFdKUU9MeENHZ0tBQSIsCiAgInZlciI6ICIxLjAiCn0.cqmUVjfVbqWsxJLUI1Z4FRx1mNQAHP-L0F4EMN09r8FY9bIKeO-0q1eTdP11Nkj_k4BmtaZsTcK_mUygdMqEp9AfyVyA1HYvokcgGCW_Z6DMlVGqlIU4ssEkL9abgl1REHElPhpwBFFBBenOk9iHddD1GddTn6vJbKC3qAaNM5VarjSPu50bVvCrqKNvFixTb5bbdnSz-Qr6n6ACiEimiI1aNOPR2DeKUyWBPaQcU5EAK0ef5IsVJC1yaYDlAcUYIILMDLCD9ebjsy0t9pj_7lvjzUSrbMdSCCdzCqez_MSNxrk1Nu9AecugkBYp3UVUZOIyythVrj6-sVvLZKUutQ
&requested_token_use=on_behalf_of
&scope=openid
두 번째 사례: 인증서를 사용하여 액세스 토큰 요청
인증서를 사용하는 서비스 간 액세스 토큰 요청에 포함되는 매개 변수는 다음과 같습니다.
| 매개 변수 | 유형 | 설명 |
|---|---|---|
| 인증 유형 | 필수 | 토큰 요청의 형식입니다. OBO 요청은 JWT 액세스 토큰을 사용하므로 값은 urn:ietf:params:oauth:grant-type:jwt-bearer여야 합니다. |
| 주장 | 필수 | 요청에 사용된 토큰의 값입니다. |
| 클라이언트_아이디 | 필수 | Azure AD에 등록하는 동안 호출 서비스에 할당된 앱 ID입니다. Azure Portal에서 앱 ID를 찾으려면 Active Directory를 선택하고 디렉터리를 선택한 다음 애플리케이션 이름을 선택합니다. |
| 클라이언트_주장_유형 | 필수 | 값은 urn:ietf:params:oauth:client-assertion-type:jwt-bearer 이어야 합니다. |
| 클라이언트_어설션 | 필수 | 애플리케이션에 대한 자격 증명으로 등록한 인증서로 만들고 서명하는 JSON 웹 토큰입니다. 어설션 형식 및 인증서 등록 방법에 대한 자세한 내용은 인증서 자격 증명 을 참조하세요. |
| 자원 | 필수 | 수신 서비스(보안 리소스)의 앱 ID URI입니다. Azure Portal에서 앱 ID URI를 찾으려면 Active Directory 를 선택하고 디렉터리를 선택합니다. 애플리케이션 이름을 선택하고 모든 설정을 선택한 다음 속성을 선택합니다. |
| 요청된 토큰 사용 | 필수 | 요청을 처리하는 방법을 지정합니다. On-Behalf-Of 흐름에서 값은 on_behalf_of이어야 합니다. |
| 범위 | 필수 | 공백으로 구분된 토큰 요청에 대한 범위의 목록입니다. OpenID Connect의 경우 범위 openid 를 지정해야 합니다. |
이러한 매개 변수는 두 매개 변수 client_secret parameter 로 대체된다는 점을 제외하고 공유 비밀의 client_assertion_type 요청과 client_assertion거의 동일합니다.
예시
다음 HTTP POST는 인증서를 사용하여 웹 API에 https://graph.microsoft.com 대한 액세스 토큰을 요청합니다. 액세스 client_id 토큰을 요청하는 서비스를 식별합니다.
// line breaks for legibility only
POST /oauth2/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer
&client_id=625391af-c675-43e5-8e44-edd3e30ceb15
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJ{a lot of characters here}M8U3bSUKKJDEg
&resource=https%3A%2F%2Fgraph.microsoft.com
&assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCIsImtpZCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCJ9.eyJhdWQiOiJodHRwczovL2Rkb2JhbGlhbm91dGxvb2sub25taWNyb3NvZnQuY29tLzE5MjNmODYyLWU2ZGMtNDFhMy04MWRhLTgwMmJhZTAwYWY2ZCIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzI2MDM5Y2NlLTQ4OWQtNDAwMi04MjkzLTViMGM1MTM0ZWFjYi8iLCJpYXQiOjE0OTM0MjMxNTIsIm5iZiI6MTQ5MzQyMzE1MiwiZXhwIjoxNDkzNDY2NjUyLCJhY3IiOiIxIiwiYWlvIjoiWTJaZ1lCRFF2aTlVZEc0LzM0L3dpQndqbjhYeVp4YmR1TFhmVE1QeG8yYlN2elgreHBVQSIsImFtciI6WyJwd2QiXSwiYXBwaWQiOiJiMzE1MDA3OS03YmViLTQxN2YtYTA2YS0zZmRjNzhjMzI1NDUiLCJhcHBpZGFjciI6IjAiLCJlX2V4cCI6MzAyNDAwLCJmYW1pbHlfbmFtZSI6IlRlc3QiLCJnaXZlbl9uYW1lIjoiTmF2eWEiLCJpcGFkZHIiOiIxNjcuMjIwLjEuMTc3IiwibmFtZSI6Ik5hdnlhIFRlc3QiLCJvaWQiOiIxY2Q0YmNhYy1iODA4LTQyM2EtOWUyZi04MjdmYmIxYmI3MzkiLCJwbGF0ZiI6IjMiLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJzdWIiOiJEVXpYbkdKMDJIUk0zRW5pbDFxdjZCakxTNUllQy0tQ2ZpbzRxS1MzNEc4IiwidGlkIjoiMjYwMzljY2UtNDg5ZC00MDAyLTgyOTMtNWIwYzUxMzRlYWNiIiwidW5pcXVlX25hbWUiOiJuYXZ5YUBkZG9iYWxpYW5vdXRsb29rLm9ubWljcm9zb2Z0LmNvbSIsInVwbiI6Im5hdnlhQGRkb2JhbGlhbm91dGxvb2sub25taWNyb3NvZnQuY29tIiwidmVyIjoiMS4wIn0.R-Ke-XO7lK0r5uLwxB8g5CrcPAwRln5SccJCfEjU6IUqpqcjWcDzeDdNOySiVPDU_ZU5knJmzRCF8fcjFtPsaA4R7vdIEbDuOur15FXSvE8FvVSjP_49OH6hBYqoSUAslN3FMfbO6Z8YfCIY4tSOB2I6ahQ_x4ZWFWglC3w5mK-_4iX81bqi95eV4RUKefUuHhQDXtWhrSgIEC0YiluMvA4TnaJdLq_tWXIc4_Tq_KfpkvI004ONKgU7EAMEr1wZ4aDcJV2yf22gQ1sCSig6EGSTmmzDuEPsYiyd4NhidRZJP4HiiQh-hePBQsgcSgYGvz9wC6n57ufYKh2wm_Ti3Q
&requested_token_use=on_behalf_of
&scope=openid
서비스 간 액세스 토큰 응답
성공 응답은 다음 매개 변수를 사용하는 JSON OAuth 2.0 응답입니다.
| 매개 변수 | 설명 |
|---|---|
| 토큰 유형 | 토큰 형식 값을 나타냅니다. Azure AD에서 지원하는 유일한 유형은 전달자입니다. 전달자 토큰에 대한 자세한 내용은 OAuth 2.0 권한 부여 프레임워크: 전달자 토큰 사용량(RFC 6750)을 참조하세요. |
| 범위 | 토큰에 부여된 액세스의 범위입니다. |
| 만료 시간 | 액세스 토큰이 유효한 시간(초)입니다. |
| 만료일 | 액세스 토큰이 만료되는 시간입니다. 날짜는 만료 시간까지 1970-01-01T0:0:0Z UTC의 초 수로 표시됩니다. 이 값은 캐시된 토큰의 수명을 결정하는 데 사용됩니다. |
| 자원 | 수신 서비스(보안 리소스)의 앱 ID URI입니다. |
| 액세스 토큰 (access_token) | 요청된 액세스 토큰입니다. 호출 서비스에서 이 토큰을 사용하여 수신 서비스를 인증할 수 있습니다. |
| id_token (아이디 토큰) | 요청된 ID 토큰입니다. 호출 서비스는 이 토큰을 사용하여 사용자의 ID를 확인하고 사용자와 세션을 시작할 수 있습니다. |
| 새로고침_토큰 | 요청된 액세스 토큰에 대한 새로 고침 토큰입니다. 현재 액세스 토큰이 만료되면 호출 서비스에서 이 토큰을 사용하여 다른 액세스 토큰을 요청할 수 있습니다. |
성공 응답 예제
다음 예제에서는 웹 API에 대한 액세스 토큰 요청에 대한 성공 응답을 보여 줍니다 https://graph.microsoft.com .
{
"token_type":"Bearer",
"scope":"User.Read",
"expires_in":"43482",
"ext_expires_in":"302683",
"expires_on":"1493466951",
"not_before":"1493423168",
"resource":"https://graph.microsoft.com",
"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCIsImtpZCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCJ9.eyJhdWQiOiJodHRwczovL2dyYXBoLndpbmRvd3MubmV0IiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvMjYwMzljY2UtNDg5ZC00MDAyLTgyOTMtNWIwYzUxMzRlYWNiLyIsImlhdCI6MTQ5MzQyMzE2OCwibmJmIjoxNDkzNDIzMTY4LCJleHAiOjE0OTM0NjY5NTEsImFjciI6IjEiLCJhaW8iOiJBU1FBMi84REFBQUE1NnZGVmp0WlNjNWdBVWwrY1Z0VFpyM0VvV2NvZEoveWV1S2ZqcTZRdC9NPSIsImFtciI6WyJwd2QiXSwiYXBwaWQiOiI2MjUzOTFhZi1jNjc1LTQzZTUtOGU0NC1lZGQzZTMwY2ViMTUiLCJhcHBpZGFjciI6IjEiLCJlX2V4cCI6MzAyNjgzLCJmYW1pbHlfbmFtZSI6IlRlc3QiLCJnaXZlbl9uYW1lIjoiTmF2eWEiLCJpcGFkZHIiOiIxNjcuMjIwLjEuMTc3IiwibmFtZSI6Ik5hdnlhIFRlc3QiLCJvaWQiOiIxY2Q0YmNhYy1iODA4LTQyM2EtOWUyZi04MjdmYmIxYmI3MzkiLCJwbGF0ZiI6IjMiLCJwdWlkIjoiMTAwMzNGRkZBMTJFRDdGRSIsInNjcCI6IlVzZXIuUmVhZCIsInN1YiI6IjNKTUlaSWJlYTc1R2hfWHdDN2ZzX0JDc3kxa1l1ekZKLTUyVm1Zd0JuM3ciLCJ0aWQiOiIyNjAzOWNjZS00ODlkLTQwMDItODI5My01YjBjNTEzNGVhY2IiLCJ1bmlxdWVfbmFtZSI6Im5hdnlhQGRkb2JhbGlhbm91dGxvb2sub25taWNyb3NvZnQuY29tIiwidXBuIjoibmF2eWFAZGRvYmFsaWFub3V0bG9vay5vbm1pY3Jvc29mdC5jb20iLCJ1dGkiOiJ4Q3dmemhhLVAwV0pRT0x4Q0dnS0FBIiwidmVyIjoiMS4wIn0.cqmUVjfVbqWsxJLUI1Z4FRx1mNQAHP-L0F4EMN09r8FY9bIKeO-0q1eTdP11Nkj_k4BmtaZsTcK_mUygdMqEp9AfyVyA1HYvokcgGCW_Z6DMlVGqlIU4ssEkL9abgl1REHElPhpwBFFBBenOk9iHddD1GddTn6vJbKC3qAaNM5VarjSPu50bVvCrqKNvFixTb5bbdnSz-Qr6n6ACiEimiI1aNOPR2DeKUyWBPaQcU5EAK0ef5IsVJC1yaYDlAcUYIILMDLCD9ebjsy0t9pj_7lvjzUSrbMdSCCdzCqez_MSNxrk1Nu9AecugkBYp3UVUZOIyythVrj6-sVvLZKUutQ",
"refresh_token":"AQABAAAAAABnfiG-mA6NTae7CdWW7QfdjKGu9-t1scy_TDEmLi4eLQMjJGt_nAoVu6A4oSu1KsRiz8XyQIPKQxSGfbf2FoSK-hm2K8TYzbJuswYusQpJaHUQnSqEvdaCeFuqXHBv84wjFhuanzF9dQZB_Ng5za9xKlUENrNtlq9XuLNVKzxEyeUM7JyxzdY7JiEphWImwgOYf6II316d0Z6-H3oYsFezf4Xsjz-MOBYEov0P64UaB5nJMvDyApV-NWpgklLASfNoSPGb67Bc02aFRZrm4kLk-xTl6eKE6hSo0XU2z2t70stFJDxvNQobnvNHrAmBaHWPAcC3FGwFnBOojpZB2tzG1gLEbmdROVDp8kHEYAwnRK947Py12fJNKExUdN0njmXrKxNZ_fEM33LHW1Tf4kMX_GvNmbWHtBnIyG0w5emb-b54ef5AwV5_tGUeivTCCysgucEc-S7G8Cz0xNJ_BOiM_4bAv9iFmrm9STkltpz0-Tftg8WKmaJiC0xXj6uTf4ZkX79mJJIuuM7XP4ARIcLpkktyg2Iym9jcZqymRkGH2Rm9sxBwC4eeZXM7M5a7TJ-5CqOdfuE3sBPq40RdEWMFLcrAzFvP0VDR8NKHIrPR1AcUruat9DETmTNJukdlJN3O41nWdZOVoJM-uKN3uz2wQ2Ld1z0Mb9_6YfMox9KTJNzRzcL52r4V_y3kB6ekaOZ9wQ3HxGBQ4zFt-2U0mSszIAA",
"id_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiI2MjUzOTFhZi1jNjc1LTQzZTUtOGU0NC1lZGQzZTMwY2ViMTUiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC8yNjAzOWNjZS00ODlkLTQwMDItODI5My01YjBjNTEzNGVhY2IvIiwiaWF0IjoxNDkzNDIzMTY4LCJuYmYiOjE0OTM0MjMxNjgsImV4cCI6MTQ5MzQ2Njk1MSwiYW1yIjpbInB3ZCJdLCJmYW1pbHlfbmFtZSI6IlRlc3QiLCJnaXZlbl9uYW1lIjoiTmF2eWEiLCJpcGFkZHIiOiIxNjcuMjIwLjEuMTc3IiwibmFtZSI6Ik5hdnlhIFRlc3QiLCJvaWQiOiIxY2Q0YmNhYy1iODA4LTQyM2EtOWUyZi04MjdmYmIxYmI3MzkiLCJwbGF0ZiI6IjMiLCJzdWIiOiJEVXpYbkdKMDJIUk0zRW5pbDFxdjZCakxTNUllQy0tQ2ZpbzRxS1MzNEc4IiwidGlkIjoiMjYwMzljY2UtNDg5ZC00MDAyLTgyOTMtNWIwYzUxMzRlYWNiIiwidW5pcXVlX25hbWUiOiJuYXZ5YUBkZG9iYWxpYW5vdXRsb29rLm9ubWljcm9zb2Z0LmNvbSIsInVwbiI6Im5hdnlhQGRkb2JhbGlhbm91dGxvb2sub25taWNyb3NvZnQuY29tIiwidXRpIjoieEN3ZnpoYS1QMFdKUU9MeENHZ0tBQSIsInZlciI6IjEuMCJ9."
}
오류 응답 예제
Azure AD 토큰 엔드포인트는 조건부 액세스 정책(예: 다단계 인증)으로 설정된 다운스트림 API에 대한 액세스 토큰을 획득하려고 할 때 오류 응답을 반환합니다. 중간 계층 서비스는 클라이언트 애플리케이션이 조건부 액세스 정책을 충족하기 위해 사용자 상호 작용을 제공할 수 있도록 클라이언트 애플리케이션에 이 오류를 표시해야 합니다.
{
"error":"interaction_required",
"error_description":"AADSTS50079: Due to a configuration change made by your administrator, or because you moved to a new location, you must enroll in multi-factor authentication to access 'bf8d80f9-9098-4972-b203-500f535113b1'.\r\nTrace ID: b72a68c3-0926-4b8e-bc35-3150069c2800\r\nCorrelation ID: 73d656cf-54b1-4eb2-b429-26d8165a52d7\r\nTimestamp: 2017-05-01 22:43:20Z",
"error_codes":[50079],
"timestamp":"2017-05-01 22:43:20Z",
"trace_id":"b72a68c3-0926-4b8e-bc35-3150069c2800",
"correlation_id":"73d656cf-54b1-4eb2-b429-26d8165a52d7",
"claims":"{\"access_token\":{\"polids\":{\"essential\":true,\"values\":[\"9ab03e19-ed42-4168-b6b7-7001fb3e933a\"]}}}"
}
액세스 토큰을 사용하여 보안 리소스에 액세스
중간 계층 서비스는 획득된 액세스 토큰을 사용하여 헤더에서 토큰을 설정하여 다운스트림 웹 API에 대한 인증된 요청을 수행할 수 있습니다 Authorization .
예시
GET /me?api-version=2013-11-08 HTTP/1.1
Host: graph.microsoft.com
Authorization: Bearer eyJ0eXAiO ... 0X2tnSQLEANnSPHY0gKcgw
OAuth2.0 OBO 흐름을 사용하여 가져온 SAML 어설션
일부 OAuth 기반 웹 서비스는 비대화형 흐름에서 SAML 어설션을 수락하는 다른 웹 서비스 API에 액세스해야 합니다. Azure Active Directory는 SAML 기반 웹 서비스를 대상 리소스로 사용하는 온-Behalf-Of 흐름에 대한 응답으로 SAML 어설션을 제공할 수 있습니다.
비고
OAuth2 기반 애플리케이션이 SAML 토큰을 사용하는 웹 서비스 API 엔드포인트에 액세스할 수 있도록 하는 OAuth 2.0 On-Behalf-Of 흐름에 대한 비표준 확장입니다.
팁 (조언)
프런트 엔드 웹 애플리케이션에서 SAML로 보호되는 웹 서비스를 호출하는 경우 API를 호출하고 사용자의 기존 세션으로 정상적인 대화형 인증 흐름을 시작할 수 있습니다. 서비스 간 호출에 사용자 컨텍스트를 제공하기 위해 SAML 토큰이 필요한 경우에만 OBO 흐름을 사용해야 합니다.
공유 암호가 있는 OBO 요청을 사용하여 SAML 토큰 가져오기
SAML 어설션에 대한 서비스 대 서비스 요청에는 다음 매개 변수가 포함됩니다.
| 매개 변수 | 유형 | 설명 |
|---|---|---|
| 인증 유형 | 필수 | 토큰 요청의 형식입니다. JWT를 사용하는 요청의 경우 값은 urn:ietf:params:oauth:grant-type:jwt-bearer여야 합니다. |
| 주장 | 필수 | 요청에 사용되는 액세스 토큰의 값입니다. |
| 클라이언트_아이디 | 필수 | Azure AD에 등록하는 동안 호출 서비스에 할당된 앱 ID입니다. Azure Portal에서 앱 ID를 찾으려면 Active Directory를 선택하고 디렉터리를 선택한 다음 애플리케이션 이름을 선택합니다. |
| 클라이언트 비밀번호 | 필수 | Azure AD에서 호출 서비스에 등록된 키입니다. 이 값은 등록 시 기록되어야 합니다. |
| 자원 | 필수 | 수신 서비스(보안 리소스)의 앱 ID URI입니다. SAML 토큰의 대상인 리소스입니다. Azure Portal에서 앱 ID URI를 찾으려면 Active Directory 를 선택하고 디렉터리를 선택합니다. 애플리케이션 이름을 선택하고 모든 설정을 선택한 다음 속성을 선택합니다. |
| 요청된 토큰 사용 | 필수 | 요청을 처리하는 방법을 지정합니다. On-Behalf-Of 흐름에서 값은 on_behalf_of이어야 합니다. |
| 요청된_토큰_유형 | 필수 | 요청된 토큰의 유형을 지정합니다. 값은 액세스된 리소스의 요구 사항에 따라 urn:ietf:params:oauth:token-type:saml2 또는 urn:ietf:params:oauth:token-type:saml1 일 수 있습니다. |
응답에는 UTF8 및 Base64url로 인코딩된 SAML 토큰이 포함됩니다.
OBO 호출에서 파생된 SAML 어설션에 대한 SubjectConfirmationData: 대상 애플리케이션에 SubjectConfirmationData의 받는 사람 값이 필요한 경우 해당 값은 리소스 애플리케이션 구성에서 와일드카드가 아닌 회신 URL이어야 합니다.
SubjectConfirmationData 노드: 노드는 SAML 응답의 일부가 아니므로 InResponseTo 특성을 포함할 수 없습니다. SAML 토큰을 수신하는 애플리케이션은 InResponseTo 특성 없이 SAML 어설션을 수락할 수 있어야 합니다.
동의: OAuth 흐름에서 사용자 데이터가 포함된 SAML 토큰을 받으려면 동의가 부여되어야 합니다. 사용 권한 및 관리자 동의 얻기에 대한 자세한 내용은 Azure Active Directory v1.0 엔드포인트의 사용 권한 및 동의를 참조하세요.
SAML 어설션을 사용하여 응답
| 매개 변수 | 설명 |
|---|---|
| 토큰 유형 | 토큰 형식 값을 나타냅니다. Azure AD에서 지원하는 유일한 유형은 전달자입니다. 전달자 토큰에 대한 자세한 내용은 OAuth 2.0 권한 부여 프레임워크: 전달자 토큰 사용량(RFC 6750)을 참조하세요. |
| 범위 | 토큰에 부여된 액세스의 범위입니다. |
| 만료 시간 | 액세스 토큰이 유효한 시간(초)입니다. |
| 만료일 | 액세스 토큰이 만료되는 시간입니다. 날짜는 만료 시간까지 1970-01-01T0:0:0Z UTC의 초 수로 표시됩니다. 이 값은 캐시된 토큰의 수명을 결정하는 데 사용됩니다. |
| 자원 | 수신 서비스(보안 리소스)의 앱 ID URI입니다. |
| 액세스 토큰 (access_token) | SAML 어설션을 반환하는 매개 변수입니다. |
| 새로고침_토큰 | 새로 고침 토큰입니다. 호출 서비스는 현재 SAML 어설션이 만료된 후 이 토큰을 사용하여 다른 액세스 토큰을 요청할 수 있습니다. |
- token_type: 전달자
- 유효 기간: 3296
- ext_expires_in: 0
- 만료일: 1529627844
- 자원:
https://api.contoso.com - access_token: <SAML 어설션>
- issued_token_type: urn:ietf:params:oauth:token-type:saml2
- refresh_token: <토큰 새로 고침>
클라이언트 제한 사항
와일드카드 회신 URL이 있는 공용 클라이언트는 OBO 흐름에 id_token 사용할 수 없습니다. 그러나 공개 클라이언트에 와일드카드 리디렉션 URI가 등록된 경우에도 기밀 클라이언트는 암시적 권한 부여 흐름을 통해 획득한 액세스 토큰을 계속 사용할 수 있습니다.
다음 단계
OAuth 2.0 프로토콜 및 클라이언트 자격 증명을 사용하는 서비스 간 인증을 수행하는 또 다른 방법에 대해 자세히 알아봅니다.
- Azure AD에서 OAuth 2.0 클라이언트 자격 증명 부여를 사용한 서비스 대 서비스 인증
- Azure AD에서의 OAuth 2.0