교재 홈: 바이브 코더를 위한 코딩 기초 학습

**보안(security)**은 자료와 기능을 허용한 범위에서만 이용하게 하고, 의도하지 않은 접근·변경·노출을 줄이는 일입니다. 개인정보는 직접 또는 다른 정보와 결합해 사람을 알아볼 수 있게 하는 정보입니다. 어떤 자료를 읽고 어디에 보내며 무엇을 바꾸는지 따라가는 것이 보안 검토의 출발점입니다. 다른 코드를 실행하고 파일이나 서비스를 조작할 수 있는 **AI 에이전트(agent)**에게 일을 맡길 때에도 이 영향 범위를 직접 판단해야 합니다.

데이터의 식별 가능성

이름이나 연락처 외에도 소속, 일정, 드문 역할, 구체적인 사건을 조합해 사람을 알아볼 수 있습니다. 누구인지 연결할 수 있는 정도를 식별 가능성이라고 합니다. 알아보기 어렵게 바꾼 자료에서 다시 사람을 알아보는 것을 재식별이라고 합니다. 이름을 임의 번호로 바꾸어도 번호와 이름을 연결한 표인 대응표나 주변 정보가 있으면 다시 연결될 수 있습니다. 식별 가능성을 충분히 제거했다는 근거 없이 익명화, 즉 사람을 알아볼 수 없게 만들었다고 단정하지 않습니다.

**해시(hash)**는 입력을 정해진 규칙으로 요약한 값입니다. 같은 규칙에 같은 입력을 넣으면 같은 결과를 얻으므로 자료 비교 등에 쓸 수 있습니다. 하지만 가능한 이름이나 이메일 후보를 하나씩 넣어 결과를 비교할 수 있고 같은 해시가 여러 자료를 연결하는 단서가 될 수도 있습니다. 따라서 해시로 바꿨다는 사실만으로 익명화를 보장하지 않습니다. 이 교재는 실제 사람의 기록을 변형하지 않고 가상의 자료를 새로 만들었습니다.

학교나 회사처럼 소속 기관의 사람·업무·내부 자료는 해당 기관이 허용한 계정과 환경에서 다룹니다. 개인 계정에서 기능을 익힐 때에는 실제 자료와 같은 항목 구조를 가진 가상 자료를 사용할 수 있습니다. 계정은 서비스가 이용 주체를 구분하는 단위이고, 접근권한은 그 주체가 읽거나 바꿀 수 있는 범위입니다. 자료를 외부 서비스에 전달해도 되는지는 구조가 같은 예제로 기능이 동작한다는 문제와 따로 판단합니다.

비밀정보를 코드와 분리하기

API 키와 인증 토큰은 서비스가 요청 주체나 허가 범위를 확인하는 데 쓰는 문자열입니다. 다른 사람이 가져다 사용할 수 있는 키·토큰·비밀번호 등을 **비밀정보(secret)**라고 합니다. 코드·공유 화면·로그에 넣으면 의도하지 않은 사람에게 전달될 수 있습니다. 로그는 실행 과정을 남기는 기록이며 7장에서 다룹니다.

환경변수는 프로그램을 실행할 때 이름과 값으로 전달하는 설정입니다. 코드에서 실제 값을 분리하는 수단이며 값을 읽기 어렵게 바꾸는 암호화 기술 자체는 아닙니다. .env는 설정을 적는 일반 텍스트 파일이므로 누가 읽고 어디에 복사하는지 관리해야 합니다. 자료를 복사해 보관하는 **백업(backup)**에도 비밀값이 들어갈 수 있습니다.

먼저 가상환경에 공식 패키지를 설치합니다. 이 명령은 네트워크와 패키지 설치가 가능한 개인 실습 환경에서 실행합니다.

python -m pip install python-dotenv
python -m pip show python-dotenv

프로젝트에 .env.example을 만들고 다음처럼 가짜 값만 적습니다. 공유하는 예시는 이것입니다.

DEMO_API_KEY=practice-only-not-a-real-key

개인 실습에서는 이 파일을 .env라는 이름으로 복사합니다. 9장의 .gitignore가 적용되는지 git status로 확인합니다. 실제 키를 새로 발급받을 필요는 없습니다.

dotenv는 설치한 python-dotenv 패키지를 코드에서 불러올 때 쓰는 모듈 이름입니다. load_dotenv()는 지정한 파일을 읽어 환경변수로 반영합니다. override=False는 이미 주어진 환경변수가 있으면 파일 값으로 덮어쓰지 말라는 옵션입니다. bool(key)는 키가 비어 있지 않은지만 보여 줍니다. 이 코드는 가짜 키의 존재 여부만 확인하며 실제 서비스에 보내지 않습니다.

secret_demo.py에 저장합니다.

import os
from pathlib import Path
from dotenv import load_dotenv

BASE = Path(__file__).resolve().parent
load_dotenv(BASE / ".env", override=False)
key = os.getenv("DEMO_API_KEY")
if not key:
    raise SystemExit("DEMO_API_KEY 설정이 필요합니다")
print("키 설정 여부:", bool(key))

출력은 키 설정 여부: True입니다. 키 자체는 출력하거나 전송하지 않습니다. load_dotenv()는 명시한 파일의 값을 읽어 환경에 반영하며, override=False는 이미 설정된 환경변수를 덮어쓰지 않는 정책입니다. 운영환경에서 따로 주입된 값을 로컬 파일이 바꾸지 않게 할 때 유용합니다.

패키지 설치 후 필요하면 현재 의존성을 requirements.txt로 기록합니다. .env.example은 추적해도 실제 .env를 커밋하는 것은 별도 문제입니다. 비밀정보가 이미 노출됐다면 서비스에서 키를 폐기·교체한 뒤 이력과 로그 등 노출 위치를 확인합니다. 현재 파일의 한 줄 삭제로 이전 노출까지 무효가 되지는 않습니다.