OWASP 2017 웹 애플리케이션 보안 위험과 대응
OWASP Top 10 2017의 인젝션, 인증, 데이터 보호, 접근 제어, 로깅 취약점과 웹 애플리케이션 대응 방안을 정리한다.
2026-08-14 · 최초 발행 2025-05-27
웹 애플리케이션 보안 검토의 기준점
OWASP(Open Web Application Security Project) Top 10 2017은 웹 애플리케이션에서 빈번하게 나타나는 취약점과 대응 방향을 묶어 제시한다. 개발자와 설계자, 아키텍트, 관리자, 조직이 보안 위험을 식별하고 줄이는 데 활용할 수 있는 기준이다.
신뢰할 수 없는 입력이 인터프리터에 닿을 때
인젝션은 신뢰할 수 없는 데이터가 명령어나 쿼리 일부로 인터프리터에 전달될 때 발생한다. SQL, NoSQL, OS 명령, XML 파서, LDAP, Expression Language, OGNL 인젝션이 여기에 포함된다.
공격자는 입력 필드에 ' OR 1=1 -- 같은 악성 SQL 코드를 넣어 데이터베이스의 모든 사용자 정보를 추출할 수 있다. OS 명령 실행 취약점이 있다면 ; rm -rf / 같은 명령어로 시스템 파일을 삭제할 수도 있다.
데이터와 명령어를 분리하는 방식이 출발점이다. 파라미터화된 쿼리(Prepared Statements)와 저장 프로시저를 사용하고, 입력은 화이트리스트 기반으로 검증한다. ORM(Object Relational Mapping) 도구를 활용하며, LIMIT 절을 적용해 SQL 인젝션이 발생했을 때 대량 데이터 유출을 줄일 수 있다.
인증 정보와 세션을 보호하는 방식
인증 및 세션 관리 기능이 잘못 구현되면 공격자는 암호, 키, 세션 토큰을 탈취하거나 다른 사용자의 권한을 얻을 수 있다. 공용 컴퓨터에서 로그아웃하지 않은 세션이 세션 타임아웃 미설정으로 계속 남거나, URL에 노출된 세션 ID가 탈취되는 상황이 예다.
다중 인증(MFA)을 구현하고 취약한 암호를 확인하며 강력한 암호 정책을 적용한다. 세션 ID는 URL에 노출하지 않고, 쿠키에 저장할 때 Secure와 HttpOnly 속성을 적용한다. 일정 시간이 지나면 세션을 만료시키고 로그아웃 기능을 제공해야 한다.
민감한 데이터는 저장과 전송 모두에서 보호한다
금융 데이터, 건강 정보, PII(개인 식별 정보)는 보호가 부족하면 위험해진다. 전송 중 암호화가 없거나 저장 과정에서 약한 암호화 알고리즘을 사용한 경우가 대표적이다.
HTTPS 대신 HTTP로 민감한 데이터를 전송하면 중간자 공격에 노출된다. 비밀번호를 평문이나 MD5, SHA-1 같은 약한 해시로 저장한 경우에는 유출 뒤 즉시 복구될 수 있다.
필요하지 않은 민감 데이터는 저장하지 않는 데이터 최소화가 우선이다. 민감 데이터는 전송 시 TLS, 저장 시 강력한 알고리즘으로 암호화하고 AES-256, RSA-2048 이상의 최신 암호화 알고리즘·프로토콜·키를 사용한다. 키 관리와 순환 정책도 함께 마련한다.
XML 외부 개체 처리의 위험
XXE는 2017 목록에 새롭게 추가된 취약점이다. 오래된 XML 프로세서가 XML 문서 안의 외부 개체 참조를 처리할 때 발생한다.
외부 엔티티 참조를 포함한 XML 입력은 서버 내부 파일 읽기, 내부 포트 스캔, 원격 코드 실행으로 이어질 수 있다. <!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>는 시스템 파일 접근에 사용될 수 있는 예다.
가능하다면 JSON처럼 덜 복잡한 데이터 형식을 사용한다. XML 프로세서와 라이브러리를 패치 및 업데이트하고, XML 외부 엔티티와 DTD(Document Type Definition) 처리를 비활성화한다. XSD 검증과 입력 데이터 검증도 적용한다.
URL과 API 요청에서 권한 경계를 지킨다
취약한 접근 제어는 인증된 사용자가 수행할 수 있는 작업의 제한이 제대로 적용되지 않는 상태다. 권한 상승, 기밀 정보 접근, 데이터 수정으로 이어질 수 있다.
/app/userInfo를 /app/adminInfo로 바꾸는 URL 변조나, API 요청의 사용자 ID 파라미터를 변경해 다른 사용자의 데이터에 접근하는 방식이 이에 해당한다.
기본 접근 거부(Deny by default)를 적용하고 모든 접근 제어 검증은 서버 측에서 수행한다. 토큰 기반 접근 제어와 RBAC(역할 기반 접근 제어) 모델을 구현하며, 세션 만료와 로그아웃 기능도 강화한다.
배포 설정이 노출하는 공격면
보안 설정 오류는 가장 흔히 발견되는 보안 문제다. 기본 설정 사용, 불필요한 기능 활성화, 오류 메시지의 과도한 정보 노출이 원인이 된다.
기본 계정과 비밀번호인 admin/admin이 활성화된 채 배포되거나, 디렉터리 리스팅으로 백업 파일과 소스 코드가 발견될 수 있다. 디버그 모드 애플리케이션은 사용자에게 스택 트레이스를 노출할 수 있다.
보안 강화된 반복 가능한 배포 프로세스를 갖추고, 필요하지 않은 기능·문서·샘플·포트를 제거한다. 개발, QA, 운영 환경에 동일한 보안 설정을 적용하며 정기적으로 설정을 검토하고 업데이트한다.
브라우저에 전달되는 데이터를 코드와 분리한다
XSS는 애플리케이션이 신뢰할 수 없는 데이터를 검증이나 이스케이핑 없이 웹 페이지에 포함할 때 발생한다. 브라우저에서 악성 스크립트가 실행되면 세션 탈취, 웹사이트 변조, 악성 사이트 리다이렉션이 가능하다.
반사형 XSS는 http://example.com/search?q=<script>alert(document.cookie)</script> 같은 악성 링크를 통해 실행된다. 저장형 XSS는 악성 코드가 데이터베이스에 저장된 뒤 다른 사용자에게 표시될 때 발생하며, DOM 기반 XSS는 클라이언트 측 JavaScript가 데이터를 안전하지 않게 처리할 때 나타난다.
React, Ruby on Rails처럼 자동 이스케이핑을 제공하는 프레임워크를 사용해 데이터와 코드를 분리한다. 입력값 검증과 출력 인코딩을 적용하고, Content-Security-Policy(CSP) 헤더와 XSS 필터, 자동화된 테스트 도구를 활용한다.
역직렬화 경로에 적대적 객체를 허용하지 않는다
안전하지 않은 역직렬화도 2017 목록에 새롭게 추가됐다. 애플리케이션이 적대적이거나 손상된 객체를 역직렬화할 때 원격 코드 실행, 권한 상승, 인젝션 공격이 가능해진다.
PHP 애플리케이션이 unserialize() 함수로 사용자 입력을 처리하거나, 자바 애플리케이션이 readObject() 메소드를 통해 공격자가 제어하는 클래스를 역직렬화하는 경우가 예다.
신뢰할 수 없는 소스의 직렬화된 객체는 수용하지 않는다. 정수와 문자열 같은 기본 데이터 유형만 허용하는 직렬화 방식을 사용하고, 역직렬화 과정에서 무결성 검사와 유형 제약을 적용한다. 이 과정은 모니터링하고 로깅한다.
의존성의 알려진 취약점을 관리한다
패치되지 않은 라이브러리, 프레임워크, 소프트웨어 모듈은 알려진 취약점의 공격면이 된다. 공격자는 이를 이용해 서버에 접근하거나 데이터를 유출하고 애플리케이션을 장악할 수 있다.
취약한 버전의 Apache Struts2 사용은 원격 코드 실행 취약점에 노출될 수 있으며, 2017년 Equifax 침해 사례가 언급된다. 오래된 jQuery 버전은 XSS 취약점을 만들 수 있다.
사용하지 않는 의존성, 기능, 파일, 문서를 제거한다. 컴포넌트의 버전·구성·의존성을 지속적으로 관리하고 신뢰할 수 있는 소스에서만 컴포넌트를 획득한다. 보안 공지를 모니터링하며 패치 관리 프로세스를 운영한다.
공격을 발견할 수 있는 로그와 대응 체계
불충분한 로깅 및 모니터링은 2017 목록에 새롭게 추가된 취약점이다. 보안 이벤트를 적절히 기록·감시·대응하지 못하면 공격자의 활동이 지속될 수 있다.
로깅이 부족하면 침입을 발견하는 시점이 늦어진다. 탐지 뒤 대응 메커니즘이 없다면 공격은 확산될 수 있다. 2016년 통계에서는 침해 발견까지 평균적으로 200일 이상 소요된다고 제시됐다.
모든 인증 실패, 접근 제어 실패, 서버 측 입력 검증 실패를 기록한다. 로그에는 사용자, 시간, 데이터 등 충분한 컨텍스트를 남기고 중앙 집중식 로그 관리 및 분석 시스템을 구축한다. 모니터링과 알림 프로세스도 함께 운영한다.
조직과 개발 과정에 반영하는 보안 활동
조직은 개발자와 관리자를 대상으로 정기 보안 교육을 실시하고, 개발 초기부터 보안 요구사항을 통합해야 한다. CI/CD 파이프라인에는 보안 테스트를 포함하는 DevSecOps를 구현하며, 자동화 도구와 수동 테스트를 결합해 정기적으로 취약점을 평가한다.
개발자는 언어와 프레임워크별 보안 코딩 표준을 따르고 보안 중심의 코드 리뷰 프로세스를 운영한다. 검증된 보안 컴포넌트와 라이브러리를 사용하며, OWASP 및 관련 보안 커뮤니티 자료를 통해 지속적으로 학습한다.
OWASP Top 10 2017은 단일 점검 항목이 아니라 웹 애플리케이션 보안 태세를 계속 관리하기 위한 기준이다. 취약점의 특성을 이해하고 개발·배포·운영 단계에 대응 전략을 연결해야 한다.