Python/Django

Python/DjangoDjango DRF Session 인증과 CSRF (1) - 프로젝트 설정

구름용 2023. 4. 24. 19:53

회원에 대한 인증을 하는 방법에는 크게 Session과 JWT와 같은 토큰을 사용하는 방법이 존재한다.

이번 포스트에서는 Django Session기반의 Django Rest API 서버를 구현하고자 한다.

 

참고를 한 유튜브 링크는 다음과 같다.

https://www.youtube.com/watch?v=Bsf9WaU9wZ4&list=PLJRGQoqpRwddrFlVEQV16D1jdol40ETyx&index=2 

 

패키지 관리

  • venv

설치 라이브러리

  • requirements.txt
asgiref==3.6.0
Django==4.2
django-cors-headers==3.14.0
django-environ==0.10.0
djangorestframework==3.14.0
protobuf==3.20.3
psycopg==3.1.8
psycopg-binary==3.1.8
pytz==2023.3
sqlparse==0.4.4
typing_extensions==4.5.0

데이터 베이스로는 postgresql을 사용하기 때문에 psycopq 라이브러리를 다운받았다.

[참고] https://www.psycopg.org/psycopg3/docs/basic/install.html

 

Installation - psycopg 3.2.0.dev1 documentation

Previous Getting started with Psycopg 3

www.psycopg.org

데이터 베이스

  • postgresql14
  • schema name : session_auth

이 프로젝트에서 사용한 데이터 베이스는 postgresql 14버전이다. 

 

DataGrip으로 확인하면 다음과 같다.

아직 생성한 테이블은 없음

장고 프로젝트 구성

환경 변수 설정

이 프로젝트에서 쓰이는 코드는 모두 Github에 올라갈 예정이다. 따라서 보안과 밀접한 정보들은 plan text 형태로 노출되지 않도록 각별히 주의해야 한다.

장고의 settings.py의 코드를 살펴보면 SECRET_KEY, DB 설정값(HOST, PASSWORD, PORT) 와 같이 외부에 노출되면 보안상 문제되는 설정값들이 존재한다. 이러한 값들은 django-environ 라이브러리를 사용하여 .env 파일에서 읽어들여 외부에 노출되지 않도록 프로젝트를 세팅할 것이다.

  • .env 파일

환경변수 값들

  • settings.py
import os, environ
from pathlib import Path



# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

env = environ.Env()
env_path = BASE_DIR / ".env"
if env_path.exists():
    with env_path.open("rt", encoding="utf8") as f:
        env.read_env(f, overwrite=True)

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY')


...


DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": env("DB_NAME"),
        "USER": env("DB_USER"),
        "PASSWORD": env("DB_PASSWORD"),
        "HOST": env("DB_HOST"),
        "PORT": env("DB_PORT")
    }
}

 

DATABASES에 DB 설정값 들을 모두 넣어줬다면 서버를 실행하여 잘 연결이 되는 지 먼저 확인한다.

python manage.py runserver

실행 화면

아직 migration 과정을 거치지 않아 경고문이 출력되었지만 정상적으로 DB와 연결되었다.

 

  • .gitignore
venv

### Django ###
*.log
*.pot
*.pyc
__pycache__/
local_settings.py
db.sqlite3
db.sqlite3-journal
media

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

 

App 설정

디비 설정 및 환경변수 설정이 완료되었다. 이제는 장고 어플리케이션과 관련된 설정을 한다.

먼저 계정과 프로필 관련 서비스를 제공할 app을 생성한다.

python manage.py startapp accounts
python manage.py startapp user_profile

 

그리고 settings.py의 INSTALLED_APPS에 맨 처음 설치한 라이브러리와 방금 생성한 2개의 앱을 명시해준다.

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "rest_framework",
    "corsheaders",
    "accounts",
    "user_profile"
]

그리고 Django와 React 사이의 통신 과정에서 발생하는 CORS 문제를 해결하기 위해 관련 미들웨어를 추가해 준다.

MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

 

인증, 권한 클래스 설정

다음으로는 우리 프로젝트에서 사용할 인증과 권한 관련 클래스를 설정해줄 차례이다. 

 

이 어플리케이션은 인증된 사용자만 접근하도록 할 것이고 그 과정을 세션을 사용할 것이다. 따라서 다음과 같이 설정 파일에 추가한다.

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        "rest_framework.permissions.IsAuthenticated",
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
    ]
}

 

CORS 설정

마지막으로 React 와의 통신간에 발생하는 CORS 문제를 해결하기 위해 다음과 같이 추가한다. 지금은 localhost 에서만 진행 할 것이므로 localhost에 대한 주소만 추가하였다.

CORS_ORIGIN_WHITELIST = ['http://127.0.0.1:3000'
                         ,'http://localhost:3000']
CORS_ALLOW_CREDENTIALS = True

 

 

여기까지 진행한 후 서버를 가동했을 때 문제가 없다면 모두 완료가 된 상태이다.

 

 

 

 

[github 주소] https://github.com/yongun2/Django-Session-Authentication-And-CSRF

 

yongun2/Django-Session-Authentication-And-CSRF

Contribute to yongun2/Django-Session-Authentication-And-CSRF development by creating an account on GitHub.

github.com

 

오류 또는 잘못된 점이 있다면 댓글에 남겨주세요 매우 감사합니다.