중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날

이미지
중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날 이 블로그의 중복 파일 자동 삭제 편 과 파일명 일괄 변경 편 을 보면 공통적으로 "DRY_RUN"이라는 안전장치가 들어 있습니다. 실제 삭제나 변경 전에 미리보기부터 하도록 만든 이 습관은, 사실 처음부터 있던 게 아니라 한 번의 아찔한 경험 뒤에 생긴 것입니다. 당시 상황은 이랬습니다. 다운로드 폴더가 오래 방치되어 있어 용량을 확인해보니 중복 파일이 상당히 많았고, "파일 해시값을 비교해서 중복이면 자동으로 지우는" 스크립트를 처음 짜서 바로 실행했습니다. 사건 발생 — 실행 버튼을 누른 직후 처음 짠 코드는 대략 이런 형태였습니다. import hashlib from pathlib import Path from collections import defaultdict folder = Path(r"C:\Users\내이름\Downloads") hash_map = defaultdict(list) def get_hash(filepath): h = hashlib.md5() with open(filepath, "rb") as f: h.update(f.read()) return h.hexdigest() for file in folder.rglob("*"): if file.is_file(): hash_map[get_hash(file)].append(file) # 중복이면 첫 번째만 남기고 나머지 삭제 for files in hash_map.values(): if len(files) > 1: for f in files[1:]: f.unlink() # ← 바로 삭제 실행 print(f"삭제: {f.name}") 실행하자마자 터미널에 "삭제: ......

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

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

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


이 블로그에서 지금까지 소개한 이메일 발송, 카카오톡·텔레그램 연동, 구글 시트, 웹사이트 로그인 자동화 코드들을 다시 살펴보면 공통적으로 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% 활용 꿀팁