엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기

이미지
엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기 (완성 코드 공개) "매크로가 포함된 파일을 다른 사람에게 보내면 보안 경고 때문에 매크로 사용 설정을 매번 따로 해야 한다", "VBA 코드가 회사 PC마다 다르게 작동해서 디버깅이 어렵다", "매크로를 쓰는 동료가 퇴사하면 그 파일을 아무도 수정하지 못한다"… VBA 매크로는 엑셀 안에서 바로 실행되는 장점이 있지만, 보안 정책으로 차단되거나, 회사 PC마다 설정이 달라 오작동하거나, 코드 관리가 어려운 한계가 있습니다. 이 글에서는 이 블로그에서 지금까지 소개한 파이썬 코드들이 VBA의 어떤 기능을 대체할 수 있는지 비교하고, 대표적인 매크로 작업을 파이썬으로 구현하는 방법을 소개합니다. VBA 매크로 vs 파이썬 비교 VBA 매크로 파이썬 실행 환경 엑셀 안에서만 동작 독립적으로 어디서나 동작 보안 경고 매번 발생, 차단 가능 해당 없음 배포 파일에 코드 포함 스크립트 파일만 공유 디버깅 엑셀 VBA 편집기 사용 다양한 코드 에디터 사용 가능 다른 프로그램 연동 제한적 (Win API 필요) 매우 풍부함 (이메일, 웹, DB 등) 버전 관리(깃 등) 거의 불가능 일반적인 코드처럼 관리 가능 배우는 난이도 엑셀에 특화된 문법 범용 프로그래밍 언어, 활용도 넓음 💡 언제 VBA가 더 나을까: 엑셀을 열자마자 버튼 클릭으로 즉시 실행하고 싶거나, 엑셀 전용 UI(사용자 정의 양식)가 필요한 경우는 VBA가 더 간단할 수 있습니다. 하지만 안정성, 보안, 확장성을 고려하면 대부분의 반복 작업은 파이썬이 더 유리합니다. 대표 매크로 작업 1 — 여러 시트 합치기 VBA로 흔히 작성하는 "모...

코드에 비밀번호 그대로 적어두지 마세요! 파이썬으로 암호화 저장하기

코드에 비밀번호 그대로 적어두지 마세요! 파이썬으로 암호화 저장하기 (완성 코드 공개)

파이썬으로 비밀번호를 암호화해서 안전하게 저장하는 모습


이 블로그에서 지금까지 소개한 이메일 발송, 카카오톡·텔레그램 연동, 구글 시트, 웹사이트 로그인 자동화 코드들을 다시 살펴보면 공통적으로 PASSWORD = "abc1234!"처럼 비밀번호를 코드에 그대로 적어두는 부분이 있었습니다. 이 방식은 코드를 다른 사람과 공유하거나 깃허브에 업로드할 때 비밀번호가 그대로 노출되는 위험이 있습니다.

파이썬의 cryptography 라이브러리를 사용하면 비밀번호와 API 키 등 민감한 정보를 암호화해서 별도 파일에 저장하고, 실행할 때만 복호화해서 사용할 수 있습니다. 코드 자체에는 평문 비밀번호가 전혀 남지 않습니다.


1단계: 준비물 설치

파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.

암호화에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install cryptography

cryptography는 업계 표준 암호화 라이브러리입니다. 이 글에서는 그 중 가장 사용하기 쉬운 Fernet 방식(대칭키 암호화)을 사용합니다. 하나의 키로 암호화와 복호화를 모두 처리합니다.

💡 이 코드로 할 수 있는 것: 비밀번호, API 키, 토큰 등을 암호화해서 별도 파일에 저장하고, 프로그램 실행 시 키 파일로 복호화해서 사용합니다. 암호화된 파일만 봐서는 원래 내용을 알 수 없습니다.

2단계: 완성 코드 — 암호화 키 생성 (최초 1회만)

먼저 암호화·복호화에 사용할 키를 한 번만 생성합니다. 아래 코드를 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, 별도 암호 보관함)에 따로 백업해두는 것을 권장합니다.


3단계: 완성 코드 — 비밀번호 암호화해서 저장

실제 비밀번호나 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)의 평문 비밀번호 부분은 삭제하세요.")

4단계: 완성 코드 — 사용할 때 복호화해서 불러오기

실제 자동화 스크립트에서 비밀번호가 필요할 때, 암호화된 파일에서 복호화해서 불러오는 코드입니다. 아래 함수를 만들어두고 다른 스크립트에서 가져다 쓰면 됩니다.

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")   # ← 평문 대신 이렇게 불러오기

# 이후 코드는 기존과 동일하게 사용

5단계: 실행 방법

  1. python generate_key.py를 실행해 secret.key를 생성합니다. (최초 1회)
  2. encrypt_secrets.pysecrets 딕셔너리에 실제 비밀번호·API 키를 입력하고 실행합니다.
  3. 실행 후 encrypt_secrets.py 파일 안의 평문 비밀번호 부분을 삭제하거나 파일 자체를 안전하게 보관합니다.
  4. 실제 자동화 스크립트에서는 secret_loader.pyload_secret() 함수로 필요할 때마다 불러옵니다.

정상 실행 시 이렇게 출력됩니다:

  ✔ EMAIL_PASSWORD 암호화 완료
  ✔ TELEGRAM_TOKEN 암호화 완료
  ✔ KAKAO_ACCESS_TOKEN 암호화 완료
  ✔ DB_PASSWORD 암호화 완료

✅ 완료! 암호화된 정보 저장 → secrets_encrypted.json
⚠️  이제 이 코드 파일(encrypt_secrets.py)의 평문 비밀번호 부분은 삭제하세요.

6단계: 자주 발생하는 오류와 해결법

오류 1: cryptography.fernet.InvalidToken

secret.key 파일이 바뀌었거나 다른 키로 암호화된 데이터를 다른 키로 복호화하려는 경우입니다. 암호화할 때 사용한 키 파일과 복호화할 때 사용하는 키 파일이 동일한지 확인하세요.

오류 2: FileNotFoundError: secret.key

키 파일이 다른 폴더에 있거나 아직 생성되지 않은 경우입니다. generate_key.py를 먼저 실행해서 키를 생성하고, 모든 스크립트가 같은 폴더에서 실행되는지 확인하세요.

오류 3: KeyError: 'EMAIL_PASSWORD'

secrets_encrypted.json에 해당 항목이 없는 경우입니다. encrypt_secrets.pysecrets 딕셔너리에 해당 키 이름을 추가했는지 확인하세요.


응용: 깃 저장소에 키 파일이 올라가지 않도록 설정하기

깃(Git)을 사용한다면 .gitignore 파일에 키 관련 파일을 등록해 실수로 업로드되는 것을 방지하세요.

secret.key
secrets_encrypted.json
.env
💡 이전 게시글과 결합하면: 이 블로그의 이메일 자동 발송, 텔레그램 자동 발송, 구글 스프레드시트 연동, 웹사이트 자동 로그인 편에서 코드에 직접 적었던 비밀번호·토큰을 모두 이 방식으로 암호화해서 교체하면 훨씬 안전한 자동화 시스템이 됩니다.

핵심 요약

  • 준비물: Python + cryptography 설치 (pip install cryptography)
  • 1회 작업: generate_key.py로 secret.key 생성
  • 암호화: encrypt_secrets.py에 비밀번호 입력 후 실행, 이후 평문 삭제
  • 사용: secret_loader.py의 load_secret() 함수로 필요할 때마다 복호화해서 불러오기
  • 보안: secret.key와 secrets_encrypted.json은 .gitignore에 등록, 외부 공유 금지

이 코드를 응용하면 여러 사용자별로 다른 키를 적용하거나, 일정 기간마다 키를 자동으로 교체하는 보안 정책도 구현할 수 있습니다.

이 블로그의 인기 게시물

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