 |
|
난이도 : 중급 Todd Kaplinger, Project Zero Architecture & Development, IBM Masayoshi Teraguchi, Research Staff Member, IBM Gang Chen, IBM Software Services for WebSphere, IBM
원문 게재일 : 2007 년 11 월 06 일 번역 게재일 : 2009 년 10 월 13 일 ACF(Active Content Filtering)를 사용하면 사이트 간 스크립트와 같은 일반적인
Web 2.0 기반 애플리케이션 공격을 차단하고 Project Zero 애플리케이션의 보안을 획기적으로 강화할
수 있습니다. ACF는 분리 가능한 Project Zero의 구성 요소로 요청 데이터(예: 요청 매개변수)와
클라이언트에 전송되는 응답 출력에서 활성 컨텐츠를 제거할 수 있는 라이브러리를 제공합니다. 활성
컨텐츠가 있는 Project Zero 환경에 ACF를 적용하여 얻을 수 있는 강력한 기능에 대해 설명합니다.
편집자 주: IBM® WebSphere® sMash 및 IBM WebSphere
sMash Developer Edition의 토대는 좋은 평판을 받고 있는 Project
Zero 인큐베이터 프로젝트이다. Project Zero는 WebSphere sMash를 위한 개발 커뮤니티로 개발자에게
애플리케이션 개발을 위한 무료 플랫폼을 제공하는 동시에 최신 빌드, 최신 기능 및 커뮤니티 지원도 지속적으로
제공할 것이다.
ACF 소개
ACF를 이해하려면 Project Zero를 먼저 이해해야 한다. 다음은 Project Zero웹 사이트에 실려 있는 글이다.
"Project Zero는 차세대 동적 웹 애플리케이션의 애자일 개발에 중점을 두고 IBM®에서 시작된 인큐베이터
프로젝트이다. Project Zero는 잘 알려진 웹 기술을 기반으로 하는 애플리케이션을 생성, 어셈블링 및 실행할 수
있는 단순한 환경을 소개한다. Project Zero 환경에는 Groovy 및 PHP용 스크립트 런타임과 함께 REST 스타일 서비스,
통합 매시업 및 리치 웹 인터페이스의 생성에 최적화된 애플리케이션 프로그래밍 인터페이스가 들어 있다."
Project Zero의 주 대상이 차세대 동적 웹 애플리케이션(일반적으로 Web 2.0의 하위 요소로 분류됨)이므로
이 기사에서는 매시업, wiki, 블로그 등의 사용자 제공 컨텐츠가 포함된 대화식 웹 애플리케이션을 중점적으로 다룬다. 이러한
애플리케이션을 지원하기 위해 Project Zero에서는 ACF를 애플리케이션 개발자가 Zero 애플리케이션의 일부로 포함할 수 있는
라이브러리로 제공한다. ACF를 사용하면 이러한 유형의 애플리케이션에서 발생할 수 있는 사이트 간 스크립트와 같은 문제에
노출되는 것을 방지할 수 있다. (참고자료에서 제공하는 링크를 통해 사이트 간 스크립트에 대한
설명을 볼 수 있다.)
예제 소개
저자 주: 이 기사를 처음 집필하던 당시에는 애플리케이션 개발자가 선언적 방식(애플리케이션의
zero.config에 명시적 규칙 정의) 또는 프로그래밍 방식(제공된 API 사용)을 사용해야만 ACF의 기능을 활용할 수 있었다. Project
커뮤니티와 이 기사의 독자가 보내준 의견을 바탕으로 개발 팀에서 다음과 같은 시나리오에 대한 기본 ACF 보호 수준을 제공할
수 있게 되었다. 이 경우 zero.acf를 종속성으로 추가해야 한다.
-
요청 매개변수. URI로 전송되는 모든 인바운드 요청 매개변수에서 활성
컨텐츠(예: JavaScript, Applet 및 ActiveX 오브젝트)를 제거한다. 이러한 매개변수는 HTML 조각으로 처리된다.
-
JSON 컨텐츠 요청: URI로 전송되는 인바운드 JSON 오브젝트의 모든 문자열
값에서 활성 컨텐츠를 제거한다. 이 경우에는 모든 컨텐츠 유형이 대상이 된다.
-
JSON 컨텐츠 응답: URI에서 보내는 아웃바운드 JSON 오브젝트의 모든 문자열
값에서 활성 컨텐츠를 제거한다. 이 경우에는 "
text/html"을 제외한 모든 컨텐츠 유형이 대상이 된다.
ACF를 기본적으로 사용할 경우 애플리케이션의 요구 사항이 충족되지 않을 수도 있기 때문에
샘플 애플리케이션의 zero.config에는 ACF가 기본적으로 사용되지 않도록 하는 "/config/acf/enableByDefault=false"
구성 옵션이 포함되어 있다. 이 기사에서는 ACF를 선언적 및 프로그래밍 방식으로 활용하는 방법에만 중점을 두고
설명한다. 기사의 섹션 중에서 기본적으로 사용 플래그를 사용할 수 있는 섹션이 있을 경우에는 해당 섹션에서 언급한다.
이 기사에서 제공하는 예제는 단순한 기본 사용 사례부터 복잡한 사용 사례에
이르기까지 ACF의 사용 방법을 단계별로 보여 주기 위해 설계되었으며 각 예제는 이전 예제에서
살펴본 내용을 기반으로 빌드할 수 있도록 설계되었다. 다음은 예제에 대한 요약 설명이며 각
예제에 대해서는 이후 섹션에서 자세히 설명한다.
- 예제 1은 사용자가 외부에서 받은 기사에 대한 의견을 게시할 수 있는
기본적인 Ajax 사용 페이지이다. 이 예제에서는 JavaScript 등의 활성 컨텐츠가 사용자 의견이나
기사에 포함되어 있을 때 발생할 수 있는 문제와 그 대처 방법을 살펴본다.
- 예제 2는 예제 1을 기반으로 하지만 ACF 라이브러리에 대한 지원을
포함한다. 이 예제에서는 JavaScript와 같은 활성 컨텐츠가 기사에 있을 때 ACF 필터링이
작동하는 방법을 보여 준다.
- 예제 3은 예제 2를 기반으로 하지만 요청 매개변수의 ACF 필터링에
대한 지원을 포함한다. 이 예제에서는 JavaScript와 같은 활성 컨텐츠가 사용자 의견에 있을
때 ACF 필터링이 작동하는 방법을 보여 준다.
 |
