“테이블 이름으로 암호화/복호화하자”에서 출발해, 학습용 치환 로직을 거쳐 Fernet 대칭키 기반 보안 구조로 고도화했습니다. API·서비스·모델을 분리하고, 키 관리/백업·복원/테스트 체계를 정비해 운영 안정성과 확장성을 확보했습니다.
치환 암호화 웹 서비스
나만의 규칙으로 메시지를 암호화하고 복호화하세요
프로젝트 개요
서비스 화면


주요 기능
사용자 정의 테이블(보안 저장)
- name 기반 테이블 생성/조회, JSON 직렬화 후 Fernet로 암호화 저장
- name UNIQUE 제약, 소유자 검증 및 길이/문자 검증
레거시 치환 암호화(데모)
- 줄 개수 기반 시프트 → 역순 → base64 (학습용)
- 프로덕션 사용 비권장(명시적 경고 배너 표시)
Fernet 기반 메시지 암·복호
- Fernet(AES-CBC + HMAC)으로 인증·암호화
- (선택) 메시지 TTL 검증, Passphrase→Argon2id KDF로 키 유도
모듈러 아키텍처 & 테스트
- Flask routes ↔ 서비스(crypto/table) ↔ 모델 완전 분리
- 핵심 함수는 순수 함수로 유닛 테스트 용이
운영 안전장치
- 레이트 리밋·입력 길이 제한·요청 로그(민감정보 마스킹)
- 키 ID(KID)·버전·타임스탬프 관리, 백업/복원 시 검증
아키텍처 구성도

- React 프론트엔드 → Flask API(routes.py)
- routes → crypto_service.py / table_service.py 위임
- 테이블: JSON → Fernet 암호화(blob) → substitution_table 모델에 저장(name UNIQUE, kid, version, created_at)
- 키: 환경변수/비밀 저장소에서 로드, (선택) 키 링·로테이션(KID)
- 백업/복원: admin/backup_restore.py (무결성 체크, 중복 name 방지)
- 보안: HTTPS, 레이트 리밋, 입력 검증, 민감정보 비로그
기술 스택
백엔드: Python, Flask, SQLAlchemy, cryptography(Fernet) 프론트엔드: React 데이터베이스: SQLite(로컬), PostgreSQL(확장) 인프라: Docker, Gunicorn, Nginx 보안/키관리: .env/비밀 저장소, (선택) 키 로테이션(KID), Argon2id KDF 테스트/문서: pytest, Swagger(OpenAPI)
담당 역할
암호화 설계 및 서비스 전환
- 레거시 치환 로직을 보안 경고 포함 데모로 격리
- Fernet 도입, 테이블 JSON 직렬화 및 안전 저장 플로우 설계
아키텍처 리팩토링
- API·서비스·모델 분리, 순수 함수화로 테스트 용이성 확보
- name UNIQUE/검증, 레이트 리밋·사이즈 제한 적용
키/백업 운영 체계
- 환경변수 기반 키 주입, (선택) KID·로테이션
- 백업/복원시 무결성 검사 및 충돌 처리