튜토리얼약 4분 읽기

시크릿·설정값 안전하게 관리하기 — 자동매매 코드에서 API 키 다루는 법

코드에 키를 박아 넣으면 생기는 일

프로젝트 구조 잡기에서 설정과 로직을 분리하는 이야기를 했다. 그중에서도 API 키·비밀번호·계좌 관련 값처럼 새어나가면 안 되는 정보는 별도로 취급해야 한다. 코드 파일 안에 문자열로 박아 넣으면 그 파일을 버전관리에 올리는 순간 이력에 영구히 남고, 나중에 지워도 과거 커밋 기록에서 복구될 수 있다.

이 글은 특정 서비스의 실제 인증 방식을 다루지 않는다. 어떤 API를 쓰든 적용할 수 있는, 시크릿을 코드와 분리해 관리하는 기본 원칙을 다룬다.

원칙 — 시크릿은 코드가 아니라 코드 밖에 둔다

시크릿을 코드에서 분리하는 가장 흔한 방법은 환경변수나 별도 설정 파일을 쓰는 것이다.

python 코드 보기
import os

API_KEY = os.environ.get("BROKER_API_KEY")
API_SECRET = os.environ.get("BROKER_API_SECRET")

if API_KEY is None or API_SECRET is None:
    raise RuntimeError("BROKER_API_KEY/BROKER_API_SECRET 환경변수가 설정되지 않았습니다")

코드는 "환경변수에서 값을 읽는다"는 사실만 알고, 실제 값이 무엇인지는 몰라도 된다. 값은 서버의 환경변수나, 버전관리에서 제외된 별도 파일(.env 등)에 둔다.

버전관리에서 반드시 제외한다

시크릿을 담는 파일은 .gitignore에 반드시 등록해야 한다. 한 번이라도 실수로 커밋되면, 그 즉시 해당 값은 유출된 것으로 간주하고 폐기(rotate)해야 한다 — 커밋을 되돌려도 이력에 남기 때문이다.

코드 보기
# .gitignore 예시
.env
.env.*
*.key
*credential*

커밋 전에 한 번 더 확인하는 습관

.gitignore에 등록해도, 실수로 다른 파일(설정 예시, 로그, 노트)에 값을 그대로 붙여 넣고 커밋하는 경우가 있다. 커밋하기 전에 변경된 파일 목록과 내용을 한 번 훑어보는 습관, 그리고 커밋 전 시크릿 패턴을 스캔하는 도구를 CI나 로컬 훅에 넣어두는 것도 도움이 된다.

여러 환경(모의투자·실전)의 시크릿은 명확히 구분한다

안전장치에서 다룬 것처럼 모의투자와 실전은 반드시 분리돼야 하는데, 이는 시크릿 관리에도 그대로 적용된다. 모의투자용 키와 실전용 키를 서로 다른 환경변수 이름이나 별도 설정 파일로 명확히 구분해두면, 실전 키를 실수로 모의투자 코드에 연결하는(또는 그 반대의) 사고를 줄일 수 있다.

python 코드 보기
ENV = os.environ.get("TRADING_ENV", "paper")  # 기본값은 항상 모의투자
API_KEY = os.environ.get(f"BROKER_API_KEY_{ENV.upper()}")

기본값을 실전이 아닌 모의투자로 둔다는 점이 중요하다. 설정을 깜빡했을 때 안전한 쪽으로 떨어지게 만드는 것이다.

오늘의 정리

  1. API 키 같은 시크릿은 코드 안에 문자열로 박아 넣지 말고 환경변수나 별도 파일로 분리해서 관리한다.
  2. 시크릿 파일은 .gitignore에 반드시 등록하고, 실수로 커밋됐다면 되돌리는 것만으로는 부족하니 값 자체를 폐기해야 한다.
  3. 모의투자와 실전 환경의 시크릿은 이름부터 명확히 구분하고, 기본값은 항상 안전한 쪽(모의투자)으로 둔다.

이 글의 코드는 시크릿 관리 개념을 보여주기 위한 일반적인 예시이며, 실제 운영 중인 시스템의 인증 방식이나 실제 키 값이 아닙니다. 투자 조언이 아니며 특정 종목이나 매매기법을 추천하지 않습니다. 수익 보장은 없으며, 투자 손실의 책임은 투자자 본인에게 있습니다.

← 전체 글 목록