GitHub 앱이란 무엇인가요?
여기서는 GitHub 앱의 정의와 작동 방식 및 이를 활용한 워크플로 개선 방법을 설명합니다. 다른 사용자가 작성한 솔루션을 채택할 때도 자신의 필요에 맞는 솔루션을 개발할 때도, 우리는 언제나 프로세스를 개선할 수 있습니다.
GitHub API를 통한 플랫폼 확장
GitHub는 개발자가 플랫폼에서 다양한 작업을 수행할 수 있게 하는 강력한 API를 제공합니다. REST 엔드포인트를 통해 노출되므로 어떤 플랫폼이나 프로그래밍 언어와도 쉽게 통합할 수 있습니다. 하지만 API 액세스는 독립적으로 사용할 수는 없습니다. 기능을 다른 사람과 공유하려면 개발자는 여전히 이를 앱으로 패키징한 다음, 사용할 수 있도록 게시해야 합니다.
워크플로에 OAuth 앱 또는 GitHub 앱을 통합하려고 선택할 때 고려해야 할 몇 가지 요소가 있습니다. 이 섹션에서는 GitHub 앱 및 OAuth 앱, 사용법 및 권한의 차이점, 이벤트 구독을 소개합니다.
GitHub 워크플로를 사용자 지정하는 경우 사용자 지정 스크립트 작성, 자체 OAuth 앱 만들기 및 권한 부여, GitHub Marketplace에서 제공되는 GitHub 앱 설치와 같은 여러 가지 기능을 사용할 수 있습니다. 일반적으로 스크립트는 이러한 일회성 작업에 가장 잘 사용할 수 있습니다. 더 자주 실행해야 하는 작업의 경우 OAuth 및 GitHub 앱의 자동화를 사용하여 사용자와 팀이 시간을 절약하고 워크플로 내에서 최적의 보안 수준을 유지할 수 있습니다. GitHub 앱 또는 OAuth 앱 중 어떤 것을 사용할지 결정하는 데 영향을 미치는 여러 가지 차이점이 있습니다. 이런 차이를 미리 이해하면 골칫거리와 재작업이 줄이고, 워크플로 내에서 특정 사용 사례에 적합한 애플리케이션을 찾을 수 있습니다.
이 섹션의 끝 부분에서는 GitHub 앱과 OAuth 앱 간의 차이점을 이해하고, 적절한 상황에 맞는 앱을 선택하는 방법을 알아봅니다.
액세스 및 사용 권한 부여
앱이 GitHub 리포지토리에 액세스하도록 허용해야 하는 가장 중요한 이유는 이 리포지토리는 권한이 있어야 작동한다는 사실입니다. 쉽게 신뢰할 수 있는 앱도 있지만 수상한 앱도 존재합니다. 앱에 어떤 권한을 부여하는지 항상 파악하고 있어야 합니다.
참고
모든 앱은 고유한 API 키를 사용하여 리포지토리의 데이터에 대한 요청을 수행합니다. 액세스 권한을 부여할 때는 사용자가 권한을 부여하는 키가 이러한 키가 됩니다. 리포지토리 설정에서 언제든지 앱 키에 대한 액세스 권한을 철회할 수 있습니다.
OAuth 앱 비교
OAuth 앱은 사용자를 대신하여 GitHub 데이터에 액세스하는 방법을 제공합니다. 사용자를 대신하여 작동하기 때문에 GitHub 라이선스 사용자 수를 소비한다는 사실을 알아 두어야 합니다. 개인 계정에서 또는 관리자 액세스 권한이 있는 경우에는 조직 수준에서 OAuth 앱을 만들고 등록할 수 있습니다. GitHub와 통합된 OAuth 앱은 조직 또는 리포지토리에 필요한 액세스 유형을 공개합니다. 사용자는 OAuth 앱에 ‘권한을 부여’하여 앱에 데이터 읽기 또는 수정과 같은 인증된 사용자 역할을 하는 역할을 부여합니다. 이 방법은 기본적으로 사용자로서 GitHub 데이터를 읽고, 쓰고, 편집하도록 하는 방법입니다. 또한 권한 부여는 사용자가 액세스할 수 있는 리소스로 제한되지만, OAuth 앱은 사용자가 사용할 수 있는 모든 리소스에도 액세스할 수 있다는 점에 유의해야 합니다.
참고
액세스 수준은 토큰의 범위(사용자, 조직, 리포지토리)에 의해 제한됩니다.
OAuth 앱 액세스 제한이 있는 조직의 경우 관리자는 애플리케이션을 사용하도록 승인을 부여할 수 있습니다. 이벤트 구독을 사용하여 OAuth 앱은 발생하는 작업에 응답합니다.
GitHub 앱
이와 반대로 GitHub 앱은 개인 계정, 사용자가 소유하는 조직 또는 관리자 액세스 권한이 있는 특정 리포지토리에 설치됩니다. GitHub 앱은 OAuth 앱을 사용할 때처럼 개별 사용자가 아닌 서비스로 설치되고 GitHub와 상호 작용합니다. GitHub 앱의 장점은 OAuth 앱과는 달리 GitHub 라이선스 사용자 수를 소비하지 않는다는 것입니다.
GitHub 앱은 JWT 토큰(JSON Web Token)에 서명하는 데 사용되는 프라이빗 키를 통해 애플리케이션 자체를 대신하여 데이터에 액세스합니다. GitHub 앱은 특정 리포지토리에 설치되기 때문에 사용자는 앱에서 액세스할 수 있는 리포지토리를 선택하여 앱에서 액세스할 수 있는 데이터 양을 제한할 수 있습니다. 액세스 권한은 GitHub 앱이 API를 통해 액세스할 수 있는 리소스를 정의합니다. OAuth 앱과 달리 GitHub 앱에는 리포지토리 데이터, 문제, 끌어오기 요청에 대한 사용자 지정 권한이 있습니다. 이를 통해 보다 세부적인 액세스 권한을 부여하여 앱이 액세스가 허용된 리포지토리만 읽고 쓰도록 제한할 수 있습니다. 조직의 소유자만 조직에서 GitHub 앱의 설정을 관리할 수 있습니다.
GitHub 앱은 GitHub Marketplace에서 찾아 설치할 수 있습니다. GitHub 앱을 검색하는 경우 일부 앱에 확인된 배지가 있다는 점을 기억하세요. 이 배지는 이 앱이 해당 도메인에 대해 인증된 소유권이 있고 GitHub 지원으로 메일 주소가 확인된 조직이 앱을 소유하며, 조직에 2단계 인증이 필요함을 나타냅니다.
- 관리자는 리포지토리 관리, 검사, 리포지토리 콘텐츠, 배포 및 문제에 대한 권한을 부여할 수 있습니다(‘관리자 변경에는 사용자 승인이 필요함’).
- 관리자는 앱 사용자에게 다른 사용자, 메일, 팔로워, GPG 키, Git SSH 키, 별 표시, 감시를 차단할 수 있는 권한을 부여할 수 있습니다(‘관리자 변경에는 사용자 동의가 필요함’).
- 이벤트 구독: 보안 권고, 검사 도구 모음, 만들기, 배포, 포크, 레이블, 멤버, 체크 인, 커밋 설명, 삭제, 배포 상태, 마일스톤, 멤버 자격, 조직(‘관리자가 GH 앱 UI에서 구성하며 변경할 수 있음’)
GitHub 앱과 OAuth 앱 중에서 선택
GitHub 앱은 경우에 따라 워크플로에 통합할 수 있는 이상적인 방법이지만, 대규모 조직에서는 자동화를 위해 기존의 OAuth 앱 사용에서 전환하는 것이 어려울 수 있습니다. 예를 들어 보안 정책 제한 때문에 이러한 도구를 사용하도록 선택하는 관리자의 옵션이 제한될 수 있습니다.
참고
시스템 관리자는 계속해서 보안 정책을 준수하면서 이러한 애플리케이션을 활용하여, 개발자들과 함께 자동화에 가장 적합한 옵션을 찾아야 합니다.
어떤 앱이 상황에 적절한 솔루션지 결정하기 위해 고려해야 할 몇 가지 중요한 사항은 다음과 같습니다.
- 앱이 사용자 역할을 하도록 하시겠습니까?
- 속도 제한은 어떻게 되나요?
- 앱이 조직 및 리포지토리에 어떤 액세스 권한을 갖도록 하시겠습니까?
- 이 앱이 보안 정책을 준수하나요?
다음은 GitHub 앱 또는 OAuth 앱 중에서 선택할 때 고려해야 할 몇 가지 주요 특징과 차이점입니다.
GitHub 앱 | OAuth 앱 비교 |
---|---|
GitHub 앱을 설치하면 앱에 선택한 사용자 또는 조직 계정의 리포지토리에 대한 액세스 권한이 부여됩니다. | OAuth 앱에 권한을 부여하면 사용자가 액세스할 수 있는 리소스(예: 액세스할 수 있는 리포지토리)에 앱이 액세스할 수 있게 됩니다. |
설치 액세스 토큰은 앱 작성자가 선택한 권한이 있는 지정된 리포지토리로 제한됩니다. | OAuth 액세스 토큰은 범위를 통해 제한됩니다. |
설치 토큰은 앱을 GitHub 앱 봇으로 식별합니다. | 액세스 토큰은 앱에 토큰을 부여한 사용자로 앱을 식별합니다. |
GitHub 앱에는 필요한 권한에 대한 액세스만 요청할 수 있는 대상 사용 권한이 있습니다. | OAuth 앱은 세분화된 권한을 사용할 수 없습니다. |
GitHub 앱에는 조직 애플리케이션 정책이 적용되지 않습니다. GitHub 앱은 조직 소유자가 부여한 리포지토리에만 액세스할 수 있습니다. | 조직 애플리케이션 정책이 활성화된 경우 조직 소유자만 OAuth 앱 설치 권한을 부여할 수 있습니다. 설치된 경우 OAuth 앱은 승인된 조직 내에서 조직 소유자가 보유한 토큰에 표시되는 모든 것에 대한 액세스 권한을 얻습니다. |
속도 제한 증가는 GitHub 앱 수준(모든 설치에 영향을 줌) 및 개별 설치 수준에서 부여할 수 있습니다. | OAuth 앱별로 속도 제한 증가가 부여됩니다. 해당 OAuth 앱에 부여된 모든 토큰은 증가된 제한을 받습니다. |
GitHub 앱은 사용자를 대신하여 인증할 수 있으며, 이를 사용자-서버 요청이라고 합니다. 권한을 부여하는 흐름은 OAuth 앱 권한 부여 흐름과 동일합니다. 사용자-서버 토큰은 만료될 수 있으며 새로 고침 토큰으로 갱신할 수 있습니다. | OAuth 앱에서 사용하는 OAuth 흐름은 사용자를 대신하여 OAuth 앱에 권한을 부여합니다. 이는 GitHub 앱 사용자-서버 권한 부여에 사용되는 것과 동일한 흐름입니다. |
GitHub 앱은 리포지토리 콘텐츠 권한을 요청하고 설치 토큰을 사용하여 HTTP 기반 Git을 통해 인증합니다. | OAuth 앱은 write:public_key 범위를 요청하고 API를 통해 배포 키를 만듭니다. 그런 다음 해당 키를 사용하여 Git 명령을 수행할 수 있습니다. |
애플리케이션 액세스 및 사용 권한 관리
앱이 GitHub 리포지토리에 액세스하도록 허용해야 하는 가장 중요한 이유는 이 리포지토리는 권한이 있어야 작동한다는 사실입니다. 쉽게 신뢰할 수 있는 앱도 있지만 수상한 앱도 존재합니다. 앱에 어떤 권한을 부여하는지 항상 파악하고 있어야 합니다.
GitHub 앱 또는 OAuth 앱을 사용하도록 결정하는 것은 앱에서 액세스하려는 액세스 수준에 따라 달라질 수 있습니다. 일반적으로 팀에서 가장 작은 범위의 도구를 사용하여 작업을 수행하도록 권장해야 합니다. OAuth 앱은 모든 사용자 또는 조직 소유자의 리소스에 액세스할 수 있습니다.
- OAuth 앱은 GitHub 데이터에 대한 ‘읽기’ 또는 ‘쓰기’ 권한을 가질 수 있습니다.
- 다른 계정에 대한 액세스 권한은 부여하지 않고 특정 계정에 대한 액세스 권한만 GitHub 앱에 부여할 수 있습니다.
애플리케이션 보안
애플리케이션에서 취약성을 발견하면 우선 순위로 처리하고 보안 정책을 준수하여 프로젝트의 사용자에게 알려야 합니다. 보안 문제를 신속하게 전달하면 손상된 토큰을 해지할 수 있는 사용자와 중요한 데이터를 노출할 수 있는 사용자를 결정지을 수 있습니다. 토큰은 암호보다 훨씬 안전하지만 여전히 보안이 손상될 수 있으며, 조직은 이를 반드시 대비해야 합니다.
README.md 파일 외에 SECURITY.md 파일도 리포지토리에 추가하는 것이 좋습니다. SECURITY.md 파일은 리포지토리에 대한 보안 관련 정보를 제공합니다. 파일에는 보안 연락처, 조직 정책이 포함되어야 하며 취약성이 발견될 때 취할 응답에 대해 자세히 설명해야 합니다.
이벤트에 응답
GitHub 앱은 패시브 앱으로 설계되었습니다. 이 파일은 이벤트가 발생할 때까지 기다리다가 이벤트가 발생하면 주로 GitHub API를 통해 응답합니다. GitHub에서 이벤트가 발생할 때까지 기다릴 때는 웹후크와 폴링이라는 두 가지 방법을 사용합니다.
참고
GitHub 앱은 GitHub 데이터 관련 작업에만 국한되지 않습니다. 다른 소스에서 발생하는 이벤트를 기다리거나 다른 서비스를 업데이트하는 작업을 쉽게 수행할 수 있습니다.
GitHub 웹후크 사용
웹후크는 주로 이벤트 처리에 사용하는 방법입니다. GitHub에서 발생하는 이벤트가 웹후크 범위에 속한다면 웹후크가 즉시 작동합니다. 웹후크는 앱에서 실시간으로 수신하고 처리할 수 있는 알림을 푸시합니다. 리포지토리 설정에서 이벤트 유형, 인증 및 HTTP 알림 전달 방법을 비롯한 웹후크 관련 설정을 구성할 수 있습니다.
폴링
웹후크를 사용할 수 없을 때도 있습니다. GitHub가 직접적으로 닿지 못하는 회사 방화벽 뒤에서 앱을 실행해야 할 수도 있습니다. 이 경우에는 GitHub API를 사용하여 추적하는 데이터를 폴링해야 합니다.
웹후크 중계
방화벽으로 보호받는 앱을 폴링하는 작업의 대안은 smee.io 같은 웹후크 전달 서비스를 사용하는 것입니다. 이 방식을 사용하면 공용 서비스는 리포지토리의 웹후크를 구독한 다음 들어오는 데이터를 방화벽 뒤에서 실행 중인 클라이언트 서비스로 중계합니다. 그러면 클라이언트 서비스는 원래 소스에서 가져왔을 때처럼 실행 중인 앱에 알림을 푸시합니다.