소개
entra-emulator는 Microsoft Entra ID(Azure AD)를 로컬에서 에뮬레이트하는 단일 Go 바이너리입니다. MSAL 호환 OIDC/OAuth 2.0 v2.0 엔드포인트, 최소한의 읽기 전용 Microsoft Graph, 관리 REST API를 제공하여 클라우드 테넌트 없이도 로그인, 토큰 획득, 보호된 API 호출을 개발할 수 있습니다. 로컬 개발 전용 도구로, calvinchengx가 개발했으며 Apache-2.0 라이선스로 배포됩니다.
상세정보
인증 흐름 지원
- Authorization Code + PKCE (S256/plain)
- Client Credentials (/.default, 앱 역할 자동 부여)
- 갱신 토큰 회전 및 재사용 시 family-revocation
- Device Code (RFC 8628, 사용자 승인 페이지 포함)
- 프론트채널 로그아웃, OIDC UserInfo
연합 및 로그인 방법
- SAML 2.0 SP-initiated SSO 및 WS-Federation passive sign-in
- 계정 선택기/비밀번호 로그인
- 패스키(FIDO2/WebAuthn) 등록 및 인증
토큰 및 Graph
- 실제 RS256 서명된 JWT, Entra v2.0 클레임 형식(tid, oid, scp/roles, pairwise sub, ver: “2.0”, client_info)
- JWKS(키 ID = RFC 7638 thumbprint)로 검증 가능
- 선택적 클레임 및 그룹 클레임(Entra 스타일 오버로드 포함)
- Graph: /v1.0/me, /users, /groups 등 @odata 봉투 및 $top/$skiptoken 페이징
관리 API
- 사용자, 그룹(멤버십 포함), 앱 등록(리디렉션 URI, 시크릿, 스코프, 앱 역할) CRUD
- seed/reset, 상태 확인, 인증서 다운로드
Windows (winget)
- 명령 프롬프트에서
winget install calvinchengx.entra-emulator실행 - 설치 후
entra-emulator version으로 확인
macOS/Linux (Homebrew)
brew install calvinchengx/tap/entra-emulatorentra-emulator version으로 확인
Docker
docker run -p 8443:8443 -v entra-emulator-data:/app/data ghcr.io/calvinchengx/entra-emulator:latest직접 실행
- GitHub 릴리스에서 바이너리 다운로드 또는
go build ./cmd/entra-emulator - 실행:
./entra-emulator - 기본 주소: https://localhost:8443 (health: https://localhost:8443/health)
첫 실행 시 ./data/ 디렉토리에 SQLite 저장소, 자체 서명 TLS 인증서, RSA 서명 키가 생성됩니다. 하위 도메인을 사용하려면 ./entra-emulator hosts --apply로 호스트 파일을 업데이트하거나 ORIGIN_MODE=compat 환경 변수를 설정하여 모든 요청을 https://localhost:8443으로 처리할 수 있습니다.
Q: entra-emulator는 어떻게 설치하나요?
A: Windows에서는 winget install calvinchengx.entra-emulator, macOS/Linux에서는 brew install calvinchengx/tap/entra-emulator로 설치할 수 있습니다. Docker를 사용할 수도 있습니다.
Q: 기본 포트는 무엇인가요?
A: 기본 포트는 8443이며, PORT 환경 변수로 변경할 수 있습니다.
Q: 프로덕션에서 사용할 수 있나요?
A: 아니요. 이 도구는 로컬 개발 및 테스트 전용이며, 보안이나 성능 보장이 없습니다.
시스템 요구사항
Windows, macOS, Linux에서 실행 가능한 Go 바이너리입니다. Windows에서는 winget으로 설치할 수 있으며, Docker 이미지도 제공됩니다. x64 및 arm64 아키텍처를 지원합니다.


