출처 : https://www.boannews.com/media/view.asp?idx=78069
웹은 프로토콜의 단순함에 비해 거의 모든 업무시스템과 일상생활에서 사용하고 있다. 웹에서 사용되는 언어들은 지속적으로 업데이트되면서 다양한 기능을 제공하고 있고, 이를 제대로 활용할 수 있다면 배포에 부담이 없는 클라이언트/서버 기반의 프로그래밍이 가능해질 수 있는 수준에 이르렀다고 생각한다. 브라우저만 있다면 접속하는 곳마다 다른 클라이언트용 어플리케이션을 마음껏 사용할 수 있으니 놀라운 일이 아닐 수 없다.
하지만, 프로토콜의 단순함 때문에 안전하게 개발하고 배포함에 있어 가장 큰 걸림돌 중 하나는 역시 보안이다. SSL/TLS 보안 통신 및 ActiveX를 이용해서 지금까지 보안을 해왔다고는 하지만, 통신과정 상의 안정성 확보에만 주력한 측면이 있고, 설치과정 상에서 너무 불편함을 가중시켜 사용자에게 많은 인내심을 요구해왔다. 더욱이 콘텐츠 자체에 대한 보호 방법은 거의 존재하지 않았다.
필자는 웹을 보다 안전하게 개발 및 제공하기 위해서 지금보다 효과적이고 안전하게 보호할 수 있는 방법 중 한 가지에 대해 설명하고자 한다. 바로 자바스크립트(Javascript)다.
자바스크립트의 화려한 등장
클라이언트인 브라우저로 전달되는 웹 응답 값은 기본적으로 ‘HTML’이라는 언어로 구성되어 있다. HTML은 브라우저에서 보이는 정적인 화면을 구성하는 데, 역시 주목할 것이 바로 자바스크립트다. 자바스크립트는 화면에는 나타나지 않고 메모리에 로딩되어 실행되는 코드다. 따라서 동적으로 페이지를 구성하거나 HTML에서 이벤트가 발생했을 때 이를 처리하는 역할을 지원한다. 친사용자 화면(UI/UX) 구성일수록 클라이언트에서 자바스크립트의 역할은 매우 중요하다 할 수 있겠다.
현재 자바스크립트는 웹 UI/UX 구현에 있어서 거의 필수적인 코드가 되어가고 있다. 개발자 커뮤니티로 가장 유명한 StackOverflow에서 가장 많이 언급된 프로그램 언어가 자바스크립트라는 통계가 있을 정도로 웹 개발에서는 필수요소가 됐다. 예전에는 백엔드 영역의 개발자가 상대적으로 중요했다면 요즘에는 UI/UX를 담당하는 프론트엔드 영역 개발자 수요 및 몸값이 날로 증가하고 있고 그 중요성은 말할 필요도 없을 만큼 높아졌다. 현재는 웹사이트에서 자바스크립트가 없는 페이지는 찾아보기 어려울 정도라 할 수 있다.
자바스크립트의 중요성이 높아지게 된 계기는 구글(google)이 2004년 지메일(G-mail), 2005년 구글지도(google Map)를 출시하면서다. 당시 많은 개발자 및 유저들은 놀라움을 금치 못했는데, 그 이유는 지메일에서 자바스크립트를 이용하여 만든 AJAX(Asynchronous 자바스크립트 and XML)를 적용했기 때문이다. AJAX를 통해서 웹사이트를 방문하거나 화면이 전환될 때 나타나는 껌벅임을 보여주지 않고도 새로운 데이터를 화면에 출력하고 기능을 실행하는 것이 가능해졌기 때문이다. 이러한 기술은 현재 거의 대다수의 웹사이트에서 사용되고 있다. 불과 10여 년 전만 해도 스크립트는 VBScript, JScript, 자바스크립트 등이 있었으나 지금은 구글에 의해 사실상 자바스크립트로 천하통일됐다.
자바스크립트의 능력
자바스크립트는 간단하게 작성 가능한 언어이지만, 수행 가능한 영역의 범위는 매우 넓다. 아래 그림은 브라우저가 다루는 영역을 표시한 그림인데 이를 BOM(Browser Object Model)이라고 부른다. 이 내용들 중 하나가 Document 영역이다. 해당 영역은 웹서버가 응답해준 HTML, 자바스크립트 등이 포함된 내용이다. 그리고 아래 그림에는 누락되어 있지만 Document에는 Cookie 값도 포함된다.

▲Browser Object Model(BOM)[자료=엔시큐어]
또한, 아래 그림은 DOM(Document Object Model)이다. HTML의 구조를 나타내고 있는데, 정적인 화면 구성을 처리하는 HTML의 모든 태그를 접근할 수 있고 그 속성을 처리할 수 있다는 뜻이다.

▲Document Object Model(DOM)[자료=엔시큐어]
자바스크립트는 DOM 및 BOM 객체에 모두 접근이 가능하다. 동적으로 해당 객체들의 속성이나 상황을 변경시킬 수 있다. 실제 자바스크립트를 이용한 해킹 기법 중 XSS를 이용하면 BOM과 DOM 객체에 모두 접근할 수 있기 때문에 엄청나게 많은 시스템 정보와 브라우저를 마음대로 컨트롤할 수 있다. 쿠키 및 시스템 정보 수집은 물론이고, 웹브라우저를 특정 페이지로 강제 이동시켜 워터링홀 공격을 당하게 한다던가, 악성코드를 강제로 설치하게 유도한다던가, 특정 페이지로 이동시켜 가짜 페이지에 로그인을 유도한다던가 하는 공격들이 모두 가능하다는 뜻이다. 수행 가능한 공격은 상상력의 능력치만큼 많다고 해도 될 만큼이다. 대표적인 도구가 Beef 라는 해킹 도구로 kali에 탑재되어 있기도 한다.
자바스크립트의 치명적 약점
이렇게 많은 능력을 가지고 있는 강력한 자바스크립트도 결정적인 취약점이 존재한다. 그것은 브라우저에서 지원하는 ‘HTML 보기’ 기능에 의해서 소스코드가 그대로 노출된다는 점이다. 또한, Proxy 도구를 이용하면 웹서버와 브라우저간 통신과정에서 코드를 임의로 조작할 수가 있다.
클라이언트 프로그램을 설치하고 .exe 파일을 텍스트 편집기로 열었더니 소스코드로 보인다 정도로 이해하면 맞을 것 같다. 소스코드는 브라우저의 메모리에 올라간 다음 실행시 컴파일이 되고 동작하는 인터프리터 언어이기 때문이다.
이러다 보니 자바스크립트를 이용하여 인증, 식별, 암호화, 중요정보(URL, IP, 기타 접속정보 등) 하드코딩 등의 코딩을 하기가 어렵다. 자바스크립트로 설령 클라이언트 쪽에서 중요 기능을 구현한다고 하더라도 반드시 서버 측에 재구현해 관련 데이터의 유효성을 반드시 검증하라는 것이 일반적으로 보안 가이드이다. 하지만, 클라이언트와 서버 측의 코드가 흡사하거나 하면 도리어 구현하지 않는 것이 더 안전할 수 있다.
만약 클라이언트에서 안전하게 구현이 가능하다면 서버 측의 역할을 상당히 분산하여 구현이 가능하고 예를 들면 버튼 클릭시 서버 측 확인을 거치지 않고 바로 자체 응답이 가능해지면 속도 역시 매우 빨라지게 된다. 즉, 자바스크립트를 안전하게 프로그래밍할 수 있게 된다면 매우 쾌적한 웹환경으로 업그레이드가 가능해진다는 것이다.
자바스크립트 노출로 인해 필자가 확인했던 문제점들을 간단히 정리해보면 다음과 같다.
△XSS 공격을 쿠키탈취 및 세션 재사용 공격 문제(웹방화벽으로 XSS 차단은 해주지만 벤더 사에 따라 우회 기법들이 너무 많이 존재)
△Proxy를 이용한 클라이언트 기반 인증, 권한 체크 로직 무력화 문제
△콘텐츠 암호화를 보안 프로그램 무력화 문제(모 은행에서 콘텐츠 암호화 모듈을 사용하나 자바스크립트를 통해서 해제하는 부분이 쉽게 조작 가능함)
△자바스크립트에 포함된 다양한 접속 경로 정보 노출 문제(대부분 데이터 처리 로직이 많으며 SQL-Injection이나 관리자 접속 경로 노출 및 기타 공격에 취약하게 개발되는 경우가 많음)
무엇보다 자바스크립트의 코드 노출로 인해 개발자가 충분한 자기 역량을 다하기가 어렵고 위의 문제점들을 근본적으로 개선하는 것이 쉽지가 않다. 즉 웹 해킹에서 클라이언트에서 이루어지는 공격에 대해서 적절한 대응 방안이 없다는 것 자체가 문제다.
현재까지 제시된 자바스크립트 보안
자바스크립트의 가장 치명적인 단점인 코드의 공개 및 위변조 문제를 해결하면 상당히 도움이 될 것이지만, 브라우저가 표준으로 지원하지 않는 한 쉽지는 않아 보인다. 클라이언트에 완전히 전송된 다음 브라우저에 의해서 동작하므로 브라우저의 원천적 지원 없이 완벽한 구현은 사실상 쉽지가 않기 때문이다.
이에 따라 코드를 보호하기 위해서 일부 오픈소스나 프리웨어로 자바스크립트를 난독화 해주는 도구들이 존재한다. 대표적인 기술로 split, escape/unescape, replace, eval, decimal 등을 이용한 난독화 방법(정확하게는 코드치환) 등이 있지만, 사실 이 난독화 기술은 악의적인 코드를 유포하고자 하는 용도로 더 많이 사용되기도 한다. 또한, 압축(Minify)을 이용하는 방법도 있다. 예를 들면, △불필요한 줄바꿈, 공백 밑 들여쓰기 △과도하게 문장 길게 서술하기 △scope 내 사용하지 않는 변수 △주석 △경우에 따라 console.log, debugger 등의 디버깅용 구문 또는 메서드 호출 △경우에 따라 무의미한 메서드 호출 및 루프(Google Closure Compiler 사용하여 적용) 등이다.
하지만, 난독화 수준이 매우 높지 않고 디버깅 도구 등을 이용하면 관련 내용을 쉽게 분석하는 것이 가능하다.

▲Minify 역분석 예시[자료=엔시큐어]
또한, 개발자의 편의를 위해서 제공되는 개발자 도구는 공격자에게 복잡한 자바스크립트를 해석하고 테스트하는데 큰 도움을 주고 있는 실정이다. 자바스크립트가 이미 메모리에 로딩된 상태이므로 디버깅 도구를 이용하여 다양한 값에 대한 확인이나 로직 분석이 가능하다.
앞으로의 자바스크립트 보안
자바스크립트를 통해서 다양한 기능을 안전하게 구현할 수 있다면 개발이 용이하고 편리해질 것이다. 코드 분산을 통해서 서버 측 구현 및 부하 부담을 현저히 줄일 수 있는 것은 물론이고 다양한 아키텍처 구현의 가능으로 보다 쾌적한 웹 환경을 구현할 수 있을 것이다. 이러한 부분이 가능하려면 현재 공개되어 있는 수준의 난독화가 아닌 식별이 불가능한 수준의 보다 강력한 자바스크립트 난독화 기술이 필요하다. 게다가 다음 기술들이 필요로 할 것이라 판단된다. 그 이외에 브라우저의 특성 등에 따라서 추가적인 고려가 있을 수 있다.
△복원이 매우 어려운 수준의 난독화 기술들
△자바스크립트 코드 위변조 차단
△디버깅을 원천적으로 차단
△DOM 객체 위변조 차단
참고로 DOM 객체에 대한 위변조 방지 된다는 것은 단순히 HTML이나 자바스크립트만 보호 된다는 것이 아니라 쿠키값도 보호되기 때문에 XSS 스크립트 공격을 통한 쿠키값 유출을 막을 수가 있고, 쿠키에 존재하는 세션값도 위변조를 차단할 수 있어 세션값 어뷰징도 자동 차단이 가능해진다. 뿐만 아니라 정보 접속 URL 정보 및 기타 관련 로직 등을 보호함으로써 다양한 형태의 공격을 방어할 수 있게 된다. 이러한 부분은 웹서버만을 방어하던 웹방화벽이 막아주지 못하던 부분이다. 웹방화벽과 함께 구성이 된다면 상당히 큰 도움이 될 것이라 확신한다.
자바스크립트로 클라이언트 쪽에 해킹방어 코드를 추가하고 이를 난독화해 운영할 수 있다면, 기존 웹방화벽의 로그가 상당히 줄어드는 효과를 볼 수 있다. 이는 웹방화벽의 과도한 오탐을 혁신적으로 줄여주어 관제 및 보안활동에 엄청난 도움이 될 것으로 생각한다. 뿐만 아니라, 자바스크립트를 통한 안정적인 암호화 통신을 수행할 경우 기존에 https에서 가시성 확보가 어려웠던 점을 http 통신 구현으로 재확보도 가능해지는 장점을 가질 수 있다.
현재 전 세계의 이러한 기능을 제공하는 상용 보안 솔루션으로는 ‘Arxan For Web’, ‘Jscrambler’가 있는 것으로 알려져 있다.
보안담당자 입장에서는 이 글을 읽으면서 우리에게 자바스크립트가 있는가? 또는 그러한 문제들이 발생한 적이 있는가? 라고 반문할 수 있다. 하지만, 이미 많은 모의해킹 과정에서 노출됐을 수 있고, 개발자의 매우 제한적인 코딩으로 인해 큰 이슈가 발생하지 않았을 수도 있다.
하지만, 우리의 서비스 개발에 있어 좁디좁은 시골길에서 큰 차를 가지고 어렵게 운전하고 있는 개발자를 고속도로에서 마음껏 달릴 수 있게 해준다고 생각해 보면 어떨까 싶다. 프론트엔드 개발자에게 자유를, 그리고 유저에게는 쾌적하고 빠른 서비스를, 보안담당자에게 부가적인 보안기능까지 덤으로 줄 수 있는 이 기술에 주목하지 못할 이유가 있는가? 반문하지 않을 수 없다.
'프로그램개발 > IT 트렌드·팁·상식' 카테고리의 다른 글
"웹어셈블리 앱을 브라우저 밖으로"··· 모질라, 'WASI' 개발 프로젝트 공개 (0) | 2019.04.01 |
---|---|
'기업 주도' 개발 언어의 부상을 걱정할 필요 없는 이유 (0) | 2019.04.01 |
18년 차 웹/앱 서비스 기획자의 앱 기획 노하우를 공개합니다. (0) | 2019.03.25 |
웹사이트 코딩 언어 5…"HTML·CSS·JavaScript·JQuery·PhP" (0) | 2019.03.21 |
나쁜 말이 나쁜 조직을 만든다 (0) | 2019.03.20 |