엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기
이 블로그에서 지금까지 소개한 이메일 발송, 카카오톡·텔레그램 연동, 구글 시트, 웹사이트 로그인 자동화 코드들을 다시 살펴보면 공통적으로 PASSWORD = "abc1234!"처럼 비밀번호를 코드에 그대로 적어두는 부분이 있었습니다. 이 방식은 코드를 다른 사람과 공유하거나 깃허브에 업로드할 때 비밀번호가 그대로 노출되는 위험이 있습니다.
파이썬의 cryptography 라이브러리를 사용하면 비밀번호와 API 키 등 민감한 정보를 암호화해서 별도 파일에 저장하고, 실행할 때만 복호화해서 사용할 수 있습니다. 코드 자체에는 평문 비밀번호가 전혀 남지 않습니다.
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
암호화에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install cryptography
cryptography는 업계 표준 암호화 라이브러리입니다. 이 글에서는 그 중 가장 사용하기 쉬운 Fernet 방식(대칭키 암호화)을 사용합니다. 하나의 키로 암호화와 복호화를 모두 처리합니다.
💡 이 코드로 할 수 있는 것: 비밀번호, API 키, 토큰 등을 암호화해서 별도 파일에 저장하고, 프로그램 실행 시 키 파일로 복호화해서 사용합니다. 암호화된 파일만 봐서는 원래 내용을 알 수 없습니다.
먼저 암호화·복호화에 사용할 키를 한 번만 생성합니다. 아래 코드를 generate_key.py로 저장하고 실행하세요.
from cryptography.fernet import Fernet
# 암호화 키 생성
key = Fernet.generate_key()
# 키를 파일로 저장 (이 파일은 절대 외부에 공유하지 마세요)
with open("secret.key", "wb") as f:
f.write(key)
print("✅ 암호화 키 생성 완료 → secret.key")
print("⚠️ 이 파일을 잃어버리면 암호화된 정보를 복호화할 수 없습니다.")
print("⚠️ 이 파일을 깃허브, 클라우드 공유 폴더에 절대 올리지 마세요.")
실행하면 secret.key 파일이 생성됩니다. 이 파일은 비밀번호를 푸는 유일한 열쇠이므로 안전한 곳(USB, 별도 암호 보관함)에 따로 백업해두는 것을 권장합니다.
실제 비밀번호나 API 키를 암호화해서 파일로 저장하는 코드입니다. 아래 코드를 encrypt_secrets.py로 저장하세요.
from cryptography.fernet import Fernet
import json
# ① 키 불러오기
with open("secret.key", "rb") as f:
key = f.read()
fernet = Fernet(key)
# ② 암호화할 민감정보 (이번에만 평문으로 입력, 실행 후 이 파일은 삭제해도 됩니다)
secrets = {
"EMAIL_PASSWORD": "gmail앱비밀번호16자리",
"TELEGRAM_TOKEN": "텔레그램봇토큰",
"KAKAO_ACCESS_TOKEN": "카카오액세스토큰",
"DB_PASSWORD": "데이터베이스비밀번호",
}
# ③ 각 값을 암호화
encrypted_secrets = {}
for name, value in secrets.items():
encrypted = fernet.encrypt(value.encode())
encrypted_secrets[name] = encrypted.decode()
print(f" ✔ {name} 암호화 완료")
# ④ 암호화된 결과를 JSON 파일로 저장
with open("secrets_encrypted.json", "w", encoding="utf-8") as f:
json.dump(encrypted_secrets, f, indent=2)
print(f"\n✅ 완료! 암호화된 정보 저장 → secrets_encrypted.json")
print("⚠️ 이제 이 코드 파일(encrypt_secrets.py)의 평문 비밀번호 부분은 삭제하세요.")
실제 자동화 스크립트에서 비밀번호가 필요할 때, 암호화된 파일에서 복호화해서 불러오는 코드입니다. 아래 함수를 만들어두고 다른 스크립트에서 가져다 쓰면 됩니다.
from cryptography.fernet import Fernet
import json
def load_secret(name, key_path="secret.key", secrets_path="secrets_encrypted.json"):
"""암호화된 secrets_encrypted.json에서 특정 항목을 복호화해서 반환"""
with open(key_path, "rb") as f:
key = f.read()
fernet = Fernet(key)
with open(secrets_path, "r", encoding="utf-8") as f:
encrypted_secrets = json.load(f)
encrypted_value = encrypted_secrets[name]
decrypted_value = fernet.decrypt(encrypted_value.encode()).decode()
return decrypted_value
# 사용 예시
if __name__ == "__main__":
email_password = load_secret("EMAIL_PASSWORD")
print(f" ✔ 복호화 성공: {'*' * len(email_password)} (길이: {len(email_password)}자)")
이 함수를 secret_loader.py로 저장해두면, 다른 자동화 스크립트에서 아래처럼 간단히 불러와 사용할 수 있습니다.
# 예: 이메일 자동 발송 스크립트에서 사용하는 방법
from secret_loader import load_secret
SENDER_EMAIL = "내이메일@gmail.com"
SENDER_PASSWORD = load_secret("EMAIL_PASSWORD") # ← 평문 대신 이렇게 불러오기
# 이후 코드는 기존과 동일하게 사용
python generate_key.py를 실행해 secret.key를 생성합니다. (최초 1회)encrypt_secrets.py의 secrets 딕셔너리에 실제 비밀번호·API 키를 입력하고 실행합니다.encrypt_secrets.py 파일 안의 평문 비밀번호 부분을 삭제하거나 파일 자체를 안전하게 보관합니다.secret_loader.py의 load_secret() 함수로 필요할 때마다 불러옵니다.정상 실행 시 이렇게 출력됩니다:
✔ EMAIL_PASSWORD 암호화 완료 ✔ TELEGRAM_TOKEN 암호화 완료 ✔ KAKAO_ACCESS_TOKEN 암호화 완료 ✔ DB_PASSWORD 암호화 완료 ✅ 완료! 암호화된 정보 저장 → secrets_encrypted.json ⚠️ 이제 이 코드 파일(encrypt_secrets.py)의 평문 비밀번호 부분은 삭제하세요.
오류 1: cryptography.fernet.InvalidToken
secret.key 파일이 바뀌었거나 다른 키로 암호화된 데이터를 다른 키로 복호화하려는 경우입니다. 암호화할 때 사용한 키 파일과 복호화할 때 사용하는 키 파일이 동일한지 확인하세요.
오류 2: FileNotFoundError: secret.key
키 파일이 다른 폴더에 있거나 아직 생성되지 않은 경우입니다. generate_key.py를 먼저 실행해서 키를 생성하고, 모든 스크립트가 같은 폴더에서 실행되는지 확인하세요.
오류 3: KeyError: 'EMAIL_PASSWORD'
secrets_encrypted.json에 해당 항목이 없는 경우입니다. encrypt_secrets.py의 secrets 딕셔너리에 해당 키 이름을 추가했는지 확인하세요.
깃(Git)을 사용한다면 .gitignore 파일에 키 관련 파일을 등록해 실수로 업로드되는 것을 방지하세요.
secret.key secrets_encrypted.json .env
💡 이전 게시글과 결합하면: 이 블로그의 이메일 자동 발송, 텔레그램 자동 발송, 구글 스프레드시트 연동, 웹사이트 자동 로그인 편에서 코드에 직접 적었던 비밀번호·토큰을 모두 이 방식으로 암호화해서 교체하면 훨씬 안전한 자동화 시스템이 됩니다.
이 코드를 응용하면 여러 사용자별로 다른 키를 적용하거나, 일정 기간마다 키를 자동으로 교체하는 보안 정책도 구현할 수 있습니다.