TIL (2020.06.20)

Awesome·2020년 6월 20일
0

TIL

목록 보기
16/46
post-custom-banner

Django Initial Settings

프로젝트 시작에 앞서, 필요한 초기 세팅을 해보자.

.gitignore

Git을 사용하여 협업을 진행할텐데, git을 통해 공유가 되면 안되는 데이터는 push할 때 제외되어야 한다. 이를 위해서 .gitignore 파일을 작성한다.

django, python, macOS 를 선택하였고, 아래와 같은 코드가 생성된다.

해당 내용을 복사하여 manage.py 가 위치한 프로젝터 폴더 내에 .gitignore 라는 이름으로 파일을 생성하여 붙여넣는다.

필요에 따라서 감추고 싶은 파일들을 추가한다.
setting 관련 사항이 기록된 추가 settings 파일이나 *.csv 와 같이 파일 형식을 지정할 수도 있다.

주석

사용하지 않는 django 내의 모듈이나 기능은 주석처리 한다. 이번 frond-end와의 협업에서는 django admin, auth 등을 사용하지 않을 예정이므로 주석처리 하겠다.

CORS

Front-end 와의 이번 프로젝트는 back-end 가 로컬 서버를 구성하고, front-end 가 페이지를 만든다. 따라서, 서버에는 django tamplate을 사용하지 않기 때문에 페이지가 없다. front-end 와의 통신을 통해서 이루어진다.

서버에서 페이지를 제공하는 경우에는 CSRF Token을 발행해야 한다.
로그인 인증 후에 jwt를 통해 Access Token 을 발생하는 것과 유사하다. 페이지에 접근할 수 있다는 권한을 인증하기 위함이다.

CSRF(Cross Site Request Forgery) : 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다.

즉, 불건전 사이트나 악성코드가 담긴 이메일 등을 통해서 타겟의 PC를 감염시키고, 그로 인하여 공격자가 타겟의 계정을 이용하여 사기성 광고를 게재하는 등의 공격이 CSRF Attack 이다.

이를 막기 위해 서로 다른 도메인에서 Javascript로 접근하려 하거나 다른 서버에 Ajax통신의 결과를 받는 행위는 제한되어 있다.

보안상의 문제 없이 Ajax등의 통신을 하기 위해 사용되는 메커니즘이 CORS이다.

CORS(Cross-Origin Resource Sharing) :
CORS 표준은 웹 브라우저가 사용하는 정보를 읽을 수 있도록 허가된 리소스를 서버에게 알려주도록 허용하는 HTTP 헤더를 추가함으로써 동작한다.

내용출처

Django 에서 CORS 를 설정하는 방법은 어렵지 않다.

  1. 플러그인 설치 및 settings.py에 추가
pip install django-cors-headers
INSTALLED_APPS = [ ...., "corsheaders",
MIDDLEWARE = [..., 'corsheaders.middleware.CorsMiddleware',]

##CORS
CORS_ORIGIN_ALLOW_ALL=True
CORS_ALLOW_CREDENTIALS = True

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
)

CORS_ALLOW_HEADERS = (
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
    #만약 허용해야할 추가적인 헤더키가 있다면 여기에 추가
)

Requirements.text

팀원들 간의 환경 설정을 통일하기 위해 작성한다.

pip freeze > requirements.text

Security

Database, SecretKey 설정은 my_settings.py 라는 파일로 따로 작성한다. Django 프로젝트 내의 settings.py 에 있는 정보들도 my_settings.py 에서 정의된 정보를 import 하여 사용하는 것이 좋다.

DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DATABASE 명',
        'USER': 'DB접속 계정명',
        'PASSWORD': 'DB접속용 비밀번호',
        'HOST': '실제 DB 주소',
        'PORT': '포트번호',
    }
}

SECRET = {
        'secret':'시크릿키',
}
# settings.py
import my_settings
DATABASES = my_settings.DATABASES

Tip

특정 모델과 foreignkey로 물려 있는 모델 리스트로 보기

from django.db.models.fields.related import ForeignObjectRel
from drinks.models import *

drink = Drink.objects.get(id=1)
links = [field.get_accessor_name() for field in drink._meta.get_fields() if issubclass(type(field), ForeignObjectRel)]
print(links)
> ['description', 'image', 'allergydrink_set']
profile
keep calm and carry on
post-custom-banner

0개의 댓글