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_idGUID 앱이 등록되었을 때 앱에 할당된 ID response_type문자열 Assertion이어야 합니다.state문자열 콜백과 해당 권한 부여 요청의 상관 관계를 지정하는 생성된 문자열 값 scope문자열 앱에 등록된 공백으로 구분된 범위입니다. 사용 가능한 범위 보기 redirect_uriURL 앱의 콜백 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 프로필에서 또는 Registration Secret APIs를 통해.
모달 대화 상자에서 작업을 확인합니다.
비밀 재생성을 확인하는 스크린샷.
이전 암호가 만료되기 전에 새 비밀을 사용하도록 애플리케이션을 업데이트합니다.
이전 비밀이 만료되기 전에 새 비밀을 철저히 테스트합니다.
새 비밀이 만료에 가까워지면 이 프로세스를 반복합니다.
긴급 비밀 해지
비밀이 손상된 경우:
- 프로필의 비밀을 즉시 다시 생성합니다.
- 새 비밀로 애플리케이션을 업데이트합니다.
- 애플리케이션 로그에서 무단 액세스를 모니터링합니다.
경고
비밀을 다시 생성하면 이전 비밀과 해당 비밀로 만든 모든 토큰이 즉시 무효화됩니다.
앱 삭제
경고
앱 등록을 삭제하면 앱 등록을 사용하는 모든 애플리케이션이 즉시 중단되고 연결된 모든 토큰이 무효화됩니다.
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: 최신 엔터프라이즈급, 향상된 보안, 장기 지원
다음 단계
기존 애플리케이션의 경우:
새 애플리케이션의 경우: