비밀이란?
소프트웨어 개발에서 비밀은 시스템, 서비스, 데이터, API에 대한 액세스를 인증하거나 권한을 부여하는 데 사용되는 중요한 정보입니다. 예를 들면 다음과 같습니다.
- GitHub의 REST API와 같은 외부 서비스와 상호작용을 할 수 있는 API 키 및 액세스 토큰입니다. 또한 액세스 토큰을 사용하면 GitHub Actions와 같은 서비스에서 인증이 필요한 작업을 수행할 수 있으며, 이를 나중에 실험할 예정입니다.
- 로컬 및 외부 데이터베이스와 스토리지에 대한 액세스 권한을 부여하는 데이터베이스 자격 증명 입니다.
- 프라이빗 SSH 및 PGP 키와 같은 프라이빗 키는 다른 서버에 액세스하고 데이터를 암호화하는 데 사용할 수 있습니다.
비밀은 중요한 시스템을 포함하여 많은 액세스 권한을 제공하므로 비밀을 안전하게 유지하는 것이 왜 그렇게 중요한지 이해할 수 있습니다.
비밀이 노출되면 어떻게 될까요?
- 공격자는 비밀이 액세스할 수 있는 모든 항목에 무단으로 액세스할 수 있습니다.
- 해커는 중요한 사용자 데이터를 포함하여 데이터를 도용할 수 있습니다. 개인 정보 보호와 법적 파급 효과가 있을 수 있으며 사용자와 애플리케이션에 대한 신뢰에 해를 끼칠 수 있습니다.
- 해커가 클라우드 공급자 계정에서 권한 없는 워크로드를 실행하는 경우 노출된 비밀로 인해 비용이 발생할 수 있습니다.
- 해커는 노출된 비밀을 사용하여 서버를 삭제, 수정, 중단하여 가동 중지 시간 및 데이터 손실을 일으킬 수 있습니다.
비밀이 사용자에게 부여하는 모든 액세스와 기능, 해커가 수행할 수 있는 작업을 고려해 보세요. 예를 들어 GitHub 계정에 대한 personal access token이 노출된 경우 해커가 귀하로 가장하여 GitHub에 게시물을 올리고 변경할 수 있습니다.
비밀 관리 모범 사례
이러한 유형의 문제를 방지하려면 모범 사례를 따라 유출을 방지하고 비밀이 노출된 경우 피해를 제한하세요.
**PoLP(최소 권한 원칙)** 을 따릅니다.
가능하면 비밀이 수행할 수 있는 작업을 제한하고 필요한 작업으로만 액세스할 수 있습니다. 예시:
- 비밀을 사용하여 데이터를 읽고 데이터를 변경하지 않는 경우 읽기 전용으로 지정합니다.
- 사용 중인 API에서 비밀을 특정 범위 또는 권한으로만 제한할 수 있는 경우 필요한 범위나 권한만 선택합니다. 예를 들어 GitHub 비밀에 대해서만 문제를 만들어야 하는 경우 비밀이 리포지토리 콘텐츠나 기타 항목에 액세스할 이유가 없습니다.
- 비밀이 공격자에게 해당 암호를 소유한 사용자 계정에 대한 모든 권한을 부여하는 경우 비밀의 소유권을 가져올 수 있는 서비스 계정을 만드는 것이 좋습니다.
애플리케이션에서 비밀 보호
-
**비밀을 하드코딩하지 않습니다**. 항상 **환경 변수** 또는 플랫폼의 비밀 관리 도구(예: GitHub의 리포지토리 비밀)를 사용합니다. - 다른 사람과 비밀을 공유해야 하는 경우 암호 관리자와 같은 전용 도구를 사용합니다. 메일이나 인스턴트 메시지를 통해 비밀을 보내지 않습니다.
- 가능하면 만료 날짜를 설정하고 비밀을 정기적으로 교체합니다. 이렇게 하면 이전 비밀이 악용될 위험이 줄어듭니다.
- 애플리케이션에서 로그를 생성하는 경우 기록하기 전에 비밀이 수정되었는지 확인합니다. 그러지 않으면 활성 비밀을 일반 텍스트 파일에 저장할 수 있습니다.
비밀이 노출될 경우 피해 제한
- 1초 동안만 노출되더라도 손상된 비밀을 고려하고 즉시 비밀을 해지합니다. 그런 다음, 새 비밀을 생성하고 안전하게 저장합니다.
-
**활동 로그**에서 손상된 비밀과 관련된 의심스러운 활동이 있는지 확인합니다. - 비밀이 어떻게 노출되었는지 고려하고 다시는 이런 일이 발생하지 않도록 프로세스를 변경합니다.
GitHub가 비밀을 안전하게 유지하는 방법
비밀을 안전하게 유지하기 위해 수행할 수 있는 작업은 많지만 GitHub에서 비밀을 유지하는 데 도움이 되는 작업도 많습니다. 모든 사용자가 실수할 수 있으므로 실수로 비밀을 노출했을 때 포착할 수 있는 기능을 지원합니다.
-
**푸시 보호**는 나중에 실험해 볼 기능으로, GitHub의 리포지토리에 비밀 푸시를 차단합니다. -
**비밀 검색**은 리포지토리를 검사하고 비밀을 검색할 때 경고를 만듭니다. 일부 비밀의 경우 비밀을 자동으로 해지하는 등의 조처를 할 수 있도록 공급자에게 알립니다.
비밀을 안전하게 저장하는 연습
이 연습에서는 personal access token을 만들고 안전하게 저장하여 GitHub Actions와 함께 사용할 수 있도록 합니다. 만들 작업은 이슈에 응답하는 간단한 워크플로입니다.
1. 연습 리포지토리 만들기
먼저 작업할 리포지토리를 만듭니다.
new2code 계정에는 신속하게 시작하는 데 사용할 수 있는 템플릿 리포지토리가 있습니다.
-
[새 리포지토리 페이지](https://github.com/new?template_owner=new2code&template_name=secret-action)로 이동합니다. 이 링크를 클릭하면 `new2code` 계정의 템플릿이 미리 선택됩니다. - “Owner”에서 사용자 계정이 선택되어 있는지 확인합니다.
- “Repository name” 필드에
secret-action을 입력하세요. - 설명 필드 아래에서 Public을 선택하여 리포지토리 표시 유형을 설정합니다.
-
**Create repository**(리포지토리 만들기)를 클릭합니다.
2. 더미 토큰을 커밋하기
모두가 실수를 하며, 코딩의 여정 중 언젠가는 무심코 비밀을 노출할 수도 있습니다. 이 연습에서는 트리거되는 경고에 익숙해지고 편안해질 수 있도록 의도적으로 가짜 토큰을 커밋합니다.
-
방금 생성한 리포지토리로 이동합니다.
-
파일 목록에서
.github/workflows를 클릭하여 YAML 워크플로 파일로 이동합니다. -
파일 목록에서
comment.yml을 클릭하여 워크플로 파일을 엽니다. -
워크플로 파일을 편집하려면 오른쪽 위에서 을 클릭합니다.
-
줄 13에서 따옴표 사이에 이 더미 토큰,
GH_TOKEN: ""을 삽입합니다.secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde최종 결과는 다음과 같아야 합니다.
GH_TOKEN: "secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde" -
변경 내용을 커밋하려면 오른쪽 위에서 변경 내용 커밋... 을 클릭한 다음, 대화 상자에서 변경 내용 커밋을 다시 클릭합니다.
-
이제 "비밀번호 스캐닝이 13번 줄에서 GitHub 비밀번호 스캐닝 비밀을 발견했습니다"라는 푸시 보호 경고가 표시됩니다.

더미 토큰을 사용한 실험이 아니었다면, 토큰 공개까지 한 걸음 남았다는 경고가 표시되었을 것입니다. 경고에서 선택할 수 있는 옵션을 검토합니다.
-
커밋을 중지하고 비밀을 노출하지 않도록 하려면 Cancel을 클릭합니다. 오른쪽 위에서 Cancel changes를 클릭한 다음, 메시지가 표시되면 저장되지 않은 변경 내용을 삭제합니다.
3. 실제 토큰 만들기
이제 모범적인 절차를 따라 해 보겠습니다. 먼저 사용자 대신 작업을 수행할 수 있는 personal access token을 만듭니다(만든 메모는 사용자 계정에서 나온 것으로 표시됨).
참고
각 구성 단계에 대해 최소 권한 원칙을 따르는 방법을 확인합니다. 토큰은 필요한 만료 기간이 가장 짧고, 필요한 리포지토리에만 액세스할 수 있으며, 작동하는 데 필요한 최소 권한을 갖습니다.
-
[새 personal access token 페이지](https://github.com/settings/personal-access-tokens/new)로 이동합니다. - “Token name”에서 새 토큰에 이름을 지정합니다. “Action token”처럼 사용할 수 있습니다.
- “Expiration”에서 “7 days”를 선택합니다.
- “Repository access”에서 Only select repositories를 선택합니다.
- “Select repositories” 드롭다운에서 이전에 만든 연습 리포지토리만 선택합니다.
- “Permissions” 섹션에서 “Repository permissions”의 오른쪽에서 를 클릭하여 가능한 모든 권한을 봅니다.
- “Issues”로 아래로 스크롤하고 오른쪽 드롭다운에서 “Read and write”를 선택합니다.
- 페이지 아래쪽에서 Generate token을 클릭합니다. 메시지가 표시되면 Generate token을 다시 클릭하여 확인합니다.
이 시점부터 결과 토큰을 안전하게 처리하는 것이 중요합니다. 곧 토큰을 사용할 예정이므로 잠시 클립보드에 복사할 수 있습니다.
4. 토큰을 안전하게 저장
이제 리포지토리에 새 토큰을 안전하게 저장할 수 있습니다.
-
연습의 시작 부분에서 만든 리포지토리로 이동합니다.
-
리포지토리 이름 아래에서 Settings를 클릭합니다. "설정" 탭이 표시되지 않으면 드롭다운 메뉴를 선택한 다음 설정을 클릭합니다.

-
사이드바의 "Security" 섹션에서 Secrets and variables를 선택하고 Actions를 클릭합니다.
-
“Repository secrets”에서 새 리포지토리 비밀을 클릭합니다.
-
**Name** 필드에 비밀의 이름을 입력합니다. 이 연습에서는 `MY_TOKEN`를 사용합니다. -
**Secret** 필드에 이전에 생성한 personal access token을 붙여 넣습니다. -
**비밀 추가**를 클릭합니다.
이제 비밀이 안전하게 암호화되어 사용할 준비가 되었습니다!
작업에서 토큰을 참조하기
이제 YAML 워크플로 파일을 업데이트하여 토큰을 사용하고 작동하는지 테스트할 수 있습니다.
-
리포지토리로 다시 이동합니다. 리포지토리의 설정에 있는 경우 리포지토리 이름 아래에서 Code를 클릭할 수 있습니다.
-
파일 목록에서
.github/workflows를 클릭하여 YAML 워크플로 파일로 이동합니다. -
파일 목록에서
comment.yml을 클릭하여 워크플로 파일을 엽니다. -
워크플로 파일 편집을 시작하려면 오른쪽 위에서 을 클릭합니다.
-
줄 13에서,
GH_TOKEN: ""에서, 빈 따옴표를${{ secrets.MY_TOKEN }}으로 바꿉니다. 앞에서 추가한 리포지토리 비밀을 참조하게 됩니다.GH_TOKEN: ${{ secrets.MY_TOKEN }} -
변경 내용을 커밋하려면 오른쪽 위에서 Commit changes... 을 클릭합니다.
-
“Commit changes” 대화 상자에서 “Commit message”를 편집하여 변경 내용을 반영합니다. 예를 들어 “리포지토리 비밀을 사용하도록 워크플로 업데이트”를 입력할 수 있습니다.
-
"커밋을
main브랜치에 직접 수행"이 선택되어 있는지 확인하세요. -
**변경 내용 커밋**을 클릭합니다.
6. 토큰 및 워크플로 테스트
이제 모든 준비가 끝났습니다. 계속하여 워크플로를 테스트해 보겠습니다.
-
리포지토리 이름 아래에서 Issues를 클릭합니다.

-
새 문제를 클릭합니다.
-
“Add a title”에서 원하는 제목을 입력할 수 있습니다.
-
“Add a description”의 텍스트 영역에
Hello를 입력합니다. -
텍스트 영역 아래에서 Create를 클릭합니다.
워크플로를 완료할 시간이 있으면 새 주석이 표시됩니다. 귀하의 토큰을 사용하고 있으므로 주석은 직접 작성하게 되며, 그에 대한 답례로 인사말이 포함됩니다.
다음 단계
비밀 검색 및 푸시 보호에 대한 자세한 내용은 GitHub Skills에서 비밀 검사 소개 과정을 완료할 수 있습니다.
코드 보안의 또 다른 중요한 부분은 프로젝트에서 코드 취약성을 식별하고 패치하는 방법을 배우는 것입니다. 첫 번째 코드 취약성 찾기 및 수정을(를) 참조하세요.