Python/DjangoDjango DRF Session 인증과 CSRF (1) - 프로젝트 설정
회원에 대한 인증을 하는 방법에는 크게 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
오류 또는 잘못된 점이 있다면 댓글에 남겨주세요 매우 감사합니다.