퍼블릭 클라이언트 및 기밀 클라이언트 응용 프로그램
MSAL(Microsoft 인증 라이브러리)은 퍼블릭 클라이언트와 기밀 클라이언트라는 두 가지 형식의 클라이언트를 정의합니다. 클라이언트는 ID 공급자가 할당한 고유 식별자가 있는 소프트웨어 엔터티입니다. 클라이언트 유형은 권한 부여 서버를 사용하여 안전하게 인증하고 중요한 ID 증명 정보를 보유하여 액세스 범위 내에서 사용자에게 액세스하거나 알 수 없도록 하는 기능으로 구분됩니다.
공용 클라이언트 앱 | 기밀 클라이언트 앱 |
---|---|
데스크톱 앱 | 웹앱 |
브라우저리스 API | Web API |
모바일 앱 | 서비스/디먼 |
공용 클라이언트 및 기밀 클라이언트 권한 부여
지정된 클라이언트의 공개 또는 기밀 특성을 검사할 때 해당 클라이언트가 권한 부여 서버에 대한 ID를 증명할 수 있는 능력을 평가하고 있습니다. 이는 권한 부여 서버가 액세스 토큰을 발급하기 위해 클라이언트의 ID를 신뢰할 수 있어야 하기 때문에 중요합니다.
공용 클라이언트 애플리케이션은 데스크톱, 브라우저 없는 API, 모바일 또는 클라이언트 쪽 브라우저 앱과 같은 디바이스에서 실행할 수 있습니다. 애플리케이션 비밀을 안전하게 유지하기 위해 신뢰할 수 없으므로 사용자를 대신하여 웹 API에만 액세스할 수 있습니다. 지정된 앱의 소스 또는 컴파일된 바이트 코드가 읽거나 디스어셈블되거나 신뢰할 수 없는 당사자가 검사할 수 있는 모든 위치에서 전송될 때마다 퍼블릭 클라이언트입니다. 또한 공용 클라이언트 흐름만 지원하고 구성 시간 비밀을 보유할 수 없으므로 클라이언트 비밀을 가질 수 없습니다.
기밀 클라이언트 애플리케이션은 웹앱, 웹 API 앱 또는 서비스/디먼 앱과 같은 서버에서 실행할 수 있습니다. 사용자 또는 공격자가 액세스하기 어렵기 때문에 구성 시간 비밀을 적절히 보유하여 ID 증명을 어설션할 수 있습니다. 클라이언트 ID는 웹 브라우저를 통해 노출되지만, 비밀은 백채널에서만 전달되고 직접 노출되지 않습니다.
언제 앱 등록에서 공용 클라이언트 흐름을 허용하도록 설정해야 하나요?
빌드하는 클라이언트 애플리케이션의 유형을 결정한 후 앱 등록에서 퍼블릭 클라이언트 흐름을 사용하도록 설정할지 여부를 결정할 수 있습니다. 기본적으로 사용자 또는 개발자가 공용 클라이언트 애플리케이션을 빌드하고 다음 OAuth 권한 부여 프로토콜 또는 기능을 사용하지 않는 한 앱 등록에서 공용 클라이언트 흐름을 사용하지 않도록 설정해야 합니다.
OAuth 권한 부여 프로토콜/기능 | 퍼블릭 클라이언트 애플리케이션 유형 | 예제/참고 항목 |
---|---|---|
기본 인증 | 디자인 요소, 로고 배치 및 레이아웃을 포함하여 사용자 인터페이스를 완전히 사용자 지정해야 하는 애플리케이션을 Microsoft Entra 외부 ID 일관되고 브랜드화된 모양을 보장합니다. | 참고: 네이티브 인증은 Microsoft Entra 외부 ID 테넌트에서 앱 등록에만 사용할 수 있습니다. 여기서 자세히 알아보세요. |
디바이스 코드 흐름 | 스마트 TV, IoT 디바이스 또는 프린터와 같이 입력이 제한된 디바이스에서 실행되는 애플리케이션 | |
리소스 소유자 암호 자격 증명 흐름 | 사용자가 Entra 호스팅 로그인 웹 사이트로 리디렉션하고 Entra가 사용자 암호를 안전하게 처리하도록 하는 대신 사용자가 직접 입력하는 암호를 처리하는 애플리케이션. | ROPC 흐름을 사용하지 않는 것이 좋습니다. 대부분의 시나리오에서는 권한 부여 코드 흐름과 같은 보다 안전한 대안을 사용할 수 있으며 권장됩니다. |
Windows 통합 인증 흐름 | 웹 계정 관리자 대신 Windows 통합 인증 흐름을 사용하여 Windows 또는 Windows 도메인에 연결된 컴퓨터(Microsoft Entra ID 또는 Microsoft Entra 조인됨)에서 실행되는 데스크톱 또는 모바일 애플리케이션 | 사용자가 Microsoft Entra 자격 증명으로 Windows PC 시스템에 로그인한 후 자동으로 로그인되어야 하는 데스크톱 또는 모바일 애플리케이션 |
비밀을 확인하고 ID를 증명하는 것의 중요성
다음은 클라이언트가 권한 부여 서버에 대한 ID를 증명할 수 있는 방법의 몇 가지 예입니다.
- Azure 리소스에 대한 관리 ID – 앱 전용 인증 시나리오의 경우 Azure에서 빌드하는 애플리케이션 및 서비스 개발자는 비밀 관리, 회전 및 보호를 플랫폼 자체에 오프로드하는 옵션이 있습니다. 관리 ID를 사용하면 Azure 리소스를 사용하여 ID가 제공되고 삭제되며 전역 관리자를 포함한 누구도 기본 자격 증명에 액세스할 수 없습니다. 관리 ID를 사용하면 비밀 유출 위험을 방지하고 공급자가 보안을 처리하도록 할 수 있습니다.
- 클라이언트 ID 및 비밀 – 이 패턴에서는 클라이언트를 등록할 때 권한 부여 서버에서 값 쌍을 생성합니다. 클라이언트 ID는 애플리케이션을 식별하는 공용 값이지만 클라이언트 암호는 애플리케이션의 ID를 증명하는 데 사용되는 기밀 값입니다.
- 인증서 소유 증명 – PKI(공개 키 인프라)는(X.509 등과 같이 표준을 포함하는) 인터넷을 통한 보안 통신을 가능하게 하고 인터넷 개인 정보 보호의 중추를 형성하는 기본 기술입니다. PKI는 온라인 통신에 관련된 당사자의 ID를 확인하는 디지털 인증서를 발급하는 데 사용되며 웹 트래픽을 보호하는 데 널리 사용되는 HTTPS와 같은 프로토콜을 구동하는 기본 기술입니다. 마찬가지로 인증서를 사용하여 서비스 간에 상호 인증을 사용하도록 설정하여 Azure에서 S2S(서비스 간) 통신을 보호할 수 있습니다. 여기에는 각 서비스가 해당 ID를 증명하는 수단으로 서로 인증서를 제시하는 작업이 포함됩니다.
- 서명된 어설션 – 워크로드 ID 페더레이션에 사용됩니다. 서명된 어설션을 사용하여 Microsoft ID 플랫폼과 신뢰할 수 있는 타사 ID 공급자 토큰을 교환하여 Microsoft Entra 보호 리소스를 호출하는 액세스 토큰을 가져올 수 있습니다. 워크로드 ID 페더레이션을 사용하여 Azure Kubernetes Service, Amazon Web Services EKS, GitHub Actions 등을 비롯한 다양한 페더레이션 시나리오를 사용하도록 설정할 수 있습니다.
클라이언트 ID 증명은 언제 중요합니까?
중요한 데이터 또는 리소스에 대한 액세스 권한을 부여하기 전에 클라이언트 애플리케이션의 신뢰성과 권한 부여를 모두 확인해야 하는 경우 클라이언트 ID 증명이 중요합니다. 일부 사례:
- API 액세스 제어 – 요금제(예: 청구) 또는 중요한 데이터 또는 리소스를 노출하는 API가 있는 경우 액세스 권한을 부여하기 전에 클라이언트의 ID를 확인합니다. 예를 들어 이는 권한 있는 애플리케이션만 API에 액세스할 수 있도록 하고 데이터 통신 API 사용량에 대해 올바른 고객에게 요금이 청구되도록 하는 경우에 중요합니다.
- 앱 가장으로부터 사용자 보호 – 중요한 데이터 또는 서비스에 액세스하는 서비스 배포 사용자 연결 애플리케이션(예: 백 엔드 기반 웹앱)이 있는 경우 클라이언트 비밀을 사용하여 해당 애플리케이션에서 사용하는 리소스를 보호하면 악의적인 행위자가 합법적인 클라이언트를 피싱하여 데이터를 유출하거나 액세스를 남용하는 것을 방지할 수 있습니다.
- S2S 통신 – 서로 통신해야 하는 여러 백 엔드 서비스(예: 다운스트림 API)가 있는 경우 각 서비스의 ID를 확인하여 해당 기능을 수행하는 데 필요한 리소스에만 액세스할 수 있는 권한이 있는지 확인할 수 있습니다.
일반적으로 클라이언트 ID 증명은 사용자와 독립적으로 또는 사용자 외에 클라이언트를 인증하고 권한을 부여해야 하는 경우에 중요합니다.
기밀 클라이언트: 비밀 관리 모범 사례
관리 ID를 사용하여 배포 및 보안 – 관리 ID는 Microsoft Entra 인증을 지원하는 리소스에 연결할 때 사용할 애플리케이션에 대해 Microsoft Entra ID에 자동으로 관리 ID를 제공합니다. 애플리케이션은 관리 ID를 사용하여 자격 증명을 관리할 필요 없이 Microsoft Entra ID 앱 전용 토큰을 가져올 수 있습니다. 이렇게 하면 보안 및 복원력을 높이면서 비밀 관리와 관련된 많은 복잡성을 제거할 수 있습니다. 관리 ID를 사용하는 경우 대부분의 경우 다음 모범 사례가 모두 이미 처리되어 있지는 않습니다.
보안 스토리지 – Key Vault 또는 암호화된 구성 파일 같은 보안 위치에 클라이언트 비밀을 저장합니다. 일반 텍스트 또는 체크 인 파일로 버전 제어 시스템에 클라이언트 비밀을 저장하지 마세요.
액세스 제한 - 권한 있는 담당자만 클라이언트 비밀에 대한 액세스를 제한합니다. 역할 기반 액세스 제어를 사용하여 클라이언트 비밀에 대한 액세스를 운영 업무를 수행하는 데 필요한 사용자로만 제한합니다.
클라이언트 비밀 순환 – 필요에 따라 또는 예약된 기준에서 클라이언트 비밀 순환은 손상된 비밀이 무단 액세스를 얻는데 사용될 위험을 최소화 할 수 있습니다. 적용된 경우 키를 계속 사용하도록 제안하는 기간은 사용되는 암호화 알고리즘의 강도 및/또는 표준 또는 규정 준수 사례를 준수하는 데 영향을 받습니다.
긴 비밀 및 강한 암호화 사용 – 이전 지점과 긴밀하게 관계가 있습니다. 전송 중(유선) 및 미사용(디스크 에서)를 위한 강한 암호화 알고리즘을 사용하면 높은 엔트로피 비밀이 무차별 암호로 유지되지 않도록 할 수 있습니다. AES-128 이상과 같은 알고리즘은 미사용 데이터를 보호하는 데 도움이 될 수 있지만 RSA-2048 이상은 전송 중인 데이터를 효율적으로 보호하는 데 도움이 될 수 있습니다. 끊임없이 진화하는 사이버 보안 특성 때문에 보안 전문가와 상의하고 알고리즘 선택을 주기적으로 검토하는 것이 항상 모범 사례입니다.
비밀 하드 코딩 방지 – 원본 코드에서 클라이언트 비밀을 하드 코딩 하지 마세요. 소스 코드에서 비밀을 방지하면 소스 코드에 액세스하는 잘못된 행위자의 값을 최소화할 수 있습니다. 또한 이러한 비밀이 실수로 안전하지 않은 리포지토리로 푸시되거나 소스 액세스를 가질 수 있지만 비밀 액세스는 할 수 없는 프로젝트 기여자가 사용할 수 있게 되는 것을 방지할 수 있습니다.
유출된 비밀에 대한 리포지토리 모니터링 – 소스 코드를 처리할 때 잘못된 체크 인이 발생하는 것은 불행한 사실입니다. Git 사전 커밋 후크는 우발적인 체크 인을 방지하는 데 권장되는 방법이지만 모니터링 대신 사용할 수는 없습니다. 리포지토리의 자동화된 모니터링은 유출된 비밀을 식별할 수 있으며 손상된 자격 증명을 순환하는 계획을 통해 보안 인시던트를 줄이는 데 도움이 될 수 있습니다.
의심스러운 활동 모니터링 – 클라이언트 비밀과 관련한 의심스러운 활동 로그 및 감사 추적을 모니터링 합니다. 가능한 경우 자동화된 경고 및 응답 프로세스를 사용하여 직원에게 알리고 클라이언트 비밀과 관련된 비정상적인 활동에 대한 비상 사태를 정의합니다.
클라이언트 비밀을 염두해 두고 애플리케이션 설계 – 보안 모델은 가장 약한 링크 만큼만 강력합니다. 보안 자격 증명 또는 토큰을 기밀 클라이언트에서 공개 클라이언트로 전달하지 마세요. 이 경우 클라이언트 비밀 데이터를 공용 클라이언트로 이동하여 기밀 클라이언트를 가장할 수 있습니다.
신뢰할 수 있는 원본의 최신 라이브러리 및 SDK 사용 – Microsoft ID 플랫폼은 애플리케이션을 안전하게 유지하면서 생산성을 높이도록 설계된 다양한 클라이언트 및 서버 SDK 및 미들웨어를 제공합니다. Microsoft.Identity.Web 같은 라이브러리는 Microsoft ID 플랫폼의 웹앱 및 API에 인증 및 권한 부여를 추가하는 작업을 간소화합니다. 종속성을 업데이트된 상태로 유지하면 애플리케이션 및 서비스가 최신 보안 혁신 및 업데이트를 활용할 수 있습니다.
클라이언트 유형 및 해당 기능 비교
다음은 공용 클라이언트 앱과 기밀 클라이언트 앱 간의 몇 가지 유사점과 차이점입니다.
- 두 앱 유형 모두 사용자 토큰 캐시를 유지하고 토큰을 자동으로 획득할 수 있습니다(토큰이 캐시에 있는 경우). 기밀 클라이언트 앱에는 앱 자체에서 획득한 토큰에 대한 앱 토큰 캐시도 있습니다.
- 두 앱 유형 모두 사용자 계정을 관리하고 사용자 토큰 캐시에서 계정을 가져오거나, 식별자에서 계정을 가져오거나, 계정을 제거할 수 있습니다.
- MSAL에서 퍼블릭 클라이언트 앱에는 별도의 인증 흐름을 통해 토큰을 획득하는 네 가지 방법이 있습니다. 기밀 클라이언트 앱에는 토큰을 획득하는 세 가지 방법과 ID 공급자 권한 엔드포인트의 URL을 계산하는 한 가지 방법이 있습니다. 클라이언트 ID는 애플리케이션 생성 시 한 번 전달되며 앱이 토큰을 획득할 때 다시 전달할 필요가 없습니다. 자세한 내용은 토큰 획득을 참조하세요.
공용 클라이언트는 보호된 리소스에 대한 사용자 위임 액세스를 사용하도록 설정하는 데 유용하지만 자체 애플리케이션 ID를 증명할 수는 없습니다. 반면 기밀 클라이언트는 사용자 및 애플리케이션 인증 및 권한 부여를 모두 수행할 수 있으며, 비밀을 공용 클라이언트 또는 다른 타사와 공유하지 않도록 보안을 염두에 두고 빌드해야 합니다.
S2S 통신과 같은 일부 경우 관리 ID와 같은 인프라는 서비스의 개발 및 배포를 간소화하는 데 크게 도움이 되며 일반적으로 비밀 관리와 관련된 복잡성을 많이 제거합니다. 관리 ID를 사용할 수 없는 경우 비밀을 확보하고 관련 보안 인시던트와 대응하기 위한 정책, 예방 조치 및 비상 사태가 있어야 합니다.
참고 항목
애플리케이션 구성 및 인스턴스화에 대한 자세한 내용은 다음을 참조하세요.