Skip to content

Commit 5474c2f

Browse files
authored
Merge pull request #55 from OZ-01-Team3/feature/csrf
[Feature/csrf] csrf 검사 활성화
2 parents 0102854 + faec208 commit 5474c2f

File tree

6 files changed

+45
-129
lines changed

6 files changed

+45
-129
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -501,5 +501,7 @@ failed_files/
501501
config/settings/settings.py
502502
temp-action/
503503
#diagrams/
504+
ERD.md
505+
*.uml
504506

505507
# End of https://www.toptal.com/developers/gitignore/api/python,django,pycharm,vim,visualstudiocode,venv,macos,windows

apps/chat/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def post(self, request: Request) -> Response:
6565
borrower_id=request.user.id,
6666
lender_id=lender_id,
6767
lender_status=True,
68-
borrower_status=True
68+
borrower_status=True,
6969
).exists():
7070
return Response({"msg": "이미 개설된 채팅방 내역이 존재합니다."}, status=status.HTTP_400_BAD_REQUEST)
7171
serializer = serializers.CreateChatroomSerializer(data=request.data)

apps/user/views.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,9 @@ def get_profile(self, access_token: str, provider_info: dict[str, Any]) -> reque
216216
},
217217
)
218218

219-
def login_process_user(self, request: Request, profile_res_data: dict[str, Any], provider_info: dict[str, Any]) -> Response:
219+
def login_process_user(
220+
self, request: Request, profile_res_data: dict[str, Any], provider_info: dict[str, Any]
221+
) -> Response:
220222
# 각 provider의 프로필 데이터 처리 로직
221223
email = profile_res_data.get(provider_info["email_field"])
222224
nickname = profile_res_data.get(provider_info["nickname_field"])

config/settings/base.py

+4-108
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,9 @@
1818
# Build paths inside the project like this: BASE_DIR / 'subdir'.
1919
BASE_DIR = Path(__file__).resolve().parent.parent.parent
2020

21-
# env = environ.Env(DEBUG=(bool, False))
22-
# environ.Env.read_env(env_file=os.path.join(BASE_DIR / "env-be", ".env"))
23-
# environ.Env.read_env(env_file=os.path.join(BASE_DIR, ".env"))
24-
2521
# Quick-start development settings - unsuitable for production
2622
# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/
2723

28-
# SECURITY WARNING: keep the secret key used in production secret!
29-
# SECRET_KEY = env("DJANGO_SECRET_KEY")
30-
31-
# SECURITY WARNING: don't run with debug turned on in production!
32-
# DEBUG = True
33-
34-
# ALLOWED_HOSTS = []
35-
36-
3724
# Application definition
3825

