군사시설 등 공개제한구역의 고도(Z)값을 CKKS 동형암호로 암호화한 상태로 유지하면서, 신축 건물의 일조권 침해·기준 초과 여부를 판단하는 AI 공간분석 서비스입니다.
공공·민간 시설은 국가안보·국민안전을 이유로 위치·높이 등 공간정보의 공개를 제한합니다. 하지만 그 근처에 건물을 새로 지으려는 민간 입장에서는 일조권 침해 여부를 판단하기 위해 인근 시설의 높이 정보가 필요합니다.
본 프로젝트는 이 두 요구를 동시에 만족시키기 위해, 시설의 Z값(높이·고도)을 동형암호로 암호화한 채로 연산을 수행하여 원본 값은 절대 노출하지 않으면서도 "기준 초과 여부"라는 판단 결과만 제공하는 서비스를 구현합니다.
| 항목 | 내용 |
|---|---|
| 개발 기간 | 2주 |
| UI | Streamlit |
| 배포 | AWS (EC2/ECS + S3) |
- 군사시설 등 공개제한구역은 관련 규정에 따라 고도·3차원 좌표 등 정밀 위치정보 공개가 제한됨
- 인근 신축 건물의 일조권 판단을 위해서는 해당 시설의 높이 정보가 필요함
- → **"안보상 비공개"**와 **"민간의 알 권리"**가 충돌하는 구조적 문제
- 해법: Z값을 복호화하지 않고도 연산 자체를 암호화된 상태로 수행하는 동형암호 기술 적용
① 사용자가 신축 건물 정보(위치 + 높이) 입력
│
② 인근 반경 내 공개제한시설 자동 검색 (BBOX/반경 범위검색)
│
③ 암호화된 시설 Z값 ↔ 사용자 입력 높이(평문) 혼합 연산 비교
│
④ 기준 초과 / 일조권 침해 여부만 토큰 형태로 판정 반환
│
⑤ 지도에는 격자 단위로만 결과 시각화 (원본 좌표·높이 비노출)
입력 데이터 두 갈래
- 관리자/기관 입력 : 공개제한시설 위치(X,Y)·높이(Z) CSV 업로드 → Z값만 CKKS 암호화 저장
- 사용자 입력 : 신축 건물의 위치·설계 높이를 화면에서 직접 입력 (평문, 별도 데이터셋 불필요)
| 체크포인트 | 적용 방식 (Z값 기준) |
|---|---|
| ① 암호화 저장 | 건물 높이·시설 고도(Z값)를 CKKS로 암호화 저장 (X,Y는 지도 표출용 평문 유지) |
| ② 범위검색 | 반경/구역 내 기준 초과 시설을 암호화된 Z값 비교 연산으로 검색·판정 |
| ③ 시각화 대안 | 격자 단위 위험도(초과/미초과)만 색상 표시 + 서버 렌더링 후 결과 전달 |
| ④ 토큰 참조값 | HE:datasetId:buildingIndex 형태 참조 토큰만 반환, 원본 Z값은 서버 내부에서만 취급 |
- 🔒 Z값 암호화 저장 — 공개제한시설 고도를 CKKS 동형암호문으로 저장
- 🔍 범위검색 — 지정 반경/구역 내 기준 초과 시설 검색
- ➕ 암호문-평문 혼합 연산 — 사용자 입력 높이와 암호화 Z값 비교
- ☀️ 일조량 분석 — 월별·시간대별 태양 고도 기반 그림자 영역 계산
- 🗺️ 격자 기반 시각화 — 원본 좌표 비노출, 위험도만 색상 표시
- 🔑 토큰 참조 응답 — 원본 값 대신 참조 토큰만 클라이언트에 반환
- 🤖 AI Agent — 자연어 요청 → 파라미터 추출 → 함수 호출 → 결과 요약
- 📚 RAG 법령 질의응답 — 보안관리규정 등 문서 기반 Q&A
| 구분 | 내용 |
|---|---|
| UI/프론트엔드 | Streamlit |
| 동형암호 | CKKS 기반 HE 라이브러리 (Pyfhel / OpenFHE 검토 후 확정) |
| 공간정보 데이터 | V-World 오픈API (건물/DEM/행정구역), 기상청 오픈API (일조·기상조건) |
| AI Agent | Function Calling 기반 자연어 파라미터 추출 및 함수 실행 |
| RAG | 법령 문서 임베딩 기반 질의응답 |
| 개발 도구 | Claude Code (Claude Extension) |
| 배포 | 단일 Dockerfile로 app.py 전체(HE/geo/agent/rag 포함)를 하나의 컨테이너로 패키징 → AWS EC2/ECS, S3 |
| 구분 | 출처 | 비고 |
|---|---|---|
| 공개제한시설 데이터 | 자체 생성 (가상/샘플) | 실제 데이터 취득 불가 → 임의 좌표·높이 생성 또는 공개 건물 mock 처리 |
| 배경 공간정보 | V-World 오픈API | 건물 footprint, DEM, 행정경계 |
| 기상/일조 조건 | 기상청 오픈API | 날짜별 일사량·기상조건 |
| 신축 건물 정보 | 사용자 직접 입력 | 데이터셋 아님, Streamlit 화면에서 수집 |
| 주차 | 기간 | 내용 |
|---|---|---|
| Week 1 | 1~2일차 | 요구사항 정리, API 연동, 가상 데이터셋 생성, HE 라이브러리 셋업 |
| Week 1 | 3~4일차 | Z값 CKKS 암호화 저장 구현, 사용자 입력 폼 설계 |
| Week 1 | 5~7일차 | 범위검색 + 혼합 연산 판정 로직, 일조량 계산 구현 |
| Week 2 | 8~9일차 | 격자 시각화·서버 렌더링, 토큰 참조 응답 구조 구현 |
| Week 2 | 10~11일차 | AI Agent, RAG 파이프라인 연동 |
| Week 2 | 12일차 | AWS 배포, 성능 최적화 |
| Week 2 | 13일차 | 통합 테스트 및 버그 수정 |
| Week 2 | 14일차 | 발표자료 준비 및 최종 점검 |
# 저장소 클론
git clone <repo-url>
cd zecret
# 의존성 설치
pip install -r requirements.txt
# 로컬 실행
streamlit run app.pyDocker로 실행 (단일 컨테이너, app.py + src/he·geo·agent·rag 전체 포함):
docker build -t zecret .
docker run --rm -p 8501:8501 --env-file .env zecretVWORLD_API_KEY=your_vworld_api_key
KMA_API_KEY=your_weather_api_key
AWS_ACCESS_KEY_ID=your_aws_key
AWS_SECRET_ACCESS_KEY=your_aws_secret
| 리스크 | 대응 방안 |
|---|---|
| 동형암호 연산 비용·속도 | 파라미터 최소화 후 필요 시에만 부트스트래핑 |
| 공개제한시설 실데이터 부재 | 가상/샘플 데이터로 대체, PoC 목적임을 명시 |
| 2주 내 다기능 구현 부담 | 체크포인트 4종 우선 구현 후 AI Agent·RAG 순차 추가 |
MIT License