파이썬으로 작성된 웹 프레임워크로서, 웹 개발을 더 쉽고 빠르게 만들어주는 많은 기능과 라이브러리를 제공
: Django는 모델(Model), 템플릿(Template), 뷰(View)라는 MTV(Model-Template-View) 패턴을 사용하여 웹 애플리케이션을 구성합니다. 이를 통해 개발자는 로직, 디자인, 데이터베이스 등을 분리하여 개발할 수 있으며, 유지보수와 확장성도 용이합니다.
- Model : 데이터저장 형태를 어떻게할지 설정
- Template : 실제로 화면을 보여주는 인터페이스
- View : Model과 View를 연결해주는 역할
: Django는 ORM을 지원합니다. ORM은 객체와 데이터베이스 간의 매핑을 자동으로 처리하여 SQL문을 작성하지 않고도 데이터베이스를 조작할 수 있게 합니다. 이를 통해 개발자는 데이터베이스의 복잡한 작업을 더 쉽게 처리할 수 있으며, 더욱 안정적인 애플리케이션을 만들 수 있습니다.
: Django는 Admin 사이트를 자동으로 생성해줍니다. 이를 통해 개발자는 데이터베이스의 CRUD(Create, Read, Update, Delete) 작업을 빠르게 수행할 수 있으며, 관리자 페이지의 디자인과 개발에 시간을 적게 사용할 수 있습니다.
from django.contrib import admin
from .models import Post
admin.site.register(Post)
Django는 보안에 강조를 두고 있습니다. 기본적으로 CSRF(Cross-Site Request Forgery) 공격 방지, XSS(Cross-Site Scripting) 방지 등을 지원하며, 인증과 권한 관리를 쉽게 구현할 수 있습니다.
CRSF
: CSRF 공격은 Cross-site request forgery 공격의 약자로, 사용자가 자기 의지와는 상관없이 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 방식으로 수행하는 공격
=> 이를 해결하기 위해, Django에서는 CSRF 토큰(일종의 난수 비슷한것)을 도입
- 토큰을 통해서, 우리 사이트 이외의 다른 사이트에서 HTTP 요청을 보내는 경우, 유효하지 않은 요청이라 판단해서 403에러와 함께 요청 거부
[POST 양식을 사용하는 템플릿에 CSRF token 사용 예시]
<form>
{% csrf_token %}
<input type="text" name="name"/>
....
</form>
🖐 AJAX 통신을 통해 서버와 통신하는 경우, csrf_token 키워드 사용불가
해결방안
- 뷰에서 템플릿을 만들어 넘길때, CSRF 토큰값을 쿠키에 담아 보내주기
- Django에서 설정한 헤더와 쿠키로 CSRF 토큰 넘기기
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CSRF_TRUSTED_ORIGINS = (
'localhost:8000',
'127.0.0.1:8000',
)
CORS_ORIGIN_WHITELIST = (
'localhost:8000',
'127.0.0.1:8000',
)
CORS_ALLOW_HEADERS = (
'access-control-allow-credentials',
'access-control-allow-origin',
'access-control-request-method',
'access-control-request-headers',
'accept',
'accept-encoding',
'accept-language',
'authorization',
'connection',
'content-type',
'dnt',
'credentials',
'host',
'origin',
'user-agent',
'X-CSRFToken',
'csrftoken',
'x-requested-with',
)
axios.defaults.xsrfCookieName = 'csrftoken'
axios.defaults.xsrfHeaderName = "X-CSRFToken"
axios.defaults.headers.common['X-CSRFToken'] = getCookie("csrftoken");
Django는 커뮤니티가 활발합니다. 오픈소스이기 때문에 많은 개발자들이 참여하고 있으며, 다양한 문제점과 개선점을 빠르게 해결할 수 있습니다. 또한, 많은 라이브러리와 플러그인이 개발되어 있어, 웹 개발에 대한 생산성을 높일 수 있습니다.