3926
DJANGO_SYSTEM_APPS = [
@@ -75,14 +62,14 @@
7562
INSTALLED_APPS = DJANGO_SYSTEM_APPS + CUSTOM_USER_APPS
7663

7764
MIDDLEWARE = [
65+
"corsheaders.middleware.CorsMiddleware",
7866
"django.middleware.security.SecurityMiddleware",
7967
"django.contrib.sessions.middleware.SessionMiddleware",
8068
"django.middleware.common.CommonMiddleware",
81-
# "django.middleware.csrf.CsrfViewMiddleware",
69+
"django.middleware.csrf.CsrfViewMiddleware",
8270
"django.contrib.auth.middleware.AuthenticationMiddleware",
8371
"django.contrib.messages.middleware.MessageMiddleware",
8472
"django.middleware.clickjacking.XFrameOptionsMiddleware",
85-
"corsheaders.middleware.CorsMiddleware",
8673
"allauth.account.middleware.AccountMiddleware",
8774
]
8875

@@ -110,12 +97,6 @@
11097
ASGI_APPLICATION = "config.asgi.application"
11198

11299

113-
# Database
114-
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases
115-
116-
# DATABASES = {}
117-
118-
119100
# Password validation
120101
# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators
121102

@@ -160,11 +141,6 @@
160141

161142
AUTH_USER_MODEL = "user.Account"
162143

163-
# # cors 관련 설정
164-
# # CORS_ALLOWED_ORIGINS = env("CORS_ALLOWED_ORIGINS").split(",")
165-
# CORS_ORIGIN_ALLOW_ALL = True
166-
# CORS_ALLOW_CREDENTIALS = True
167-
168144
# drf 관련 설정
169145
REST_FRAMEWORK = {
170146
"DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
@@ -188,75 +164,7 @@
188164
"SERVE_INCLUDE_SCHEMA": False,
189165
}
190166

191-
# # S3 관련 설정
192-
# STORAGES = {
193-
# "default": {
194-
# "BACKEND": "storages.backends.s3.S3Storage",
195-
# "OPTIONS": {
196-
# # "session_profile": env("AWS_S3_SESSION_PROFILE"),
197-
# "access_key": env("AWS_ACCESS_KEY_ID"),
198-
# "secret_key": env("AWS_SECRET_ACCESS_KEY"),
199-
# "bucket_name": env("AWS_STORAGE_BUCKET_NAME"),
200-
# # "default_acl": env("AWS_DEFAULT_ACL"),
201-
# "region_name": env("AWS_S3_REGION_NAME"),
202-
# "use_ssl": env("AWS_S3_USE_SSL"),
203-
# "custom_domain": env("AWS_STORAGE_BUCKET_NAME") + ".s3.amazonaws.com",
204-
# # "cloudfront_key": env("AWS_CLOUDFRONT_KEY"),
205-
# # "cloudfront_key_id": env("AWS_CLOUDFRONT_KEY_ID")
206-
# },
207-
# },
208-
# "staticfiles": {"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage"},
209-
# }
210-
211-
# STATICFILES_STORAGE = "django.contrib.staticfiles.storage.StaticFilesStorage"
212-
# DEFAULT_FILE_STORAGE = "django.core.files.storage.FileSystemStorage"
213-
# DEFAULT_FILE_STORAGE = "storages.backends.s3.S3Storage"
214-
# AWS_SESSION_PROFILE = env("AWS_S3_SESSION_PROFILE")
215-
# AWS_ACCESS_KEY_ID = env("AWS_ACCESS_KEY_ID")
216-
# AWS_SECRET_ACCESS_KEY = env("AWS_SECRET_ACCESS_KEY")
217-
# AWS_STORAGE_BUCKET_NAME = env("AWS_STORAGE_BUCKET_NAME")
218-
# AWS_REGION_NAME = env("AWS_S3_REGION_NAME")
219-
# AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com"
220-
# AWS_DEFAULT_ACL = env("AWS_DEFAULT_ACL")
221-
# AWS_QUERYSTRING_AUTH = False
222-
223-
# # djangorestframework-simplejwt 관련 설정
224-
# SIMPLE_JWT = {
225-
# "ACCESS_TOKEN_LIFETIME": timedelta(hours=1), # default: minutes=5
226-
# "REFRESH_TOKEN_LIFETIME": timedelta(days=7), # default: days=1
227-
# "ROTATE_REFRESH_TOKENS": False,
228-
# "BLACKLIST_AFTER_ROTATION": False,
229-
# "UPDATE_LAST_LOGIN": True, # default: False
230-
# "ALGORITHM": "HS256",
231-
# # "SIGNING_KEY": SECRET_KEY,
232-
# "VERIFYING_KEY": "",
233-
# "AUDIENCE": None,
234-
# "ISSUER": None,
235-
# "JSON_ENCODER": None,
236-
# "JWK_URL": None,
237-
# "LEEWAY": 0,
238-
# "AUTH_HEADER_TYPES": ("Bearer",),
239-
# "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION",
240-
# "USER_ID_FIELD": "id",
241-
# "USER_ID_CLAIM": "user_id",
242-
# "USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule",
243-
# "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),
244-
# "TOKEN_TYPE_CLAIM": "token_type",
245-
# "TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser",
246-
# "JTI_CLAIM": "jti",
247-
# "SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp",
248-
# "SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),
249-
# "SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),
250-
# "TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer",
251-
# "TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer",
252-
# "TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer",
253-
# "TOKEN_BLACKLIST_SERIALIZER": "rest_framework_simplejwt.serializers.TokenBlacklistSerializer",
254-
# "SLIDING_TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer",
255-
# "SLIDING_TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer",
256-
# }
257-
258167
SITE_ID = 1
259-
# REST_USE_JWT = True # TODO
260168

261169
# django-allauth 관련 설정
262170
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
@@ -271,18 +179,6 @@
271179
# ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 1 # default 3
272180
# ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIREDT_URL = None
273181

274-
# # django 이메일 인증 설정
275-
# EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
276-
# EMAIL_HOST = env("EMAIL_HOST") # 메일 호스트 서버
277-
# EMAIL_PORT = env("EMAIL_PORT")
278-
# EMAIL_HOST_USER = env("EMAIL_HOST_USER") # 발신 이메일
279-
# EMAIL_HOST_PASSWORD = env("EMAIL_HOST_PASSWORD")
280-
# EMAIL_USE_TLS = True # TLS 보안
281-
# EMAIL_USE_SSL = False # TODO
282-
# DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
283-
# # URL_FRONT = env("URL_FRONT") # TODO 이건 어디서 나온 설정인지?
284-
# # EMAIL_CONFIRMATION_AUTHENTICATED_REDIREDT_URL = "/"
285-
286182
# TODO
287183
# AUTHENTICATION_BACKENDS = [
288184
# "django.contrib.auth.backends.ModelBackend",
@@ -309,8 +205,8 @@
309205
"LOGOUT_ON_PASSWORD_CHANGE": False,
310206
"SESSION_LOGIN": False,
311207
"USE_JWT": True, # default: False
312-
"JWT_AUTH_COOKIE": "adfdfd", # default: None
313-
"JWT_AUTH_REFRESH_COOKIE": "rfdfdf", # default: None
208+
"JWT_AUTH_COOKIE": None, # default: None
209+
"JWT_AUTH_REFRESH_COOKIE": None, # default: None
314210
"JWT_AUTH_REFRESH_COOKIE_PATH": "/",
315211
"JWT_AUTH_SECURE": True,
316212
"JWT_AUTH_HTTPONLY": False, # default: False

config/settings/local.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,10 @@
6060
# csrf 관련 설정
6161
# CSRF_TRUSTED_ORIGINS = ["http://*", "https://*"]
6262
CSRF_TRUSTED_ORIGINS = env("ORIGINS").split(",")
63-
CSRF_COOKIE_SECURE = False
64-
SESSION_COOKIE_SECURE = False
65-
SESSION_COOKIE_SAMESITE = "Lax"
66-
CSRF_COOKIE_SAMESITE = "Lax"
63+
CSRF_COOKIE_SECURE = True
64+
SESSION_COOKIE_SECURE = True
65+
SESSION_COOKIE_SAMESITE = "None"
66+
CSRF_COOKIE_SAMESITE = "None"
6767
CSRF_COOKIE_HTTPONLY = False
6868
# SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
6969

@@ -133,7 +133,6 @@
133133
EMAIL_USE_TLS = True # TLS 보안
134134
EMAIL_USE_SSL = False # TODO
135135
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
136-
# URL_FRONT = env("URL_FRONT") # TODO 이건 어디서 나온 설정인지?
137136
# EMAIL_CONFIRMATION_AUTHENTICATED_REDIREDT_URL = "/"
138137

139138

@@ -217,6 +216,7 @@
217216
EMAIL_CODE_TIMEOUT = env("EMAIL_CODE_TIMEOUT")
218217
DJANGO_SUPERUSER_EMAIL = env("DJANGO_SUPERUSER_EMAIL")
219218
DJANGO_SUPERUSER_PASSWORD = env("DJANGO_SUPERUSER_PASSWORD")
219+
220220
KAKAO_REDIRECT_URI = env("KAKAO_REDIRECT_URI")
221221
KAKAO_CLIENT_ID = env("KAKAO_CLIENT_ID")
222222
KAKAO_CLIENT_SECRET = env("KAKAO_CLIENT_SECRET")

config/settings/prod.py

+30-14
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@
77

88
from .base import *
99

10-
DEBUG = True
1110
ENV: dict[str, str] = literal_eval(get_secret())
1211

1312
SECRET_KEY = ENV["DJANGO_SECRET_KEY"]
13+
DEBUG = True
1414
ALLOWED_HOSTS = ENV["ALLOWED_HOSTS"].split(",")
1515

16-
1716
DATABASES = {
1817
"default": {
1918
"ENGINE": ENV["DATABASE_ENGINE"],
@@ -30,6 +29,22 @@
3029
CORS_ORIGIN_ALLOW_ALL = True
3130
CORS_ALLOW_CREDENTIALS = True
3231
CORS_ORIGIN_WHITELIST = ENV["ORIGINS"].split(",")
32+
CORS_ALLOW_METHODS = (
33+
"DELETE",
34+
"GET",
35+
"OPTIONS",
36+
"PATCH",
37+
"POST",
38+
"PUT",
39+
)
40+
CORS_ALLOW_HEADERS = (
41+
"accept",
42+
"authorization",
43+
"content-type",
44+
"user-agent",
45+
"x-csrftoken",
46+
"x-requested-with",
47+
)
3348

3449
# csrf 관련 설정
3550
# CSRF_TRUSTED_ORIGINS = ["http://*", "https://*"]
@@ -39,6 +54,7 @@
3954
SESSION_COOKIE_SAMESITE = "None"
4055
CSRF_COOKIE_SAMESITE = "None"
4156
CSRF_COOKIE_HTTPONLY = False
57+
CSRF_COOKIE_DOMAIN = ENV["DOMAIN"]
4258

4359

4460
CHANNEL_LAYERS = {
@@ -50,6 +66,17 @@
5066
},
5167
}
5268

69+
CACHES = {
70+
"default": {
71+
"BACKEND": "django_redis.cache.RedisCache",
72+
"LOCATION": f"redis://{ENV['REDIS_HOST']}:{ENV['REDIS_PORT']}/0",
73+
"OPTIONS": {
74+
"CLIENT_CLASS": "django_redis.client.DefaultClient",
75+
"PASSWORD": ENV["CACHES_PASSWORD"],
76+
},
77+
}
78+
}
79+
5380
# djangorestframework-simplejwt 관련 설정
5481
SIMPLE_JWT = {
5582
"ACCESS_TOKEN_LIFETIME": timedelta(days=1), # default: minutes=5
@@ -120,17 +147,6 @@
120147
},
121148
}
122149

123-
CACHES = {
124-
"default": {
125-
"BACKEND": "django_redis.cache.RedisCache",
126-
"LOCATION": f"redis://{ENV['REDIS_HOST']}:{ENV['REDIS_PORT']}/0",
127-
"OPTIONS": {
128-
"CLIENT_CLASS": "django_redis.client.DefaultClient",
129-
"PASSWORD": ENV["CACHES_PASSWORD"],
130-
},
131-
}
132-
}
133-
134150
# django 이메일 인증 설정
135151
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
136152
EMAIL_HOST = ENV["EMAIL_HOST"] # 메일 호스트 서버
@@ -140,7 +156,6 @@
140156
EMAIL_USE_TLS = True # TLS 보안
141157
EMAIL_USE_SSL = False # TODO
142158
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
143-
# URL_FRONT = ENV["URL_FRONT"] # TODO 이건 어디서 나온 설정인지?
144159
# EMAIL_CONFIRMATION_AUTHENTICATED_REDIREDT_URL = "/"
145160

146161
sentry_sdk.init(
@@ -155,6 +170,7 @@
155170
EMAIL_CODE_TIMEOUT = ENV["EMAIL_CODE_TIMEOUT"]
156171
DJANGO_SUPERUSER_EMAIL = ENV["DJANGO_SUPERUSER_EMAIL"]
157172
DJANGO_SUPERUSER_PASSWORD = ENV["DJANGO_SUPERUSER_PASSWORD"]
173+
158174
KAKAO_REDIRECT_URI = ENV["KAKAO_REDIRECT_URI"]
159175
KAKAO_CLIENT_ID = ENV["KAKAO_CLIENT_ID"]
160176
KAKAO_CLIENT_SECRET = ENV["KAKAO_CLIENT_SECRET"]

0 commit comments

Comments
 (0)