다음을 통해 공유


Microsoft ID 플랫폼 및 OAuth 2.0 디바이스 권한 부여 흐름

Microsoft ID 플랫폼은 사용자가 스마트 TV, IoT 디바이스 또는 프린터와 같은 입력 제한 디바이스에 로그인할 수 있도록 하는 디바이스 권한 부여를 지원합니다. 이 흐름을 사용하도록 설정하기 위해 디바이스는 사용자가 다른 디바이스의 브라우저에서 웹 페이지를 방문하여 로그인하도록 합니다. 사용자가 로그인하면 디바이스는 필요에 따라 액세스 토큰을 가져오고 토큰을 새로 고칠 수 있습니다.

이 문서에서는 애플리케이션의 프로토콜에 대해 직접 프로그래밍하는 방법을 설명합니다. 가능하면 지원되는 Microsoft 인증 라이브러리(MSAL)를 사용하여 토큰을 획득하고 보안 웹 API를 호출하는 것이 좋습니다. 예제에 대해 MSAL을 사용하는 샘플 앱을 참조할 수 있습니다.

프로토콜 다이어그램

전체 디바이스 코드 흐름은 다음 다이어그램에 나와 있습니다. 각 단계는 이 문서 전체에서 설명합니다.

디바이스 코드 흐름

디바이스 권한 부여 요청

클라이언트는 먼저 인증 서버에서 인증을 시작하는 데 사용되는 디바이스 및 사용자 코드를 확인해야 합니다. 클라이언트는 엔드포인트에서 /devicecode 이 요청을 수집합니다. 요청에서 클라이언트는 사용자로부터 획득하는 데 필요한 권한도 포함해야 합니다.

요청이 전송되는 순간부터 사용자는 로그인하는 데 15분이 걸립니다. AutoSizeMode의 기본값입니다. 요청은 사용자가 로그인할 준비가 되었음을 나타내는 경우에만 이루어져야 합니다.

// Line breaks are for legibility only.

POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode
Content-Type: application/x-www-form-urlencoded

client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=user.read%20openid%20profile

매개 변수 조건 설명
tenant 필수 /common, /consumers 또는 /organizations일 수 있습니다. GUID 또는 친숙한 이름 형식에서 사용 권한을 요청하려는 디렉터리 테넌트일 수도 있습니다.
client_id 필수 애플리케이션(클라이언트) IDMicrosoft Entra 관리 센터 – 앱 등록 환경에서 귀하의 앱에 할당한 ID입니다.
scope 필수 사용자가 동의하게 할 공백으로 구분된 범위 목록입니다.

디바이스 권한 부여 응답

성공적인 응답은 사용자가 로그인할 수 있도록 하는 데 필요한 정보를 포함하는 JSON 개체입니다.

매개 변수 포맷 설명
device_code 문자열 클라이언트와 권한 부여 서버 간의 세션을 확인하는 데 사용되는 긴 문자열입니다. 클라이언트는 이 매개 변수를 사용하여 권한 부여 서버에서 액세스 토큰을 요청합니다.
user_code 문자열 보조 디바이스에서 세션을 식별하는 데 사용되는 사용자에게 표시되는 짧은 문자열입니다.
verification_uri URI(유알아이) 사용자가 로그인하기 위해 이동해야 하는 user_code URI입니다.
expires_in 정수 (int) device_codeuser_code의 만료 전 시간(초)입니다.
interval 정수 (int) 클라이언트가 폴링 요청 사이에 대기해야 하는 시간(초)입니다.
message 문자열 사용자에 대한 지침이 포함된 사람이 읽을 수 있는 문자열입니다. 양식의 요청에 ?mkt=xx-XX를 포함하여 적절한 언어 문화권 코드를 입력하여 지역화할 수 있습니다.

비고

응답 verification_uri_complete 필드는 현재 포함되거나 지원되지 않습니다. 표준을 읽는 경우 디바이스 코드 흐름 표준 의 선택적 부분으로 나열되는 것을 verification_uri_complete 볼 수 있기 때문에 이를 언급합니다.

사용자 인증

