- frontend: visitor public home (AiAssistant, AiPlanningBriefing, VisitorTrackPage), 3-track public routing (PublicShell/App), i18n ko/en/zh/ja, favicon - backend: public AI visitor-assistant + event calendar API (publicsite/*), profile avatar API (auth/profile/*), SecurityConfig CORS whitelist, SecretStartupValidator (B12 fail-fast, prod only), application-prod.yml, AppIntegrity, /api/auth/me expansion (MeResponse) - db: V42 bulk demo seed, V43 visitor_guide/transport + event calendar view, V44 performance indexes, V45 app_user profile photo columns (all idempotent) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
6.6 KiB
6.6 KiB
KINTEX AI 모바일 앱 + 백엔드 보안 체크리스트
대상:
mobile/(Expo SDK 51 · expo-router · RN 0.74) +src/backend(Spring Boot 3.x · MyBatis · PostgreSQL) 기준 표준: OWASP MASVS v2 / MSTG, 행안부·KISA "모바일 대민 서비스 앱 소스코드 검증 가이드", 전자정부 모바일 표준보안 요구사항 킨텍스는 공공 전시장(한국국제전시장) 대상 서비스 — 공공기관 대민 앱 기준을 함께 적용한다. 판정 결과는mobile-security-audit.md, 개선 작업은 동 문서 하단 백로그 참조.
표준 매핑 표기
- MASVS-STORAGE / -CRYPTO / -AUTH / -NETWORK / -PLATFORM / -CODE / -RESILIENCE
- KISA: 대민 앱 검증 가이드 항목군(위변조·데이터보호·통신·인증·시큐어코딩·서버)
1. 앱 위변조 방지 (Anti-Tampering) — MASVS-RESILIENCE / KISA 위변조
| ID | 항목 | 기준 | 근거 표준 |
|---|---|---|---|
| AT-1 | 루트/탈옥 탐지 | 루팅(Android)·탈옥(iOS) 단말에서 실행 시 경고·기능 제한·차단 | MASVS-RESILIENCE-1, KISA 위변조-1 |
| AT-2 | 앱 서명/무결성 검증 | 서명 인증서 지문 확인, 리패키징(재서명) 탐지, Play Integrity/App Attest 검토 | MASVS-RESILIENCE-2, KISA 위변조-2 |
| AT-3 | 코드 난독화 | JS 번들 Hermes 바이트코드 컴파일, 네이티브 R8/ProGuard 난독화·최적화 활성 | MASVS-RESILIENCE-3 |
| AT-4 | 디버거/후킹 탐지 | 디버거 attach·Frida/Xposed 후킹·에뮬레이터 실행 탐지 | MASVS-RESILIENCE-4 |
| AT-5 | 디버그 비활성 | 릴리스 빌드 android:debuggable=false, JS __DEV__ 코드 제거 |
MASVS-RESILIENCE, KISA 위변조-3 |
| AT-6 | 개발자모드/USB 디버깅 대응 | 민감 작업 시 개발자옵션·USB 디버깅 활성 감지·경고 | KISA 위변조-4 |
2. 데이터 보호 (Data at Rest) — MASVS-STORAGE / KISA 데이터보호
| ID | 항목 | 기준 | 근거 표준 |
|---|---|---|---|
| DP-1 | 토큰 안전저장 | JWT·세션 토큰은 Keychain(iOS)/Keystore(Android) = expo-secure-store, 평문 AsyncStorage 금지 | MASVS-STORAGE-1, KISA 데이터-1 |
| DP-2 | 하드코딩 비밀 0 | 소스·설정에 API 키·비밀번호·토큰 하드코딩 없음(grep 0건) | MASVS-STORAGE-2, KISA 데이터-2 |
| DP-3 | 비밀번호 미저장 | 로그인 비밀번호를 단말에 어떤 형태로도 저장하지 않음 | MASVS-STORAGE-1 |
| DP-4 | 화면캡처/오버레이 방지 | 민감 화면(2FA·티켓QR·개인정보) FLAG_SECURE로 캡처·녹화·오버레이 차단 | MASVS-PLATFORM-3, KISA 데이터-4 |
| DP-5 | 백그라운드 스냅샷 | 앱 전환 시 민감 화면 마스킹(태스크 스위처 스냅샷 노출 방지) | MASVS-STORAGE-7 |
| DP-6 | 클립보드 보호 | 비밀번호·토큰·개인정보 필드 클립보드 복사 최소화·자동삭제 | MASVS-STORAGE-8 |
| DP-7 | 로그 내 민감정보 0 | 토큰·비밀번호·개인정보를 로그(console/logcat)에 남기지 않음 | MASVS-STORAGE-3, KISA 데이터-3 |
3. 통신 보안 (Data in Transit) — MASVS-NETWORK / KISA 통신
| ID | 항목 | 기준 | 근거 표준 |
|---|---|---|---|
| NW-1 | TLS 강제 | 모든 API가 HTTPS. 평문 HTTP(cleartext) 차단 — Android networkSecurityConfig(cleartextTrafficPermitted=false), iOS ATS 유지 |
MASVS-NETWORK-1, KISA 통신-1 |
| NW-2 | 인증서 검증 | 서버 인증서·호스트명 검증(기본 트러스트스토어). 검증 우회 코드 없음 | MASVS-NETWORK-2 |
| NW-3 | 인증서 피닝 | 공공/민감 앱 권고 — 서버 인증서·공개키 피닝 검토·적용 | MASVS-NETWORK-4, KISA 통신-2 |
| NW-4 | API 키 미노출 | 통신에 클라이언트 하드코딩 API 키 사용 안 함(base URL만 공개) | MASVS-STORAGE-2 |
4. 인증·세션 — MASVS-AUTH / KISA 인증
| ID | 항목 | 기준 | 근거 표준 |
|---|---|---|---|
| AU-1 | 2차 인증(2FA) | TOTP 기반 OTP 로그인 흐름(OTP_REQUIRED→재제출) 지원 | MASVS-AUTH-1, KISA 인증-1 |
| AU-2 | 생체·로컬 잠금 | 앱 로컬 생체(Face/Touch/지문) 재잠금 옵션(민감 진입) | MASVS-AUTH-2 |
| AU-3 | 세션 만료·재발급 | 액세스 토큰 TTL, 만료 시 401 처리·재로그인 유도 | MASVS-AUTH-3 |
| AU-4 | 로그인 실패 잠금 | 연속 실패 임계 초과 시 계정 잠금(서버), 계정 열거 방지 일반화 메시지 | MASVS-AUTH-6, KISA 인증-2 |
| AU-5 | 서버측 권한검증 | 행사 단위 RBAC를 서버에서 강제(클라이언트 신뢰 금지) | MASVS-AUTH-4 |
5. 시큐어 코딩 — MASVS-CODE / KISA 시큐어코딩
| ID | 항목 | 기준 | 근거 표준 |
|---|---|---|---|
| SC-1 | 입력검증 | 클라이언트·서버 이중 입력검증(이메일·비밀번호 길이·형식) | MASVS-CODE-4, KISA SC-1 |
| SC-2 | SQL 인젝션 방지 | MyBatis 파라미터 바인딩(#{}), 동적 ${} 미사용 또는 화이트리스트 가드 |
KISA SC-2 |
| SC-3 | 안전한 난수 | 토큰·OTP·IV 생성에 CSPRNG(SecureRandom) 사용 | MASVS-CRYPTO-3 |
| SC-4 | 웹뷰 안전설정 | (있으면) JS브리지 최소화·파일접근 차단·신뢰 URL만 로드 | MASVS-PLATFORM-2 |
| SC-5 | 딥링크 검증 | 커스텀 스킴(kintex://) 파라미터 검증, 미검증 라우팅 금지 |
MASVS-PLATFORM-1 |
| SC-6 | 예외/스택트레이스 미노출 | 서버·클라이언트 모두 스택트레이스·내부 세부 미노출, 요약 메시지만 | MASVS-CODE-5, KISA 서버-4 |
| SC-7 | 암호화 저장 | 민감 시크릿(OTP secret 등) AES-256-GCM 저장 | MASVS-CRYPTO-1 |
6. 빌드·배포 — MASVS-RESILIENCE / KISA 서버·배포
| ID | 항목 | 기준 | 근거 표준 |
|---|---|---|---|
| BD-1 | 릴리스 로그/소스맵 | 릴리스 빌드에 디버그 로그·소스맵 미포함 | MASVS-RESILIENCE-3 |
| BD-2 | 최소 권한 | app.json 권한 최소화, 불필요 권한 제거(blockedPermissions) | MASVS-PLATFORM-1, KISA 서버-1 |
| BD-3 | 서드파티 취약점 | package.json 의존성 CVE 스캔(npm audit), 최신 유지 | MASVS-CODE-3 |
| BD-4 | 서버 오류응답 | 백엔드 오류 응답에 IP·SSH·비밀번호·스택트레이스 미노출 | KISA 서버-3·4 |
| BD-5 | CORS/헤더 | CORS 허용출처 명시(와일드카드 금지), 보안 헤더 | KISA 서버-2 |
| BD-6 | 시크릿 주입 | JWT_SECRET·암호화 키·DB/SMTP 비번은 env 주입, 코드/커밋 미포함 | MASVS-STORAGE-2 |
판정 기호
- PASS — 기준 충족(증거 있음)
- FAIL — 기준 미충족(구현 필요)
- N-A — 현재 미적용 대상(해당 기능 부재)
- 위험도: High(공공/민감 필수) · Med · Low