Azure DevOps Services
중요
Azure DevOps OAuth는 더 이상 사용되지 않으며 2026년에 제거될 예정입니다. 이 설명서는 기존 Azure DevOps OAuth 앱에만 사용됩니다. 새 앱 등록은 2025년 4월부터 더 이상 허용되지 않습니다.
새 애플리케이션의 경우: Microsoft Entra ID OAuth 를 사용하여 Azure DevOps와 통합합니다.
기존 앱의 경우: 2026년 이전에 Microsoft Entra ID OAuth로 마이그레이션 을 계획합니다.
이 문서에서는 Azure DevOps OAuth 2.0이 기존 애플리케이션에서 작동하는 방식을 설명하고 앱 유지 관리 및 마이그레이션에 대한 지침을 제공합니다.
개요
Azure DevOps OAuth 2.0을 사용하면 애플리케이션이 사용자를 대신하여 Azure DevOps 리소스에 액세스할 수 있습니다. 이 서비스는 사용되지 않지만 기존 애플리케이션은 2026년까지 계속 작동합니다.
마이그레이션 권장 사항: Microsoft Entra ID OAuth 로의 마이그레이션 계획을 시작하여 지속적인 서비스와 향상된 보안 기능에 대한 액세스를 보장합니다.
필수 조건
Azure DevOps OAuth 애플리케이션을 사용하기 전에 다음을 수행합니다.
요구 사항 | 설명 |
---|---|
기존 앱 등록 | 기존 Azure DevOps OAuth 앱(새 등록이 2025년 4월에 중지됨) |
Azure DevOps 조직 | Azure DevOps Services 조직에 대한 액세스 |
HTTPS 콜백 URL | 애플리케이션에 대한 보안 콜백 URL |
마이그레이션 계획 | 2026년 이전에 Microsoft Entra ID OAuth로 마이그레이션하기 위한 전략 |
기존 Azure DevOps OAuth 앱 작업
1. 기존 앱 등록 관리
참고
새 앱 등록은 더 이상 허용되지 않습니다. 이 섹션은 등록된 기존 애플리케이션에만 적용됩니다.
기존 애플리케이션의 경우 앱 설정을 보고 관리할 수 있습니다.
Visual Studio 프로필로 이동하여 앱 등록에 액세스합니다.
구성된 범위를 검토하고 애플리케이션의 요구 사항과 일치하는지 확인합니다.
콜백 URL 구성을 확인하고 필요한 경우 업데이트합니다.
2026년 사용 중단 기한 전에 Microsoft Entra ID OAuth로 마이그레이션 타임라인을 계획합니다.
2. 앱 권한 부여
권한 부여 흐름은 기존 Azure DevOps OAuth 앱에 대해 동일하게 유지됩니다.
앱 매개 변수를 사용하여 사용자를 권한 부여 URL로 이동합니다.
https://app.vssps.visualstudio.com/oauth2/authorize ?client_id={app ID} &response_type=Assertion &state={state} &scope={scope} &redirect_uri={callback URL}
매개 변수 유형 설명 client_id
GUID 앱이 등록되었을 때 앱에 할당된 ID response_type
문자열 Assertion
이어야 합니다.state
문자열 콜백과 해당 권한 부여 요청의 상관 관계를 지정하는 생성된 문자열 값 scope
문자열 앱에 등록된 공백으로 구분된 범위입니다. 사용 가능한 범위 보기 redirect_uri
URL 앱의 콜백 URL입니다. 앱에 등록된 URL과 정확히 일치해야 합니다. 권한 부여 URL 예제:
https://app.vssps.visualstudio.com/oauth2/authorize ?client_id=00001111-aaaa-2222-bbbb-3333cccc4444 &response_type=Assertion &state=User1 &scope=vso.work%20vso.code_write &redirect_uri=https://fabrikam.azurewebsites.net/myapp/oauth-callback
사용자 권한 부여 후에 Azure DevOps는 권한 부여 코드를 사용하여 콜백 URL로 리디렉션합니다.
https://fabrikam.azurewebsites.net/myapp/oauth-callback ?code={authorization code} &state=User1
3. 액세스 토큰에 대한 Exchange 권한 부여 코드
권한 부여 코드를 사용하여 액세스 토큰을 요청하고 토큰을 새로 고칩니다.
세부 정보 요청
URL
POST https://app.vssps.visualstudio.com/oauth2/token
헤더
Content-Type: application/x-www-form-urlencoded
요청 본문
client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}
매개 변수 대체:
-
{0}
: 앱 등록에서 URL로 인코딩된 클라이언트 암호 -
{1}
: 콜백에서 URL로 인코딩된 권한 부여 코드 -
{2}
: 앱에 등록된 콜백 URL
C# 구현 예제
public string GenerateRequestPostData(string appSecret, string authCode, string callbackUrl)
{
return String.Format("client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}",
HttpUtility.UrlEncode(appSecret),
HttpUtility.UrlEncode(authCode),
callbackUrl
);
}
응답
{
"access_token": "{ access token for the user }",
"token_type": "{ type of token }",
"expires_in": "{ time in seconds that the token remains valid }",
"refresh_token": "{ refresh token to use to acquire a new access token }"
}
중요
새로 고침 토큰을 안전하게 저장 - 액세스 토큰은 빠르게 만료되지만 새로 고침 토큰을 사용하면 사용자 재인증 없이 새 액세스 토큰을 가져올 수 있습니다.
4. 액세스 토큰 사용
API 요청에 액세스 토큰을 전달자 토큰으로 포함합니다.
권한 부여 헤더 형식:
Authorization: Bearer {access_token}
API 요청 예제:
GET https://dev.azure.com/myaccount/myproject/_apis/build-release/builds?api-version=3.0
Authorization: Bearer {access_token}
5. 만료된 액세스 토큰 새로 고침
액세스 토큰이 만료되면 새로 고침 토큰을 사용하여 새 액세스 토큰을 가져옵니다.
요청:
POST https://app.vssps.visualstudio.com/oauth2/token
Content-Type: application/x-www-form-urlencoded
Content-Length: 1654
client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=refresh_token&assertion={1}&redirect_uri={2}
매개 변수 대체:
-
{0}
: URL로 인코딩된 클라이언트 암호 -
{1}
: URL로 인코딩된 새로 고침 토큰 -
{2}
: 앱에 등록된 콜백 URL
응답:
{
"access_token": "{ new access token }",
"token_type": "{ type of token }",
"expires_in": "{ time in seconds that the token remains valid }",
"refresh_token": "{ new refresh token }"
}
중요
새로 고침 토큰 업데이트 - 새로 고침마다 새 새로 고침 토큰이 발급됩니다. 새 토큰을 저장하고 이후 새로 고침 작업에 사용합니다.
코드 샘플
Azure DevOps 인증 샘플 리포지토리에서 작업 예제를 찾을 수 있습니다.
앱 비밀 관리
중요
비밀 회전은 보안에 중요합니다. 애플리케이션 비밀은 60일마다 만료되며 액세스를 유지하려면 순환해야 합니다.
Azure DevOps OAuth 앱은 이중 비밀을 지원하여 가동 중지 시간 회전을 0으로 설정합니다.
비밀 회전
Visual Studio 프로필 또는 등록 비밀 API를 통해 새 비밀을 생성합니다.
모달 대화 상자에서 작업을 확인합니다.
비밀 재생성을 확인하는 스크린샷.
이전 암호가 만료되기 전에 새 비밀을 사용하도록 애플리케이션을 업데이트합니다.
이전 비밀이 만료되기 전에 새 비밀을 철저히 테스트합니다.
새 비밀이 만료에 가까워지면 이 프로세스를 반복합니다.
긴급 비밀 해지
비밀이 손상된 경우:
- 프로필의 비밀을 즉시 다시 생성합니다.
- 새 비밀로 애플리케이션을 업데이트합니다.
- 애플리케이션 로그에서 무단 액세스를 모니터링합니다.
경고
비밀을 다시 생성하면 이전 비밀과 해당 비밀로 만든 모든 토큰이 즉시 무효화됩니다.
앱 삭제
경고
앱 등록을 삭제하면 앱 등록을 사용하는 모든 애플리케이션이 즉시 중단되고 연결된 모든 토큰이 무효화됩니다.
Azure DevOps OAuth 앱을 삭제하려면 다음을 수행합니다.
Visual Studio 프로필로 이동합니다.
드롭다운 메뉴에서 올바른 테넌트 선택
애플리케이션 및 서비스에서 앱을 찾습니다.
애플리케이션 등록 페이지에서 삭제 를 선택합니다.
모달 대화 상자에서 삭제를 확인합니다.
삭제 후 앱 및 모든 토큰이 즉시 작동을 중지합니다.
마이그레이션 계획
중요
지금 마이그레이션 계획을 시작합니다. Azure DevOps OAuth는 2026년에 제거될 예정입니다.
마이그레이션 검사 목록
- [ ] Microsoft Entra ID OAuth 설명서 검토
- [ ] 조직에서 Azure DevOps OAuth를 사용하여 모든 앱 식별
- [ ] 적절한 테스트 시간을 허용하는 마이그레이션 타임라인 계획
- [ ] Microsoft Entra ID OAuth를 지원하도록 애플리케이션 아키텍처 업데이트
- [ ] 비프로덕션 환경에서 마이그레이션 테스트
- [ ] 사용자 및 관련자에게 변경 내용 전달
- [ ] 2026년 마감일 이전 마이그레이션 완료
마이그레이션 혜택
향상된 보안 기능:
- 다단계 인증 지원
- 조건부 액세스 정책
- 고급 위협 방어
- 엔터프라이즈 ID 통합
더 나은 개발자 환경:
- MSAL(최신 인증 라이브러리)
- Microsoft 서비스에서 일관된 ID 플랫폼
- 더 나은 토큰 관리 및 캐싱
장기 지원:
- 지속적인 투자 및 기능 개발
- 엔터프라이즈 규정 준수 및 거버넌스 기능
자주 묻는 질문
Q: 새 Azure DevOps OAuth 앱을 계속 만들 수 있나요?
A: 아니요. 2025년 4월에 새 앱 등록이 중지되었습니다. 새 애플리케이션 에 Microsoft Entra ID OAuth 를 사용합니다.
Q: 기존 Azure DevOps OAuth 앱의 작동은 언제 중지되나요?
A: 기존 앱은 Azure DevOps OAuth가 2026년에 완전히 사용되지 않는 때까지 계속 작동합니다. 이 마감일 전에 마이그레이션을 계획합니다.
Q: 모바일 애플리케이션에서 OAuth를 사용할 수 있나요?
A: Azure DevOps OAuth는 웹 서버 흐름만 지원하고 클라이언트 비밀의 보안 스토리지가 필요하므로 모바일 앱에 적합하지 않습니다. Microsoft Entra ID OAuth는 더 나은 모바일 앱 지원을 제공합니다.
Q: 토큰을 요청할 때 HTTP 400 오류가 발생하면 어떻게 해야 하나요?
A: 일반적인 원인은 다음과 같습니다.
- 잘못된
Content-Type
헤더(반드시application/x-www-form-urlencoded
여야 합니다.) - 잘못된 형식의 요청 본문 매개 변수
- 잘못되었거나 만료된 권한 부여 코드
- 일치하지 않는 콜백 URL
Q: OAuth 토큰과 함께 HTTP 401 오류가 발생하지만 PAT가 없는 이유는 무엇인가요?
A: 조직 관리자가 다음 위치에서 OAuth를 통해 타사 애플리케이션 액세스를 사용하지 않도록 설정했는지 확인합니다. https://dev.azure.com/{your-org-name}/_settings/organizationPolicy
사용하지 않도록 설정하면 OAuth 권한 부여 흐름이 작동하지만 API 호출이 반환됩니다. TF400813: The user "<GUID>" is not authorized to access this resource.
Q: 테스트에 localhost를 사용할 수 있나요?
A: 예. Azure DevOps OAuth는 https://localhost
로컬 개발 및 테스트를 위한 콜백 URL을 지원합니다.
Q: 권한 부여 거부 및 해지를 처리하려면 어떻게 해야 하나요?
A: 다음을 위해 적절한 오류 처리를 구현합니다.
- 권한 부여 거부: 콜백에 인증 코드가 반환되지 않습니다.
- 해지된 권한 부여: API 호출은 401 오류를 반환합니다. 사용자로부터 권한 부여 다시 요청
Q: Azure DevOps OAuth와 Microsoft Entra ID OAuth의 차이점은 무엇인가요?
A:
- Azure DevOps OAuth: 사용되지 않는 Azure DevOps 관련 제한된 보안 기능
- Microsoft Entra ID OAuth: 최신 엔터프라이즈급, 향상된 보안, 장기 지원
다음 단계
기존 애플리케이션의 경우:
새 애플리케이션의 경우: