- 버전
- 다운로드 23
- 파일 크기 7.35 MB
- 파일 수 1
- 생성 날짜 2022년 12월 29일
- 마지막 업데이트 2024년 2월 8일
[한국인터넷진흥원] JavaScript 시큐어코딩 가이드(2022.12)
한국인터넷진흥원이 발간한
JavaScript 시큐어 코딩 가이드 입니다.
업무에 참고 바랍니다.
○ 자료명 : JavaScript 시큐어코딩 가이드
○ 주관부처 : 한국인터넷진흥원
○ 발간일 : 2022년 12월 30일
[개요]
빠른 실행과 반짝이는 서비스를 앞세운 스타트업들의 성장은 IT 생태계 전반에 큰 영향을 미쳤다. 체계적이고 큰 규모의 프로젝트를 중심으로 자리 잡았던 소프트웨어 개발 문화도 빠른 제품 개발과 고객의 요구사항 대응을 위해 더욱 가볍고 효율적인 방법을 모색하고 지속적으로 진화 했다.
이러한 변화의 흐름의 중심에는 웹 기술의 발전이 큰 부분을 차지했다. 웹은 컴파일 기반의 여타 제품들에 비해 빠르고 가볍게 개발이 가능하며, 별도의 배포 및 설치 없이도 고객의 PC 또는 스마트폰으로 서비스 제공이 가능하다.
컴퓨터 하드웨어와 브라우저 성능이 뒷받침되지 않았던 상황에서, 초창기 웹 서비스는 웹 서버를 중심으로 동작했다. 클라이언트는 단순히 필욯나 정보를 요청하고 응답을 화면에 보여주는 수준에 그쳤다. 하지만 하드웨어 성능의 비약적인 발
전과 더불어 웹 생태계를 구성하는 엔진이 고도화되면서 클라이언트의 비중도 함께 커지게 되었다.
별도의 독립 파일 또는 패키지 형태로 배포되고 관리되는 일반적인 소프트웨어와 달리 웹은 브라우저라는 특수한 환경 위에서 동작하는 구조이다. 이에 사용자와 맞닿아 있는 인터페이스와 서비스의 핵심 데이터를 제공하는 서버 사이의 거리가 매우 멀고, 동시에 많은 사용자들이 이용한다는 특성을 가진다.
즉, 개발자가 작성한 코드의 많은 부분이 사용자에게 노출되어야 하고 사용자가 제공하고 요청하는 정보가 서버를 오기까지 많은 신뢰할 수 없는 구간을 거쳐야 하는 위험성을 가진다.
초기 웹 서비스는 클라이언트의 비중이 그리 높지 않았다. 이에 서버의 핵심 자원을 안전하게 보호하는 것에 초점이 맞춰졌다. 하지만 웹 생태계가 거대해지고 복잡해지면서 클라이언트의 역할 또한 커지고 있다.
왜 자바스크립트인가?
자바스크립트(Javascript)는 대화형 웹페이지 개발을 위해 만들어진 스크립트 기반 프로그래밍 언어다. 1995년 브랜담 엘크(Brendam Elch)가 넷스케이프 2 브라우저에 사용하기 위해 개발했다. 1997년도에 처음으로 언어 표준인 ECMA-262가 공개됐다. 초기 자바스크립트는 C, Java와 같이 독립적인 애플리케이션 개발이 가능한 수준의 언어라기보다 웹 상의 데이터 표현을 위한 하나의 규격에 가까웠다.
자바스크립트는 브라우저 내에 탑재된 인터프리터에 종속되어 있어 확장성에도 제약이 따랐다. 하지만 지속적인 엔진 개선 및 표준화를 거치면서 현재는 명실상부 개발자들에게 가장 많은 사랑을 받는 언어 중 하나로 성장했다.
시큐어코딩 가이드
입력데이터 검증 및 표현
프로그램 입력값에 대한 검증 누락 또는 부적절한 검증, 데이터의 잘못된 형식지점, 일관되지 않은 언어셋 사용 등으로 인해 발생되는 보약점으로 SQL 삽입, 크로스사이트 스크립트(XSS) 등의 공격을 유발할 수 있다.
SQL 삽입
데이터베이스(DB)와 연동된 웹 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않는다면, 공격자가 입력 폼 및 URL 입력란에 SQL문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안약점을 말한다. 취약한 웹 응용프로그램에서는 사용자로부터 입력된 값을 검증 없이 넘겨받아 동적쿼리(Dyamic Query)를 생성하여 개발자가 의도하지 않은 쿼리가 실행되어 정보 유출에 악용될 수 있다.
- 자바스크립트에서는 관계형 데이터베이스, NQSQL 등 다양한 유형의 데이터베이스 시스템과 상호작용할 수 있는 라이브러리를 제공하며 크게 세 가지 유형의 방식을 사용할 수 있다.
- 데이터베이스 드라이버 : 클라이언트와 커넥터를 사용해 데이터베이스와 직접 상호 작용
- 쿼리빌더(Query builder) : 데이터베이스 클라이언트보다 한 단계 높은 계층에서 동작, 자바스크립로 쿼리 데이터를 생성하고, 데이터베이스와 상호작용 할 수 있다.
- QRM(Object Relational Mapping) 개발자가 데이터베이스를 추상화 된 객체 형식으로 다룰 수 있게 해주는 데이터 베이스
데이터베이스 드라이버를 사용할 경우 개발자가 직접 쿼리 문자열을 정의하고 그 결과를 그대로 데이터베이스에 질의하게 되는데, 이 경우 검증되지 않은 외부 입력값으로 인한 SQL 삽입 공격이 발생할 수 있다.
ORM을 사용하는 경우에도 복잡한 조건의 쿼리문 생성 어려움, 성능 저하 등의 이유로 ORM에서 지원하는 원시 쿼리 기능을 사용하면 공격에 취약해질 수 있다.