글 작성 배경 및 목적
회사에서 프린트 시스템이 OneDrive에 접속하기 위해서 인증 앱(OAuth) 을 배포했는데, 스캔 설정을 테스트하는 도중 Office 365 인증이 실패했고, 멀티 테넌트 설정이 필요하다는 요청이 들어왔습니다. 하지만, 어째서 멀티 테넌트 설정이 필요한지 제대로 설명을 받지 못해서 곤란했습니다.
외부 접근을 허용하려면 그에 합당한 이유서를 작성해서 승인을 받아야 하기 때문에.. 😒
이번에는 단일 테넌트에서 멀티 테넌트로 설정을 변경해야 한다는 요청을 받은 상황에 어째서 설정을 변경해야 하는가에 대해서 조사한 내용을 포스팅 하려고 합니다. 원래라면 프린트 시스템 벤더측에서 해명해야 하는 부분인 것 같지만, 어쨌든..?
에러 메시지
Message: Application Id.. (skip) is not configured as a multi-tenant application.
Usage of the /common endpoint is not supported for such applications created after '10/15/2018'.
Use a tenant specific endpoint or configure the application to be multi-tenant
조사하기 전에 생각 정리
의문점
어째서 외부 테넌트의 접근을 허용해야 하는가?
OneDrive 에 접근하기 위해서 만든 Enterprise Application 은 조직의 테넌트에 존재하므로, 단일 테넌트 설정으로 인증이 가능하다고 생각했다. 하지만, 실제로 OneDrive 에 접근은 실패했고 엔드포인트 변경 또는 멀티 테넌트 설정이 필요하다고 했다.
OAuth 2.0 인증 흐름도 (추측)
- 복합기가 프린트 앱에 접근한다.
- 프린트 앱에 등록한 Enterprise Application 이 Entra ID 에 인증을 요청한다.
왠지 이 부분이 의심스럽다..🤔 - Entra ID 는 테넌트에 등록된 Application 정보를 확인하고 인증을 허가한다.
- 프린트 앱이 OneDrive 에 접근한다.
Entra ID 앱의 API 사용 권한
가설 세우기
가설 #1
프린트 앱에서 Microsoft 로그인을 외부 테넌트 계정을 사용했을 가능성
- 프린트 앱 스펙 상의 문제로 Entra ID 앱만으로 인증이 불가능할 수도 있다. 메뉴얼에서 GUI로 설정하던데..😒
- ‘API 사용 권한 요청 설정’ 을 위임된 권한으로 설정했기 때문에, 로그인한 사용자 (Micrsoft 계정) 로 API에 접근해야 한다.
하지만, 로그인한 Microsoft 계정이 조직 밖의 계정인 경우 멀티 테넌트 설정이 필요할 것 같다.
가설 #2
OneDrive 에 접근하기 위해서 OAuth 2.0 인증을 사용하는 경우, 멀티 테넌트 설정이 필수일 가능성
조사 내용
OAuth 2.0 인증 흐름
Microsoft Learn: OAuth 2.0 인증 코드 흐름
- 사용자가 인증을 시작한다.
- 앱 (여기서는 ‘Native App’) 이 사용자를 위한 웹 브라우저를 팝업을 띄운다.
- 이 브라우저 창에서 인증을 요청하고 어떤 정책 (예: 로그인 정책) 을 실행할지 알려준다.
- 사용자가 로그인 정보를 입력한다.
- 사용자는 브라우저 창에서 본인의 로그인 정보를 입력하거나, 등록된 인증 단계를 완료한다.
예: 비밀번호 입력, MFA 인증
- 사용자는 브라우저 창에서 본인의 로그인 정보를 입력하거나, 등록된 인증 단계를 완료한다.
- 앱이 인증 코드 (Authorization Code) 를 받는다.
- 사용자가 인증을 마치면, Microsoft 플랫폼이 ‘승인 코드’를 앱에 반환한다. (여기서 실패했나..? 🤔)
- 승인 코드는 사용자가 올바르게 인증되었다는 보증서 역할을 한다.
- 앱이 승인 코드를 사용해 토큰을 요청한다.
- 앱은 3. 에서 취득한 승인 코드를 사용해서 ‘Access Token’과 ‘Refresh Token’을 요청한다.
- Microsoft 플랫폼은 요청을 확인한 뒤, 두 개의 토큰을 반환한다.
– Access Token: 사용자의 데이터를 읽거나 변경할 때 사용하는 주요 키.
– Refresh Token: Access Token 이 만료될 때 새 토큰을 받을 수 있는 키.
- 앱이 Access Token 으로 데이터를 요청한다.
- 앱은 Access Token 을 이용해서 Web API (예: OneDrive) 와 통신한다.
- 이때 Access Token 은 인증 헤더에 포함되어 보안 데이터로 요청을 보낸다.
- Web API 는 토큰을 검증한 뒤, 요청된 데이터를 앱에 반환한다.
- Access Token 이 만료되었을 때.
- Access Token 은 보안을 위해 일정 시간이 지나면 만료된다.
- 앱은 만료된 Access Token 대신, Refresh Token 을 사용해서 새로운 Access Token 을 요청한다.
- 새로운 Access Token 을 받은 후, 데이터를 다시 안전하게 요청할 수 있다.
Microsoft 인증 플랫폼의 엔드 포인트
Microsoft Learn: Microsoft Entra ID에서 단일 테넌트 앱을 다중 테넌트로 변환
Stack Overflow: Application ” is not configured as a multi-tenant application
다중 테넌트 애플리케이션을 사용하면 애플리케이션에서 사용자가 어떤 테넌트인지 즉시 알 수 없으므로 요청을 테넌트의 엔드포인트로 보낼 수 없다. 대신 모든 Microsoft Entra 테넌트에 걸쳐 요청을 처리하는 중앙 허브 역할을 하는 공통 엔드포인트로 요청이 전송.
공용 엔드포인트: https://login.microsoftonline.com/common (또는, organizations)
참고:
/common 엔드 포인트는 2018년 10월 15일 이후에 생성된 앱에는 지원하지 않는다는 경고 메시지가 존재한다.
포스팅 작성 시점에서 새롭게 앱을 등록하여 테스트 했을 때는, /common 엔드 포인트를 사용이 가능한 것 처럼 보였지만, 아래의 메시지가 표시되는 경우가 있다고 한다. /organizations 를 사용하는 것을 권장한다.
Application '(app ID)' is not configured as a multi-tenant application. Usage of the /common endpoint is not supported for such applications created after '10/15/2018'. Use a tenant-specific endpoint or configure the application to be multi-tenant.
‘/common’ 테스트 캡쳐 화면
https://login.live.com 으로 리디렉션 되는 것을 확인했다.
인증 및 인과, 토큰 취득에 사용되는 URL은 2가지 방법으로 지정할 수 있다.
- 공용 엔드포인트를 지정하여, 로그인 사용자의 테넌트로 리디렉션하는 방법
https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize
https://login.microsoftonline.com/organizations/oauth2/v2.0/token
외부 테넌트의 사용자가 접근하려면 공용 엔드포인트를 사용을 고려해야한다.
왜냐하면, 유저 리스트에 존재하지 않는 사용자이므로 해당 사용자를 내부 테넌트의 게스트 유저로 추가하지 않으면 접근이 거부되기 때문이다. - 특정 테넌트 엔드포인트를 지정하여, 해당 테넌트로 다이렉트 접근하는 방법
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token
내부 테넌트의 사용자 (게스트 유저 포함) 만 접근을 허용하기 위한 방법이라고 생각된다.
사용자 리스트에 로그인 유저가 존재하지 않을 경우, 아래와 같은 에러가 표시된다.
AADSTS50020: User account 'xxx' from identity provider 'https://sts.windows.net/{Tenant_Id}/' does not exist in tenant '{Tenant_Name}' and cannot access the application '47a22208-96fc-42cb-892a-a6c2c257b1a9'(OneDrive Auth) in that tenant. The account needs to be added as an external user in the tenant first. Sign out and sign in again with a different Azure Active Directory user account.
외부 사용자 접근 테스트
아래의 조건으로 외부 사용자 접근 테스트를 실시했다.
- 다른 테넌트의 유저는 게스트 유저로 추가하지 않는다.
- Entra ID 앱의 계정 유형 (단일 및 멀티 테넌트 설정) 만 변경한다.
- 아래의 공용 엔드포인트를 사용한다.
https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize
https://login.microsoftonline.com/organizations/oauth2/v2.0/token
단일 테넌트 설정# 실패
멀티 테넌트 설정# 성공
마무리
OAuth 2.0 인증 흐름도 수정
1.프린트 앱 설정에서 OneDrive API 를 이용하기 위한 인증 및 토큰 발행을 진행
Entra ID 인증 앱의 서비스 주체 정보를 입력한다.
# External users do not have read permissions for the app information of the tenant.
client_id=47a22208-96fc-42cb-892a-a6c2c257b1a
client_secret=2Aw8Q~SN9DHEJ.zk2W6j5aM5RMCLKcs1BqFXHaEk
grant_type=authorization_code
redirect_uri=https://oauth.pstmn.io/v1/callback
scope=Sites.ReadWrite.All
2. 외부 사용자 계정으로 로그인한다.
User: external_user@contoso.com
3. 인증이 완료되고, Entra ID (Azure AD) 는 Entra ID 인증 앱에 Authorization Code를 발행한다.
4. Entra ID 인증 앱은 Authorization Cdoe 를 가지고 토큰 발행을 요청한다.
5. Entra ID (Azure AD) 는 Access Token 및 Refresh Token 을 발행한다.
6. Entra ID 인증 앱은 Access Token 을 헤더에 포함하여 OneDrive API 로 데이터를 요청한다.
Access Token 이 만료되기 전까지 Step. 2-4 는 생략된다.
7. OneDrive API 는 Access Token 을 검증한 뒤, 요청에 응답한다.
가설 검토하기
가설 #1
프린트 앱에서 Microsoft 로그인을 외부 테넌트 계정을 사용했을 가능성
- 프린트 앱 스펙 상의 문제로 Entra ID 앱만으로 인증이 불가능할 수도 있다. 메뉴얼에서 GUI로 설정하던데..😒
- ‘API 사용 권한 요청 설정’ 을 위임된 권한으로 설정했기 때문에, 로그인한 사용자 (Micrsoft 계정) 로 API에 접근해야 한다.
하지만, 로그인한 Microsoft 계정이 조직 밖의 계정인 경우 멀티 테넌트 설정이 필요할 것 같다.
프린트 앱의 인증 과정을 보면, 앱의 인증 버튼을 클릭하면, login.microsoftonline.com/common/oauth2/v2.0/authorize 브라우저가 표시되는 것을 확인했다. 즉, OpenID Connect 서비스를 이용해 사용자 계정을 통한 인증방식인 것이 100% 확실하다.
아마도 테스트에서 외부 테넌트의 사용자 계정을 사용했을 것이다. ‘/common’ 엔드포인트를 사용하고 있더라도, 내부 사용자 계정이라면 인증 및 토큰 취득이 가능했을 것이기 때문에..
내가 착각했던 점은 Entra ID 앱의 Client ID와 Secret만 공유했으니 테넌트 내부에서 서비스 주체 인증이 가능할 것이라고 생각했던 것.그러나 프린트 앱의 인증 방식은 반드시 사용자 계정을 필요로 하기 때문에, 외부 접근 허가에 대해서 사전에 고려할 필요가 있었던 것이다.
가설 #2
OneDrive 에 접근하기 위해서 OAuth 2.0 인증을 사용하는 경우, 멀티 테넌트 설정이 필수일 가능성
OAuth 2.0 인증을 사용하는 것과는 관계없다. 사용자 계정이 어느 테넌트에 등록되어 있는가가 중요하다.
팁👍
SAML, OAuth 2.0 인증방식 이외에도 사용자 계정, 서비스 주체 이용 여부에 대해서도 확인이 필요하다.