포스트

[GitHub 100일 챌린지] Day 84 - Secrets와 환경 관리

[GitHub 100일 챌린지] Day 84 - Secrets와 환경 관리

100일 챌린지 Day 84 - 민감한 정보를 안전하게 관리하는 방법을 배웁니다.

배울 내용

  1. GitHub Secrets 사용법
  2. 환경별 설정 관리
  3. 보안 모범 사례

GitHub Secrets란?

개념

민감한 정보를 안전하게 저장하는 곳

1
2
3
4
5
6
7
8
9
10
저장할 정보:
- API 키
- 비밀번호
- 토큰
- 인증서

특징:
- 암호화 저장
- Workflow에서만 접근
- 로그에 자동 마스킹 (***로 표시)

Secrets 설정하기

Repository Secrets

1. Secrets 생성

1
2
3
4
5
GitHub 저장소 → Settings → Secrets and variables → Actions

"New repository secret" 클릭
- Name: API_KEY
- Secret: abc123xyz (실제 API 키)

2. Workflow에서 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
name: Deploy

on: push

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: 배포
        env:
          API_KEY: $
        run: |
          echo "API 키로 배포 중..."
          # API_KEY 환경변수 사용 가능

Organization Secrets

조직 전체에서 공유

1
2
3
4
5
6
Organization Settings → Secrets and variables → Actions

사용처:
- 여러 저장소에서 공통으로 사용
- 팀 전체 API 키
- 공용 인증 정보

Environments (환경 관리)

환경 생성

1
2
3
4
5
6
저장소 Settings → Environments → New environment

환경 이름:
- production (운영)
- staging (스테이징)
- development (개발)

환경별 Secrets

1
2
3
4
5
6
7
8
9
10
11
# production 환경 설정
Environment: production
Secrets:
  - API_URL: https://api.prod.com
  - DB_HOST: prod-db.com

# staging 환경 설정
Environment: staging
Secrets:
  - API_URL: https://api.staging.com
  - DB_HOST: staging-db.com

Workflow에서 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
name: Deploy

on:
  push:
    branches: [main]

jobs:
  deploy-staging:
    runs-on: ubuntu-latest
    environment: staging
    steps:
      - name: 스테이징 배포
        env:
          API_URL: $
        run: deploy.sh
  
  deploy-production:
    needs: deploy-staging
    runs-on: ubuntu-latest
    environment: production
    steps:
      - name: 운영 배포
        env:
          API_URL: $
        run: deploy.sh

환경 보호 규칙

Required Reviewers (승인 필요)

1
2
3
4
5
6
7
8
Environment → production → Protection rules

☑ Required reviewers
  - @admin
  - @team-lead

효과:
운영 배포 전 승인 필요

Wait Timer (대기 시간)

1
2
3
4
5
Protection rules:
☑ Wait timer: 10 분

효과:
배포 전 10분 대기 (취소 가능 시간)

Deployment Branches

1
2
3
4
5
6
Protection rules:
☑ Deployment branches
  - Selected branches: main

효과:
main 브랜치에서만 배포 가능

Secrets 우선순위

1
2
3
4
5
6
환경 Secrets > 저장소 Secrets > 조직 Secrets

예시:
1. production 환경: API_KEY = "prod-key"
2. 저장소: API_KEY = "repo-key"
→ production 환경에서 사용 시: "prod-key"

보안 모범 사례

1. Secrets 로그 마스킹

1
2
3
4
5
6
7
8
9
10
steps:
  - name: API 호출
    env:
      TOKEN: $
    run: |
      # ❌ 절대 하지 말 것
      echo "토큰: $TOKEN"  # 로그에 노출!
      
      # ✅ 올바른 사용
      curl -H "Authorization: Bearer $TOKEN" api.com

GitHub 자동 마스킹:

1
2
# 로그 출력
토큰: ***

2. 최소 권한 원칙

1
2
3
4
5
6
7
8
9
✅ 좋은 예:
- 읽기 전용 API 키 사용
- 특정 리소스만 접근 가능한 토큰
- 짧은 유효 기간

❌ 나쁜 예:
- 관리자 권한 API 키
- 모든 리소스 접근 가능
- 무제한 유효 기간

3. Secrets 로테이션

1
2
3
4
정기적으로 변경:
- 매 3개월마다 API 키 갱신
- 토큰 만료 설정
- 사용하지 않는 Secrets 삭제

실전 예제

다중 환경 배포

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
name: Multi-Environment Deploy

on:
  push:
    branches:
      - develop    # → staging
      - main       # → production

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment:
      name: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
    steps:
      - uses: actions/checkout@v3

      - name: 환경 확인
        run: |
          echo "환경: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}"
          echo "API URL: ${{ secrets.API_URL }}"

      - name: 배포
        env:
          API_KEY: ${{ secrets.API_KEY }}
          DB_HOST: ${{ secrets.DB_HOST }}
        run: |
          npm run build
          npm run deploy

Docker 이미지 배포

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
name: Docker Deploy

on:
  push:
    branches: [main]

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Docker 로그인
        env:
          DOCKER_USERNAME: $
          DOCKER_PASSWORD: $
        run: |
          echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
      
      - name: 이미지 빌드
        run: docker build -t myapp:latest .
      
      - name: 이미지 푸시
        run: docker push myapp:latest

변수 (Variables)

Secrets vs Variables

1
2
3
4
5
6
7
8
9
10
11
Secrets:
- 민감한 정보
- 암호화됨
- 로그에서 마스킹
예: API 키, 비밀번호

Variables:
- 일반 설정값
- 암호화 안 됨
- 로그에 보임
예: 앱 이름, 버전

Variables 설정

1
2
3
4
Settings → Secrets and variables → Actions → Variables 탭

Name: APP_NAME
Value: my-awesome-app

사용법

1
2
3
4
5
6
7
8
9
10
11
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: 빌드
        env:
          APP_NAME: $
          VERSION: $
        run: |
          echo "앱: $APP_NAME"
          echo "버전: $VERSION"

정리

완료 체크:

  • Repository Secrets 생성
  • Environments 설정
  • 환경별 배포 Workflow 작성

핵심 요약:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Secrets:
- 민감 정보 암호화 저장
- $으로 사용
- 로그 자동 마스킹

Environments:
- 환경별 설정 분리
- 승인 규칙 설정
- 브랜치 제한

보안:
- 최소 권한 원칙
- 정기 로테이션
- 로그 노출 금지

다음: Day 85 - Actions Marketplace 활용 →


← Day 84 | 전체 커리큘럼 | Day 85 →

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.