100일 챌린지 Day 84 - 민감한 정보를 안전하게 관리하는 방법을 배웁니다.
배울 내용
- GitHub Secrets 사용법
- 환경별 설정 관리
- 보안 모범 사례
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 자동 마스킹:
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 →