django, Flask 웹 프레임워크와 SW 개발보안

안녕하세요, 보안클라우드입니다. 이번에 다룰 내용은 인터프리터 언어인 Python의 웹 프레임워크 django와 Flask에 대해 이야기해보려 합니다.

웹 프레임워크란 웹 페이지를 개발하는 웹 프로젝트 과정에서 개발 경험이나 스타일이 다른 구성원 끼리의 산출물 공유 시 서로의 산출물을 이해하는데 문제가 발생할 수 있는데 이를 줄이기 위해 공통적인 개발 환경을 제공하여 개발 표준 가이드를 제시하고, 자주 사용되는 기능을 관리하여 재사용성을 높이는 역할을 하는 것이 웹 프레임워크입니다. Python의 웹 프레임워크는 다양하지만, Full-Stack Framework로 대표적인 django와 MicroFramework로 대표적인 Flask 차이는 무엇인지 알아보겠습니다.

django

Full-Stack Framework

django

출처 : https://www.djangoproject.com/community/logos/

웹 개발에 필요한 요소를 모두 갖춘 웹 프레임워크인 django 장점으로는 재사용, 유지보수, 리팩토링 용이성, ORM를 사용함으로써 DBMS에 대한 종속성을 줄일 수 있는 장점이 있어 개발자의 부담을 줄일 수 있습니다. 단점은 이미 기능이 만들어져 있는 django내 개발 환경을 수정하는 것에 시간이 오래 걸리는 점입니다.

django 도입 사례

e.g.) Instagram, BitBucket

Flask

MicroFramework

Flask

출처 : https://flask.palletsprojects.com/en/2.0.x/​

핵심적인 기능만을 가진 가벼운 프레임워크인 Flask는 개발 목적, 용도에 따라 커스터마이징하여 원하는 프레임워크를 구축할 수 있는 높은 자유도의 장점이 있습니다. 이 높은 자유도가 장점인 반면에 이로 인해 보안, 인증 등 개발자의 개입이 많아지는 단점이 있습니다.

Flask 도입 사례

e.g.) Netfix, Airbnb, Reddit

보안에서의 django와 Flask

앞에서 웹 프레임워크 django와 Flask에 대해 알아보았는데요, 이제는 보안에서의 django와 Flask에 대해 이야기해보려 합니다. 다음은 django와 Flask에서 XSS 공격을 수행한 화면입니다.

이스케이프 된 XSS 공격 구문

동일한 조건으로 django와 Flask에서 Stored XSS를 수행하였는데요, 두 개의 웹 프레임워크에서 XSS가 발생하지 않았습니다.

페이지 소스 보기로 확인한 XSS 공격 구문

발생하지 않은 원인을 보면 django와 Flask에서는 기본적으로 특수문자를 이스케이프(escape)하여 XSS를 방지하고 있는데요, 이 결과를 미루어볼 때 django와 Flask에서는 기본적으로 XSS를 막기 위한 최소한의 보안조치가 되어있음을 알 수 있습니다. 하지만 django와 Flask가 XSS의 모든 출력값에 대해 이스케이프를 적용하고 있지만 다른 모든 취약점에 대하여 보안 조치가 적용되어 있는 것은 아닙니다. CSRF로 예를 들면 CSRF 토큰을 모든 페이지에 적용하는 것은 보안의 3대 요소 중 하나인 가용성과 보안을 고려하였을 때 가용성 부분을 고려하여 필요한 페이지에 적용하는 것이 이상적입니다. 또 다른 예로 인증기능을 보면 django에서는 django.contrib.auth 패키지에서 인증 관련 패턴을 처리하는 부분이 미리 정의되어 있어 개발자는 Template만 개발하면 되는 반면에 Flask에서는 대게 JWT를 이용해 인증 기능부터 개발합니다. 이와 같이 두 프레임워크의 성격에 따라 지원하는 보안적 기능에 차이가 나는데요, 웹 개발에 필요한 요소를 모두 갖춘 django에서는 다양한 기능을 제공하는 만큼 SQL injection, XSS, 클릭재킹 등 공격에 대한 보안조치가 되어 있고 핵심적인 기능만을 가진 Flask는 django만큼은 아니지만 최소한의 보안 조치를 갖추고 있습니다.

django VS Flask 승자는?

django와 Flask 두 웹 프레임워크의 승자를 가리기는 어렵습니다. 두 웹 프레임워크를 정리해보자면, 개발자의 개입이 비교적 적은 django에서는 이미 내장되어 있는 다양한 기능으로 적은 시간과 노력으로 안전히 개발이 가능하고 기능을 많이 요하는 대규모 프로젝트에 적합한 반면 이미 정해진 프레임워크 틀을 바꾸는 게 어렵고 다양한 기능을 제공하고 있기 때문에 무거운 프레임워크인 django는 기능을 많이 요하지 않은 소규모 프로젝트에서 부적합합니다. 최소 핵심 기능을 가진 Flask는 원하는 기능을 확장하여 자유도 높은 프레임워크를 구축할 수 있는 장점이 있는 반면에 자유도가 높아 기능을 확장할수록 보안적인 측면에 관심이 필요하고 그에 따른 개발자의 개입이 많이 필요하기 때문에 Flask는 소규모 프로젝트에 적합합니다.이처럼 두 프레임워크는 개발의 목적과 용도, 규모에 따라 어느 프레임워크가 적절한지 선택하고 필요한 부분에 보안조치를 적용하여 취약점을 제거하고 보다 안전하고 효율적인 개발을 할 수 있을 거 같습니다.

이상으로 Python 웹 프레임워크 django와 Flask에 대해 알아보았는데요 다음에는 다른 주제로 찾아 뵙겠습니다.

  • 이전 당신의 빈틈을 노리는 범죄, 사회공학적 해킹
  • 다음 사상 최악의 보안취약점, Log4j 취약점