Python/ETC / / 2023. 5. 4. 18:18

[번역] 장고(Django)와 플라스크(Flask) : 2023년 어떤 것을 선택해야 하는가? 2편

Forms

Form은 대부분의 웹 앱의 또다른 중요한 파트이며, 장고는 패키지화되서 온다. 인풋 핸들링과 함께, CSRF(Cross-Site Request Forgery), XSS(Cross-Site Scripting), 그리고 SQL Injection같은 다양한 보안 위협들을 다루는 서버 사이드 검증을 가지고 있다. 이것들은 ModelForms이라는 Data Model들을 통해 생성되며 어드민 패널과 잘 융합된다.

 

플라스크는 기본적으로는 제공하지 않지만, Flask-WTF같은 강력한 확장팩이 WTForms와 같이 플라스크에 합쳐질 수 있다. WTForms-Alchemy는 자동적으로 SQLAlchemy 모델에 기반하여 자동적으로 form을 만드는데 사용되며, 장고의 ModelFrom처럼 From과 ORM사이의 갭을 메워줄 수 있다.

 

재사용 가능한 컴포넌트

프로젝트의 구조에 따라 - 당신의 앱이 더더욱 복잡해질 수록, 두 프레임워크 둘 다 이러한 프로젝트를 분해하여 기능적으로 비슷한 파일을 같이 묶을 수 있다. 이에따라, 예를들어 유저 관련된 기능들을 라우트, 뷰, 폼, 템플릿 그리고 스태틱 애셋등을 포함하여 모두 같이 묶을 수 있다. 장고는 app이라는 컨셉이라면, 플라스크는 blueprints를 가지고 있다.

 

장고 app은 플라스크의 blueprint보다 더 복잡하지만, 한번 셋업되면 다시 사용되기 쉽게 되어 있다. 게다가 urls.py, models.py 그리고 views.py 컨벤션 - 일관된 프로젝트 구조 - 에 따라 새로운 개발자를 장고 프로젝트에 상대적으로 쉽게 추가할 수 있다. 그 와중에 Blueprint는 간단하고 쉽게 세팅하고 돌릴 수 있다.

 

템플릿과 정적 파일

템플릿 엔진은 백엔드에서 HTML페이지에 정보를 동적으로 넣을 수 있게 해준다. 기본적으로 Flask는 Jinja2를 사용하고 Django는 장고만의 templating engine을 가지고 있다. 문법적인 구조나 특징적으로 보면 상대적으로 비슷하다. Jinja2를 Django와 같이 사용 가능하다. 두 프레임워크 모두 정적 파일 핸들링 지원도 잘 된다.

  1. Flask
  2. Django

Django는 collecting이라는 편리한 관리 커맨드를 통해 모든 정적 파일을 관리하고, 프로덕션 배포를 위해 집적된 위치에 위치시킬 수 있다. 

 

비동기 뷰

 

장고는 비동기 핸들러(asynchronous handlers) 장고 3.1부터 지원한다. 뷰는 async 키워드를 통해 비동기적으로 만들어질 수 있다. 미들웨어에도 또한 비동기 지원이 가능하다. 만약 비동기 뷰에다가 동기적 콜을 하고 싶다면, sync_to_async 함수/데코레이터(function/decorator)를 사용할 수 있다. 이런 기능은 장고에서 ORM이나 cache 레이어 같이 비동기를 지원하지 않는 장고의 다른 파츠와도 상호작용이 가능하다. 

 

비동기 웹 서버는 Daphne, Hypercorn, Uvicorn 를 포함하여 - 이것뿐만은 아니지만 - 장고와 사용되면 아주 강력한 비동기 뷰에 대해 힘을 낼 수 있다. Flask 2.0 빌트인 된 비동기(asynchronous) routes/views, error handlers, request functions, 그리고 teardown callbacks을 지원한다!

 

더 많은 장고와 플라스크의 비동기 뷰에 대해서는, 각각 Async Views in Django와 Async in Flask 2.0 아티클을 참조해보자.

 

테스팅

 

두 프레임워크 모두 테스트를 위해 미리 지원되고 있다. 유닛 테스트를 위해서 둘 다 파이썬의 unittest 프레임워크를 지원한다. 각각의 프레임워크는 테스트 클라이언트를 지원해서 리퀘스트를 보내고, 관찰하고 그리고 리스폰스를 검증하는 것이 가능하다. Testing Flask Applications Testing in Django를 더 많은 정보가 필요하면 보기를 바란다. 확장팩의 경우, 유닛테스트 프레임워크가 어떻게 작동하는지 좋아한다면 Flask-Testing를 체크해보길 바란다. 다른 한편으로 pytest-flask 확장팩은 pytest를 플라스크를 위해 지원한다. 장고의 경우 pytest-django를 체크해 보자.

 

그 외 특징

장고에는 있지만 플라스크에는 없는 언급하지 못한 특징들이 있다.

장고 플라스크 확장팩/리소스
Atom and RSS feeds Atom RSS Feed Generator with Python and Flask
Caching framework Flask-Caching
Bootstrapping tool Flask-AppBuilder, CLI
Sitemaps Flask-Sitemap

 

보안

위에서 언급한대로, 장고는 CSRF, XSS와 SQL injection과 같은 일반적인 공격에 대해 빌트인 방어체계를 구축하고 있다. 이러한 보안 수단들은 당신의 코드 내의 취약점에 대한 방어를 도와준다. 장고 개발 팀은 또한 알려진 보안 취약점을 사전 예방으로 - proactively discloses - 발표하고 재빠른 픽스를 수행한다. 그와 반대로 플라스크는 더 적은 코드 베이스를 가지고 있기에, 더 적은 면적에 공격에 노출되어 있다. 하지만, 당신이 손수 만든 앱 코드가 넓어질 수록 보안 취약점을 손수 관리하고 고칠 필요가 있어진다.

 

최근에 있어서, 당신 앱은 코드의 싱크홀의 크기만큼 안전할 것있다. 플라스크의 경우 서드 파티 확장팩에 더욱 의존적이기에, 앱은 최근에 안전한 확장팩일수록 더욱더 안전해질 것이다. 이러한 특징은 당신의 팀으로 하여금 서드 파티 확장팩 혹은 라이브러리를 평가하고 모니터링을 통해 보안을 유지하도록 압박을 준다. 이러한 서드파티를 최신으로 유지하는 것은 가장 중요하면서 가장 힘든 일인데, 이는 각 서드파티마다 각자의 개발팀, 문서 그리고 릴리즈 사이클이 잇기 때문이다. 몇몇 케이스 에서는 소수의 개발자만이 특정한 확장팩을 관리하고 있을지도 모른다. 어떠한 확장팩을 평가할 떄 깃허브 이슈들을 리뷰하여 치명적인 이슈에 얼마나 관리자들이 대응하고 있는지 살펴볼 필요가 있다. 

 

이것이 장고는 태초부터 플라스크보다 더 안전하다는 것을 의미하는 것은 아니다 - 그저 안전성과 유지보수성에서 좀 더 쉬울 뿐이다.

 

리소스

  1. Flask Security Considerations
  2. Security in Django
  3. Securing Flask web applications
  4. Protect Your Django Web Application From Security Threats
728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유