Project Zero 커뮤니티
Project Zero 웹 사이트에서 Project Zero가 최신 웹
애플리케이션을 위해 제공하는 단순하면서도 강력한 개발 및 실행 플랫폼에 대한 자세한 정보를 볼 수
있다. 활발한 활동이 이루어지고 있는 커뮤니티에서는
프로젝트 개발에 관한 논의가 진행되고 있으며, 개발자에게 필요한 도움을 제공할 뿐만 아니라 사용자의
의견을 기다리고 있다. |
|
이 기사의 다운로드 섹션에서 이 샘플 애플리케이션을 다운로드하여
ACF의 기능을 손쉽게 사용해 볼 수 있다. 웹 뉴스 집계 및 블로그 애플리케이션을 본떠서 만든 이 샘플
애플리케이션에서는 사용자가 오늘의 뉴스에 대한 의견을 서버에 게시할 수 있으며 이렇게 게시된 의견은
다른 사용자에게 표시된다. 그림 1과 같이 페이지의 맨 위에는 뉴스 집계 결과가
표시된다. 하지만 지금 이 페이지에는 잠재적 악성 컨텐츠(깜박이는 빨간색 텍스트)가 삽입되어 있다. Original
source of the news 제목 분할창을 클릭하면 뉴스 집계의 원래 HTML 컨텐츠가 표시된다. 맨 아래
Enter your comments here 입력란에 의견을 입력하고 게시할 수 있으며 Post your comment
단추를 클릭하면 All comments 영역에 해당 의견이 즉시 표시된다.
그림 1. ACF 샘플
이 기사에서는 IBM의 최신 Web 2.0 플랫폼인 Project Zero를 사용하여 서버측
구성 요소를 작성한다. 샘플 애플리케이션 프론트 엔드에서는 새로운 Dojo 및 Ajax 기술을 사용한다.
Project Zero는 ivy.xml 파일에 애플리케이션 종속성 중 하나로 구성되어 있는 zero.acf
라이브러리를 통해 ACF를 지원한다. 이 기사에 포함된 zip 파일에는 샘플 애플리케이션(ACFSampleApp-1.0.0.zip)이
들어 있다. 자주 사용하는 zip 유틸리티를 사용하여 원하는 위치에 리소스를 압축 풀기한다.
명령행 사용자의 경우 다음을 수행한다.
- WebSphere sMash 웹 사이트(참고자료 참조)의 지시 사항에 따라 IBM WebSphere sMash 명령행 유틸리티를 설치한다.
- 샘플 애플리케이션을 압축 풀기한 디렉토리로 이동한다.
zero start를 실행하여 애플리케이션을 시작한다.
애플리케이션 빌더 사용자의 경우 다음을 수행한다.
- WebSphere sMash 웹 사이트(참고자료 참조)의 지시 사항에 따라 IBM WebSphere sMash 명령행 유틸리티를 설치한다.
- CLI가 설치된 zerodirectory로 이동한 후 "startAppBuilder" 스크립트를 실행하여 애플리케이션 빌더를 시작한다.
- 분할창의 왼쪽에 있는 "Browse Applications" 링크를 사용하여 WebSphere sMash 저장소에 있는 OpenID 데모 애플리케이션을 설치한다.
- ACFSampleApp 애플리케이션(다운로드 참조)과 연관된 play 단추를 클릭하여 애플리케이션을 시작한다.
그런 다음 브라우저에서 http://localhost:8080으로 이동하여 샘플 애플리케이션을 테스트한다.
시나리오 1: ACF 응답 필터링
첫 번째 시나리오에서는 ACF 응답 필터링을 사용하여 악성 컨텐츠를 차단한다. ACF 응답
필터링은 필터 규칙 세트(이 기사의 뒷부분에서 설명함)를 기반으로 응답 메시지에서 JavaScript와 같은
활성 컨텐츠를 제거한다. 샘플 애플리케이션을 실행하면 페이지의 맨 위에 있는 뉴스 머리글에 깜박이는
악성 텍스트가 삽입되어 있는 것을 볼 수 있으며 이 악성 텍스트는 첫 번째 뉴스 피드의 일부 활성 컨텐츠(JavaScript
코드)에서 발생한 것이다. Original source of the news 제목 분할창을 클릭하면 뉴스 피드 소스를
볼 수 있다(그림 2 참조).
그림 2. 뉴스 머리글에 삽입된 악성 텍스트
이제 애플리케이션에 손상을 주지 못하도록 ACF 응답 필터링을 사용하여 이 악성 텍스트를 차단하는
방법을 살펴보자. ACF 응답 필터링은 zero.config 구성 파일을 통해 제어된다. ACF 응답 필터링을
사용하려면 구성 파일에서 다음 항목을 설정해야 한다(Listing 1 참조).
Listing 1. ACF 응답 필터링 구성하기
# ACF filter rule
@include "${/config/dependencies/zero.acf}/config/acf.config"{
"conditions" : "/request/path =~ /resources/newsViewer(.*)"
}
|
샘플에 이 구성이 포함되어 있으므로 zero.config 파일에서 이 섹션에 적용된 주석을 취소하고
Project Zero 서버를 다시 시작하기만 하면 ACF를 사용할 수 있다. 그림 3에서 이 두 행으로 된
구성 특성은 ACF와 함께 제공된 미리 정의된 기본 규칙 세트를 사용하여 URI /resources/newsViewer에서
발생한 리소스에 대한 모든 활성 컨텐츠를 제거하도록 ACF 엔진에 지시한다.
그림 3. ACF 응답 필터링 구성하기
애플리케이션을 다시 실행하면 깜박이는 텍스트가 더 이상 표시되지 않는다.
시나리오 2: ACF 요청 필터링
Web 2.0을 테마로 하는 애플리케이션에 참여하여 협업을 수행하다 보면 사용자가 호스팅 서버에 컨텐츠를
입력하거나 게시해야 하는 경우가 있는데 이때 악성 컨텐츠(예: JavaScript)가 서버에서 렌더링되면서
보안 문제가 발생한다. 샘플 애플리케이션에서는 사용자가 서버에 의견을 게시할 수 있다. 악성 스크립트의
위험성을 확인하기 위해 Listing 2의 텍스트를 Enter comments 영역에 입력한다.
Listing 2. 샘플 악성 스크립트
<script>alert("You are under attack!")</script>
|
Post your comment 단추를 클릭한다. All comments 결과 영역에는 아무 것도
표시되지 않고 대신 귀찮은 JavaScript 팝업이 나타난다.
그렇다면 HTTP 요청을 필터링하여 악성 JavaScript 공격을 차단하려면 어떻게 해야
할까? 이를 위해 ACF에서는 강력한 API 세트를 제공한다. 이 API는 필터 규칙 세트를 기반으로 HTTP
요청 매개변수에 JavaScript와 같은 활성 컨텐츠가 있는지 여부를 사용자에게 알려 준다. 활성 컨텐츠가
있을 경우 적절한 예외를 발생시키거나 Project Zero의 XMLEncoder 라이브러리를 사용할 수 있다. 이
라이브러리는 활성 컨텐츠를 런타임 동안 실행할 수 없도록 인코딩한다. 이 기사의 예제에서 들어오는
의견 POST 요청을 처리하는 서버측 구성 요소는 commentHandler.groovy
클래스이다. 바로 이 클래스에 ACF 요청 필터링 코드를 추가하게 된다. 그림 4와
같이 샘플과 함께 제공된 코드에서 주석을 해제하기만 하면 이 기능을 사용할 수 있다.
그림 4. ACF 요청 필터링 사용하기
이 경우에는 Zero 서버를 다시 시작하지 않아도 기능을 테스트할 수 있다. 애플리케이션 페이지를
다시 로드한 후 동일한 JavaScript를 의견 영역에 게시한다. 그러면 그림 5와
같이 악성 컨텐츠를 더 이상 게시할 수 없다는 메시지가 표시된다.
그림 5. ACF 요청 필터링 예제
저자 주: 위에서 설명한 시나리오는 기본적으로 ACF를 사용하는 이상적인
사용 사례이다. 이 시나리오에서는 위에서 설명한 JSON 컨텐츠 요청 시나리오와 일치하는 JSON 인코딩
메시지를 통해 활성 컨텐츠를 게시하고 있다. 이 시나리오에서는 디코딩된 JSON 데이터를 애플리케이션에
제공하기 전에 JSON 문자열의 악성 부분이 JSON 값에서 제거된다.
클라이언트측 필터링
지금까지는 주로 서버측에서 ACF의 강력한 기능을 통해 악성 공격을 차단하는 방법을 살펴보았다. 앞으로는
애플리케이션의 보안을 더욱 강화하기 위해 Dojo 프레임워크와 같은 일부 최신 JavaScript 라이브러리에서
제공하는 클라이언트측 인코딩 기능도 사용할 수 있다. 예를 들어, Dojo의 리치 텍스트 편집기는 사용자 입력을
비교적 안전하게 사용할 수 있는 HTML 코드로 자동으로 인코딩한다. 참고: 클라이언트측 인코딩은 매우
유용하기는 하지만 공격자가 큰 노력 없이도 클라이언트측에 설정된 보안 기능을 뚫을 수 있기 때문에 서버측에서
설정한 ACF 필터링을 대체하지 못한다.
샘플 애플리케이션에서는 Dojo 기반 리치 텍스트 편집기를 제공한다. 애플리케이션을 테스트하기 위해
브라우저에서 http://localhost:8080/clientfilter.gt로 이동한다. 그림 6에서
보듯이 Dojo 편집기를 통해 게시되는 JavaScript는 인코딩된 후 서버로 전송된다. 따라서 브라우저에서는
게시된 컨텐츠를 활성 JavaScript로 해석하지 않는다.
그림 6. Dojo 편집기 구현
저자 주: 위에서 설명한 시나리오는 기본적으로 ACF를 사용하는 이상적인
사용 사례이다. 이 시나리오에서는 위에서 설명한 요청 매개변수 시나리오와 일치하는 URL 인코딩 양식
메시지를 통해 활성 컨텐츠를 게시하고 있다. 이 시나리오에서는 애플리케이션이 요청 매개변수에 액세스하기
전에 요청 매개변수 값의 악성 부분이 요청 매개변수에서 제거된다.
결론
지금까지 애플리케이션을 많이 변경하지 않고도 활성 컨텐츠를 필터링할 수 있는 ACF의
기능을 통해 애플리케이션 전개 유연성을 향상시키는 방법을 살펴보았다. 이렇게 향상된 유연성을 바탕으로
많은 Web 2.0 애플리케이션에 대한 일반적인 공격으로 사용되고 있는 XSS(cross-site scripting)와 같은
활성 컨텐츠 문제가 애플리케이션에서 발생하지 않도록 효과적으로 해결할 수 있다. 샘플 애플리케이션을 실행해 본 후
Project Zero 포럼(참고자료 참조)에 소중한 의견을 제안해 주기 바란다.
다운로드 하십시오 | 설명 | 이름 | 크기 | 다운로드 방식 |
|---|
| Sample application for this article | ACFSampleApp-1.0.0.zip | 32KB | HTTP |
|---|
참고자료 교육
제품 및 기술 얻기
토론
필자소개  | 
|  | Todd Kaplinger는 IBM Software Group 소속의 Senior Software Engineer로 현재
Project Zero 보안 팀의 아키텍트 및 팀장을 맡고 있다. JSP, Servlet, PHP 등의 웹 기반 기술
전문가로 최근에는 새로운 Web 2.0 기술과 이러한 기술이 엔터프라이즈에 미치는 영향에 관심을
두고 있다. 현재 JSR 223: Scripting for the Java Platform을 맡고 있는 전문가 그룹의 멤버이며
보안과 관련된 다양한 Ajax 프레임워크 구현 간의 상호 운용성에 관심을 두고 있는 Open AJAX Alliance의
멤버이기도 하다. IBM WebSphere Webcontainer and RRD(Remote Request Dispatcher) 프로젝트의 팀장
및 아키텍트로 활약했으며 Servlet Expert 그룹의 IBM 대표로서 JSR 154 Servlet 2.5 스펙에 참여했다. |
 | 
|  | Masayoshi Teraguchi는 IBM Tokyo Research Laboratory의 연구팀 소속이며 지난
5년 동안 XML, 웹 서비스 및 WSS(Web Services Security)를 연구했다. 현재는 Web 2.0 보안 및 성능에 관한
연구를 진행하고 있다. |
 | 
|  | Gang Chen은 IBM Software Services for WebSphere(ISSW)의 Consulting I/T Specialist로 뉴욕 메트로 지역을 담당한다. Gang은 트랜잭션과
관련된 복잡한 요구사항이 있는 엔터프라이즈 고객을 전문적으로 도와준다. 그는 몇몇 주요 Wall Street 고객과 공동으로 중요한 트랜잭션 시스템을 구축하고 있다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|