관리자 백오피스 이행 점검 완료 및 Argus 착수
목차 8개 단원
서론
"온데 관리자 백오피스(admin.onde.click) 서버 환경을 대상으로 SK쉴더스 가이드라인 기준의 첫 이행 점검(Re-inspection)을 마쳤습니다. 이번 단계에서는 가입 인자, 권한 변경 배열, 쿼리 스트링 등 관리자 기능 전반의 많은 파라미터를 추적해 검증했습니다. 읽기 쉽게 화면 증적 항목은 빼고, 1-1부터 8-1까지의 28개 표준 항목 중 '양호' 항목은 간단히 적고 '취약'에서 보안 패치가 끝난 '이행완료' 결함을 중심으로 요약합니다."
관리자 백오피스 1-1 ~ 8-1 이행 점검을 마무리했습니다. 수동 점검을 마감하고 아르고스 자동 진단 플랫폼 구축에 본격 착수합니다.
1. 입/출력 값 검증 부재 영역 (1-1 ~ 1-6)
- 1-1. XSS / CSRF 공격 가능성 (중요 - 이행완료): 회원 정보 조회와 게시글/댓글 검토 API 호출 시 출력값 검증이 없어 생길 수 있던 Stored XSS 위험을 막기 위해 백엔드에 Hibernate
PRE_INSERT/PRE_UPDATE전역 리스너를 적용했습니다. JPA로 저장·수정되는 엔티티의 String 필드가InputSanitizer를 거치도록 해 악성 스크립트와 이벤트 핸들러가 저장 전에 제거되게 했습니다. - 1-2. 삽입 (Injection) 공격 가능성 (중요 - 양호): 페이지 크기 파라미터(
size) 뒤에 악의적인 SQL Injection 구문을 주입하더라도 백엔드 서버(Java/Spring)가 정상적인 정수(int) 타입이 아닌 비정상 문자열로 인지하여 데이터 타입 변환 단계에서 실행을 즉시 중단(500 에러)시키므로 차단되는 양호한 상태입니다. - 1-3. 파라미터 값 및 히든(hidden) 필드 조작 가능성 (중요 - 양호): 일반 어드민(
USER_ADMIN)과 정산 어드민(SELLER_ADMIN)의 역할 권한이 백엔드 시큐리티 설정 및 API 게이트웨이 레벨에서 분리되어 있어, 타 부서 관리 기능 무단 호출 시 즉시 403 Forbidden 처리되므로 안전합니다. - 1-4. SSRF / File Inclusion 공격 가능성 (중요 - 양호): 어드민 모듈 내에 외부 파일 리드 기능이나 외부 HTTP API 연동 호출부가 존재하지 않으며, 클라이언트가 직접 목적지 경로를 파라미터로 지정하여 송신할 수 있는 변수 구조 자체가 설계상 배제되어 있어 양호합니다.
- 1-5. 검증되지 않은 리다이렉트와 포워드 (일반 - 이행완료): 실서버 배포 환경에서 로컬 개발 Origin이 CORS 허용 목록에 남아 브라우저 동일출처정책(SOP)을 우회할 수 있던 결함을 조치했습니다.
CorsOriginProperties에서 운영 기본값에는 공식 도메인 패턴만 적용하고, prod 프로필에서 localhost가 활성화되면 애플리케이션 기동을 즉각 중단시키는CorsOriginStartupValidator를 탑재하여 통제를 마감했습니다. - 1-6. 입력 값 크기 및 정확성 검증오류 (중요 - 이행완료): 승인·회원 상태·블랙리스트 사유 등 6개 Case 요청 DTO에
ValidationLimits기준@Size,@NotNull,@Valid를 적용했습니다. 정산 API의 Map 수신 구조를 typed DTO로 바꿔 비정상 Enum이나 긴 문자열이 들어오면 컨트롤러 단계에서 HTTP 400 오류로 처리되도록 수정했습니다.
2. 취약한 파일 처리 영역 (2-1 ~ 2-2)
- 2-1. 악성코드파일 업로드 (중요 - 양호): 관리자용 모듈 전반에는 클라이언트로부터 직접 이미지나 임의의 파일을 전송받아 서버에 저장하는 파일 업로드 기능 및 비즈니스 로직(Multipart/FormData 처리부)이 설계상 존재하지 않아 양호한 상태입니다.
- 2-2. 중요 정보 파일 다운로드 가능성 (중요 - 양호): 서버 디렉터리 내부의 임의의 파일을 리드하여 클라이언트로 스트리밍 다운로드해 주는 파일 다운로드 API 서비스가 설계상 존재하지 않으며, 오직 안전한 텍스트 형식의 JSON 데이터 응답만을 제공하므로 안전합니다.
3. 취약한 접근 통제 관리 영역 (3-1 ~ 3-6)
- 3-1. 패스워드 정책 유무 및 반영 여부 (일반 - 이행완료): 진단 시 패스워드 변경 UI와 API가 부재했던 결함을 조치하기 위해
AdminAuthController를 통해 패스워드 변경 API를 새로 만들었습니다. 수신 DTO에@ValidPassword(level = ADMIN)및PasswordPolicy를 적용하여 영문 대·소문자·숫자·특수문자 4종 모두 포함 및 10자 이상의 복잡도를 적용하고 직전 비밀번호 재사용을 서버 단에서 차단하도록 조치했습니다. - 3-2. 인증 실패 횟수 제한 (일반 - 이행완료): 특정 관리자 계정에 대한 무제한 브루트 포스 시도를 차단하기 위해
LoginAttemptService를 연동했습니다. 인증 실패 시 실패 카운터를 증가시키고, 연속 5회 실패 시 30분간 계정을 임시 잠금 처리하도록 설계하여 잠금 상태에서는 올바른 비밀번호를 입력해도 HTTP 423 LOCKED 상태 코드로 접근이 거부되도록 보완했습니다. - 3-3. 계정 정보 파악 가능성 (일반 - 이행완료): 회원 목록 및 정산 API 조회 시 주요 개인정보와 계좌번호가 평문 표출되던 리스크를 차단하기 위해
PersonalDataMasker공통 필터를 일괄 적용했습니다. 응답 DTO 상에서 민감 데이터에 대한 별표(*) 마스킹 치환을 강화하고, 원문 열람이 필수적인 플로우는 비밀번호 재확인(SensitiveRevealAuthService) 절차를 거친 세션에 한해서만 허용하도록 프로세스를 이중화했습니다. - 3-4. 관리자 페이지 분리 여부 (일반 - 이행완료): 관리자 전용 서브도메인과 경로가 쉽게 짐작되는 이름으로 노출되던 문제를 고쳤습니다. 운영 포털 서브도메인을
rookies.onde.click으로 바꾸고, 관리자 로그인 경로에 환경 변수 기반 난독화 세그먼트 주소(/onde-entry-8k2p)를 적용해 기존/admin접근은 Nginx에서 404로 막도록 했습니다. - 3-5. 검색엔진 정보 노출 가능성 (일반 - 이행완료): 비공개 영역 경로 노출을 차단하기 위해 사이트 루트에
robots.txt를 배치하고 어드민 도메인은 nginx 분기 통제를 적용했습니다. 또한SeoRobotsGuard를 빌드하여 관리자 포탈 접속 시 소스코드 내에 크롤러 수집을 거부하는<meta name="robots" content="noindex, nofollow">태그가 동적으로 삽입·동작하도록 설정을 완료했습니다. - 3-6. 백업 파일 및 테스트 파일 존재 여부 (일반 - 양호): 60종의 전형적인 백업/테스트 추측 파일명 사전 목록을 무작위 대입 스캐너(Burp Intruder)에 주입하여 전수 조사를 수행한 결과, 다운로드 가능한 백업 압축본은 발견되지 않았으며 모든 미존재 경로에 대해 404 또는 안전한 예외 제어 응답이 반환되어 양호합니다.
4. 취약한 인증 및 세션 관리 영역 (4-1 ~ 4-5)
- 4-1. Cookie 및 웹 스토리지 조작 가능성 (일반 - 이행완료): 응답 JSON 바디와 프론트엔드 일반 쿠키에 JWT가 그대로 노출되어
HttpOnly방어가 무력해지던 문제를 고쳤습니다. 전체 인증 API 응답 객체에서 토큰 필드를 삭제하고,AuthCookieSupport를 통해 브라우저가 관리하는 보안 속성(HttpOnly,Secure,SameSite=Lax) 쿠키로만 전달되도록 구조를 하나로 정리했습니다. - 4-2. 인증(세션 및 토큰) 값 안전성 설정 여부 (일반 - 이행완료): 다중 만료/파기 통제 메커니즘을 구축했습니다.
- 정보 노출 차단: 응답 내
memberId표출 필드를 소멸시키고, JWT 페이로드sub내부의 평문 이메일을 가입자 고유 매핑 UUID 값으로 치환해 전체 비식별화했습니다. - 로그아웃 파기:
POST /api/v1/auth/logoutAPI를 구현하여 수신 즉시 Access Token JTI를 Redis 블랙리스트에 등록 무효화하고 DB 내 Refresh Token을 삭제하도록 패치했습니다. - 중복 로그인 차단: 토큰 발급 시 접속 IP 및 User-Agent 해시를 RefreshToken에 강력 바인딩하여 요청 환경 불일치 시 인증을 거부하고, 신규 로그인 시 기존 세션을 즉각 세션 킬링(
Session Killing)하도록 조치했습니다.
- 정보 노출 차단: 응답 내
- 4-3. 접근제어 우회 가능성 확인 (일반 - 양호): 프론트엔드 라우터 단의 인증 가드 규칙과 백엔드 서버(admin-module) 스프링 시큐리티의 패턴 기반 인가 규칙, 그리고 각 컨트롤러 메서드 단의
@PreAuthorize레이어가 결합되어 우회 가능성을 견고하게 차단 중입니다. - 4-4. 비인증 상태로 중요 page접근 가능성 (일반 - 양호): 세션이 없는 비인증 상태에서 관리자 자산 URL 직접 진입 시, 라우팅 가드 시스템이 즉각 차단하여 전용 로그인 주소로 리다이렉트 시키며 백엔드 역시 401 Unauthorized를 명확히 배출하여 양호합니다.
- 4-5. 일반계정 권한 상승 가능성 (일반 - 이행완료): 가입 패킷의 Body 데이터를 검증 없이 받아 role 파라미터를 바꾸면 관리자 계정이 생성되던 로직 결함을 고쳤습니다. 백엔드에
SignupRolePolicy를 추가해 가입 역할을 일반 등급(USER,SELLER) 화이트리스트로만 제한하고, 그 외 관리자 등급이 들어오면 HTTP 403 오류를 반환해 가입을 막았습니다.
5. 중요 정보 저장/전송 처리 미흡 & 부적절한 오류 처리 (5-1 ~ 6-2)
- 5-1. 소스코드 내 주요정보 노출 여부 (일반 - 이행완료): 설정 변수 로드에 실패하면 소스코드에 하드코딩한 기본 문자열 상수로 실행되던 대칭키 암호화 유틸 클래스의 취약한 방식을 없앴습니다.
RequiredSecretValidator를 연결해 시스템 초기화 단계에서 환경 변수(JWT_SECRET,AES_SECRET_KEY) 주입 실패나 형식 미달을 감지하면 예외가 발생해 실행되지 않는 Fail-Fast 방식으로 바꿨습니다. - 5-2. 요청 및 응답 값 내 주요정보 포함여부 확인 (중요 - 양호): 연계된 데이터 비식별화 마스킹 조치 외에, 중요 정보 구간 암호화 가이드를 지켜 단독으로 도출된 보안 취약점 없이 안전하게 관리되고 있습니다.
- 6-1. 오류페이지를 통한 정보 노출 여부 (일반 - 이행완료): 오작동 파라미터 유입 시 스프링 파서 예외 스트링 및 상세 디버깅 스택트레이스가 반사 노출되던 취약점을 전역 에러 제어기(
@RestControllerAdvice) 구조 정비를 통해 차단했습니다. 최상위 예외 발생 시 내부 오류 문장을 응답 객체에 바인딩하는 코드를 제거하고 외부에는 마스킹된 표준 보안 안내문만 리턴하도록 보완했습니다. 아울러 프론트엔드 Toast 알림창 역시 원시 에러 대신 정형화된 안내 메시지만 띄우도록 가공 처리 완료했습니다. - 6-2. 일괄적인 오류 처리 페이지 존재 여부 (일반 - 양호): 미등록 계정명을 입력하든, 혹은 패스워드를 다르게 송신하든 상관없이 동일하게
HTTP 401 Unauthorized상태 코드와 일관된 메시지("인증에 실패하였습니다.")를 일괄 반환하도록 설계되어 계정 유추 가능성을 전체 통제 중입니다.
6. 취약한 컴포넌트 구성요소 & 기타 인프라 보안 (7-1 ~ 8-1)
- 7-1. Client Request Method (일반 - 양호): 비인가 위험 메소드인 TRACE 방식 패킷 전송 시 앞단 로드밸런서 및 Nginx 웹 서버 레벨에서 안전하게 요청을 거부하고
HTTP 405 Not Allowed에러 페이지를 즉각 반환하며 진입을 막고 있음을 실증했습니다. - 7-2. 파일 목록화 가능성 (일반 - 양호): 정적 파일 디렉터리 경로들을 대상으로 동적 스캔 검증을 수행한 결과, Nginx의 글로벌 구성에서
autoindex off;설정이 기동 중이며 디렉터리 리스트 요청 시 직접HTTP 403 Forbidden상태 코드를 배출하여 안전합니다. - 7-3. 서버 헤더정보 노출 (일반 - 이행완료): API 응답 Server 헤더에 웹 서버 엔진의 상세 버전 정보가 평문으로 나오던 설정을 고쳤습니다. Nginx에
server_tokens off;를 적용해 버전 노출을 숨기고,headers-more-nginx-module설정을 추가해 모든 응답 패킷의 Server 필드가 엔진 버전 없이Server: WebServer텍스트로만 나오도록 했습니다. - 7-4. 취약한 보안설정 (일반 - 이행완료): 수동 진단 때 7-4로 잡았던 CORS 오설정을 조치했습니다. 기존
WebConfig.java에서 모든 출처의 접근을 허용하던 위험한 와일드카드 설정.allowedOriginPatterns("*")을 삭제했습니다. CORS 접근 정책은 Properties와 SecurityConfig의 정적 허용 모듈로 한곳에서 관리하도록 정리해 비인가 도메인 요청은HTTP 403 Invalid CORS request로 막도록 했습니다. - 8-1. 취약점 진단 항목에 정의되지 않은 취약점 (일반 - 이행완료): 소스 구성 및 환경 사양 오설정 결함 2종을 조치했습니다.
- Redis 인증 설정: 내부망 분산 캐시 세션을 처리하는 Redis 설정 파일 내에 무인증 접근을 금지하는
requirepass지시어를 의무 활성화하고 백엔드 환경 변수에 암호 자격증명을 할당하여 무인증 접근 시NOAUTH오류로 막히도록 했습니다. - Actuator 노출 차단: 상태 모니터링 엔드포인트 누출을 막기 위해
application.yml빌드 옵션 내에management.endpoints.enabled-by-default: false제약 속성을 선언하고, 웹 노출 대역을 오직 안전성 체크용 헬스 체크(health) 단일 경로 항목으로만 제한했습니다.
- Redis 인증 설정: 내부망 분산 캐시 세션을 처리하는 Redis 설정 파일 내에 무인증 접근을 금지하는
7. 결론 및 다음 단계: 수동 점검 정리와 '아르고스(Argus)' 자동 진단 플랫폼 구축
일반 사용자 포털, 판매자 오피스에 이어 본사 관리자 백오피스까지 플랫폼 전체 도메인의 첫 수동 취약점 진단과 이행 점검 보고서 작성을 마쳤습니다. 체크리스트 가이드라인을 바탕으로 패킷을 하나씩 확인하며 실서버 환경의 보안 결함을 고친 뒤, 다음 단계로 넘어갑니다.
사람이 매번 수동으로 프록시 도구를 켜고 패킷 변조를 확인하는 작업의 한계를 줄이기 위해, 다음 단계에서는 통합 취약점 자동 진단 플랫폼 '아르고스(Argus)'를 직접 설계하고 구축합니다.
- Next 마일스톤 계획:
- 수동 보안 데이터 정리: 일반, 판매자, 관리자 전체 영역의 취약점 보완 내역과 검증 데이터를 정리해 자동화 진단 엔진의 정탐·오탐 판단에 활용할 기준을 만듭니다.
- 아르고스(Argus) 자동 진단 플랫폼 개발 시작: OWASP ZAP Core 동적 스캔 엔진 정책 제어(FastAPI), Selenium Headless 브라우저 기반 UI Replay 증적 자동 캡처, 진단 결과를 요약해 원클릭 한글 PDF 보고서를 만드는 Argus 통합 자동화 플랫폼 개발을 시작합니다.
수동 진단 · 이행 점검단계 3 · Day 15–28 · 14 / 14일지 전체 →
- Day 15아르고스(Argus) 명칭·A/B/C 분담, 5개 설계 산출물 및 7월 개발 일정 수립
- Day 16WEB/API 취약점 진단 및 모의침투(Penetration Testing) 기록
- Day 17온데 실서버 배포와 2차 멘토링용 질문 정리
- Day 18두번째 멘토링
- Day 19온데(Onde) 멘토링 피드백 반영 및 아르고스(Argus) 모듈 별 1인 개발 파이프라인 개발
- Day 20아르고스 3주 일정 확정과 온데 DAST 가능성 평가
- Day 21웹/API 보안 취약점 진단 상세 결과 및 초보 진단자의 시행착오
- Day 22웹/API 최초 취약점 진단 결과보고서 — 파라미터 검증과 파일 처리
- Day 23중간 발표 PPT 작성
- Day 24실전 모의침투 보안 진단 보고서 — 3-2 ~ 8-1 항목
- Day 25관리자 백오피스 수동 보안 진단 결과보고서
- Day 26전 영역 보안 보완 이행 점검 결과 (상편: 1-1 ~ 3-6)
- Day 27전 영역 보안 보완 이행 점검 결과 (하편: 4-1 ~ 8-1)
- Day 28관리자 백오피스 이행 점검 완료 및 Argus 착수