클라이언트가 수신 user_code 하고 verification_uri나면 값이 표시되고 사용자가 모바일 또는 PC 브라우저를 통해 로그인하도록 지시됩니다.

사용자가 개인 계정으로 인증하는 경우 인증 /common/consumers상태를 디바이스로 전송하기 위해 다시 로그인하라는 메시지가 표시됩니다. 디바이스가 사용자의 쿠키에 액세스할 수 없기 때문입니다. 클라이언트가 요청한 권한에 동의하라는 메시지가 표시됩니다. 그러나 인증하는 데 사용되는 회사 또는 학교 계정에는 적용되지 않습니다.

사용자가 인증verification_uri하는 동안 클라이언트는 다음을 사용하여 /token요청된 토큰에 대한 엔드포인트를 폴링 device_code 해야 합니다.

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

grant_type=urn:ietf:params:oauth:grant-type:device_code&client_id=00001111-aaaa-2222-bbbb-3333cccc4444&device_code=GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8...
매개 변수 필수 설명
tenant 필수 초기 요청에 사용된 동일한 테넌트 또는 테넌트 별칭입니다.
grant_type 필수 urn:ietf:params:oauth:grant-type:device_code이어야 합니다.
client_id 필수 초기 요청에서 사용된 항목과 일치 client_id 해야 합니다.
device_code 필수 device_code 디바이스 권한 부여 요청에서 반환된 것입니다.

예상 오류

디바이스 코드 흐름은 폴링 프로토콜이므로 사용자 인증이 완료되기 전에 클라이언트에 제공된 오류를 예상해야 합니다.

오류 설명 클라이언트 작업
authorization_pending 사용자가 인증을 완료하지 않았지만 흐름을 취소하지 않았습니다. 최소 interval 몇 초 후에 요청을 반복합니다.
authorization_declined 최종 사용자가 권한 부여 요청을 거부했습니다. 폴링을 중지하고 인증되지 않은 상태로 되돌려 갑니다.
bad_verification_code device_code 엔드포인트로 /token 전송된 내용이 인식되지 않았습니다. 클라이언트가 요청에서 올바른 device_code 메시지를 보내고 있는지 확인합니다.
expired_token 값이 expires_in 초과되었으며 더 이상 .을 device_code사용하여 인증할 수 없습니다. 폴링을 중지하고 인증되지 않은 상태로 되돌려 갑니다.

성공적인 인증 응답

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

{
    "token_type": "Bearer",
    "scope": "User.Read profile openid email",
    "expires_in": 3599,
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
    "refresh_token": "AwABAAAAvPM1KaPlrEqdFSBzjqfTGAMxZGUTdM0t4B4...",
    "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctOD..."
}
매개 변수 포맷 설명
token_type 문자열 항상 Bearer입니다.
scope 공백으로 구분된 문자열 액세스 토큰이 반환된 경우 액세스 토큰이 유효한 범위가 나열됩니다.
expires_in 정수 (int) 포함된 액세스 토큰이 유효한 시간(초)입니다.
access_token 불투명 문자열 요청된 범위에 대해 발급되었습니다.
id_token JWT 원래 scope 매개 변수에 openid 범위가 포함된 경우 발급됩니다.
refresh_token 불투명 문자열 원래 scope 매개 변수에 offline_access포함되어 있으면 발급됩니다.

새로 고침 토큰을 사용하여 OAuth 코드 흐름 설명서에 설명된 것과 동일한 흐름을 사용하여 새 액세스 토큰을 획득하고 토큰을 새로 고칠 수 있습니다.

경고

코드에서 이 예제의 토큰을 포함하여 소유하지 않은 API에 대한 토큰을 확인하거나 읽으려고 시도하지 마세요. Microsoft 서비스의 토큰은 JWT로 유효성을 검사하지 않는 특수 형식을 사용할 수 있으며 소비자(Microsoft 계정) 사용자에 대해 암호화될 수도 있습니다. 토큰 읽기는 유용한 디버깅 및 학습 도구이지만 코드에서 이에 대한 종속성을 취하거나 제어하는 API용이 아닌 토큰에 대한 세부 사항을 가정하지 마세요.