#908์ ๋ํ ํ ๋ก ์ ์ด์ด
OPTIONS
(๋ฉํ๋ฐ์ดํฐ) ์์ฒญ์ ๋ํ ๊ถํ์ด DRF์์ ์๋ชป ์ฒ๋ฆฌ๋ฉ๋๋ค.
W3C ์ฌ์์ ๋ฐ๋ผ ๋ชจ๋ preflight OPTIONS
์์ฒญ์ ์ธ์ฆ๋์ง ์์ต๋๋ค. ์ฆ, ์ต์ ๋ธ๋ผ์ฐ์ ๋ ์ฌ์์ ๋ฐ๋ผ ์ด๊ฒ์ ๋ณด๋ด์ง ์๊ธฐ ๋๋ฌธ์ ์ธ์ฆ๋ ์๋ํฌ์ธํธ์ ๋ํ ์์ฒญ์ preflightingํ ๋ ์ฌ์ฉ์๋ ํญ์ 401 ์ค๋ฅ๋ฅผ ๋ฐ์ต๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ๋นํ ์ ์์ฒญ์ ํ์ญ์์ค.
OPTIONS
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ ์ ์ฝ ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ ์๋ ๋ฆฌ๋๋ ์ ํ๋๊ทธ ๋ฐ ์ฐจ๋จ ์ฟ ํค ํ๋๊ทธ๊ฐ ์ค์ ๋ ์ฌ์ ์ ๋ฆฌํผ๋ฌ ์์ค๋ก ๋ฆฌํผ๋ฌ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ณธ ์์ค ์๋ณธ์์ ์์ฒญ URL์ ๊ฐ์ ธ์ต๋๋ค.
- ํค๋ ํ๋ ๊ฐ์ผ๋ก ์์ฒญ ๋ฐฉ๋ฒ(๋จ์ํ ๋ฐฉ๋ฒ์ธ ๊ฒฝ์ฐ์๋)๊ณผ ํจ๊ป Access-Control-Request-Method ํค๋๋ฅผ ํฌํจํฉ๋๋ค.
- ์์ฑ์ ์์ฒญ ํค๋๊ฐ ๋น์ด ์์ง ์์ ๊ฒฝ์ฐ ํค๋ ํ๋ ๊ฐ์ผ๋ก ์ผํ๋ก ๊ตฌ๋ถ๋ ์์ฑ์ ์์ฒญ ํค๋์ ํค๋ ํ๋ ์ด๋ฆ ๋ชฉ๋ก์ ์ฌ์ ์์ผ๋ก ํฌํจํ๋ Access-Control-Request-Headers ํค๋๋ฅผ ํฌํจํฉ๋๋ค. ๊ฐ๊ฐ์ ASCII ์๋ฌธ์๋ก ๋ณํ๋ฉ๋๋ค(ํ๋ ๋๋ more๋ ๋จ์ํ ํค๋์).
- ์์ฑ์ ์์ฒญ ํค๋๋ฅผ ์ ์ธํฉ๋๋ค.
- โก๏ธ ์ฌ์ฉ์ ์๊ฒฉ ์ฆ๋ช ์ ์ธ .
- ์์ฒญ ์ํฐํฐ ๋ณธ๋ฌธ์ ์ ์ธํฉ๋๋ค.
์ฌ๊ธฐ์์ ์ด๊ฒ์ด ๊ธฐ๋ณธ ๋์์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
DRF๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ค ๊ถํ ํด๋์ค(IsAuthenticated, IsAdminUser ๋ฑ)์ ๋ํ ๋ชจ๋ OPTIONS
์์ฒญ์ ์น์ธํด์ผ ํ๋ฉฐ ์ฌ์ฉ์๋ ๋ช
์์ ์ผ๋ก ๋ฉํ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ๋ณดํธํด์ผ ํ๋ ๊ฒฝ์ฐ(ํ์ค CORS ํธํ์ฑ ์นจํด) ์ด๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
๋ณด๊ธฐ.py
class MyView(APIView):
permission_classes = (IsAuthenticated,)
urls.py
urlpatterns = [
url(r'^myview/', MyView.as_view()),
]
์ฝ์
http GET http://127.0.0.1:8000/myview/
HTTP/1.0 401 Unauthorized
http OPTIONS http://127.0.0.1:8000/myview/
HTTP/1.0 401 Unauthorized
์์๋๋ ํ๋
http GET http://127.0.0.1:8000/myview/
HTTP/1.0 401 Unauthorized
http OPTIONS http://127.0.0.1:8000/myview/
HTTP/1.0 200 OK
class IsAuthenticated(permissions.IsAuthenticated):
def has_permission(self, request, view):
if request.method == 'OPTIONS':
return True
return super(IsAuthenticated, self).has_permission(request, view)
DRF ๋ฒ์ : 3.7.3
ํ์ด์ฌ 3.6.3
์์์ ์ธ๊ธํ ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ํจ๊ณผ๊ฐ ์์์ต๋๋ค. PUT, POST, GET, OPTIONS ๋ฑ์ธ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ชจ๋ ์์ฒญ์ด ์ธ์ฆ๋์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ์ต๋๋ค.
# myapp/permissions.py
from rest_framework.permissions import IsAuthenticated
class AllowOptionsAuthentication(IsAuthenticated):
def has_permission(self, request, view):
if request.method == 'OPTIONS':
return True
return request.user and request.user.is_authenticated
๊ทธ๋ฆฌ๊ณ settings.py์์:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication',),
'DEFAULT_PERMISSION_CLASSES': (
'myapp.permissions.AllowOptionsAuthentication',
)
}
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ ์๋ ์๋ฃจ์ ์ ๋์ํ๋ฉฐ ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
CORS ์คํ ์ ์์ฒญ ์ด์ธ์ ๊ฒฝ์ฐ์ OPTIONS
์์ฒญ์ ์ฌ์ฉํ๋ REST ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๋ง์ ๊ฐ๋ฐ์๊ฐ ์๊ธฐ ๋๋ฌธ์ "๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ OPTIONS ์์ฒญ์ ์น์ธํด์ผ ํจ"์ด ์ ํํ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋์์ด๋ผ๊ณ 100% ํ์ ํ๋ ๊ฒ์ ์๋๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์๋ง๋ ์ถ๋ณต๋ฐ์ CORS ์ต์ ์ ์ํ ๊ฒ์ ๋๋ค. https://github.com/ottoyiu/django-cors-headers/๋ฅผ ์ง์ ํฌํจํด์ผ ํ๋์ง ์๋๋ฉด ๋ ๋ง์ด ์ฐธ์กฐํด์ผ ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํด๋น ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๊น?
์ด ํจํค์ง๋ ์ค์ ๋ก ์๋ฃจ์ ์ด ์๋๋ฉฐ CORS ํค๋๋ฅผ ์ถ๊ฐํ ๋ฟ ์ธ์ฆ๋์ง ์์ ๋ชจ๋ ์์ฒญ์ โโ๋ํด DRF ๊ถํ์ด ํน๋ณํ ๋ถ์ฌ๋์ง ์์ ๊ฒฝ์ฐ OPTIONS๊ฐ HTTP401์ ๋ฐํํ๋ค๋ ์ฌ์ค์ ์์ ํ์ง ์์ต๋๋ค.
IMO๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋์
๋์ด์ผ ํฉ๋๋ค. ์ฆ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ฃผ์ ๋ณ๊ฒฝ ๊ณต์ง์ ํจ๊ป ํ์ฉ๋ฉ๋๋ค.
์ด๊ฒ์ W3C ์ฌ์์ ๋ฐ๋ผ ์์๋๋ ๋์์ด๋ฉฐ ์๋ชป๋ ๊ตฌํ์ ํจ์นํ๊ธฐ ์ํด ๋ฌธ์์์ ํ์ฌ๋ฅผ ์ธ๊ธํ๋ ๊ฒ์ ์ค์ ๋ก ๊นจ๋ํ ์๋ฃจ์
์ด ์๋๋๋ค...
๋ฐ๋ผ์ CORS๊ฐ ์๋ ๊ด๋ จ ํญ๋ชฉ์ OPTIONS๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ด ์์ง๋ง(์ ๋ ๊ทธ ์ค ํ๋์ ๋๋ค), CORS ๋ฉ์ปค๋์ฆ์ด ์ ์ ๋ ๋ง์ ๋ธ๋ผ์ฐ์ ์ ์ํด ์ํ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ์ฌ์ ์ผ๋ก ํจ์ฌ ๋ ๋ง์ ๊ฒ์ ์์์ ์ผ๋ก ์์ํ๊ณ ์์ต๋๋ค. ์ค์ ๋ก ์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ์น์ ํตํด OPTIONS ์์ฒญ์ 99% ์ด์์ ์ ์ฌ์ ์ผ๋ก ์์ฑํฉ๋๋ค.
ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฑ. OPTIONS ๋ฉ์๋์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ ํ์ฉ์ ์ฌ์ฉํ๋ ๋ฌธ์ ๋ฅผ ์์ ํ ์ดํดํฉ๋๋ค. ๋๋ ์์ฐ์ค๋ฝ๊ฒ ๋ ์์ ํ ์๋ฃจ์ ์ ๋ ํธํฅ๋์ด ์์ผ๋ฉฐ DRF์ ๋ํ ๊ฐ๋ฐ์์ ๋ชฉ์ ์ ๋ฌ๋ ค ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ๊ธฐ๋ณธ ๊ฑฐ๋ถ๊ฐ ๋์๊ฒ ๋ ์ ์ ํด ๋ณด์ ๋๋ค.
OPTIONS๋ฅผ ํ์ฉํ๊ธฐ ์ํ W3C ์ฌ์์ด CORS์ ์ปจํ ์คํธ์์๋ง ์ ์ฉ๋๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ๋ถ๋ช ํ DRF๋ ์ปจํ ์คํธ๋ฅผ ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ ๊ฐ๋ฐ์์๊ฒ ์ ๊ณต๋๋ ์ค์ ์ด์ด์ผ ํฉ๋๋ค.
CORS๊ฐ ์๋๋ ๊ฒฝ์ฐ ๋ชจ๋ OPTIONS ์์ฒญ์ ํ์ฉํฉ๋๋ค. CORS๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ํ์ง ์์ต๋๋ค.
์ค์ ๋ก ํ์ฌ ๋์์ ๊ณ์ ์ฌ์ฉํ ์ ์๋ ์ํ์์ ์ฃผ์ ๋ฒ์ ์ ๋ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ณ ๋ คํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ธฐ์กด OPTIONS ๋์์ ์ฌ๋๋ค์ด CORS๊ฐ ์๋ JSONP๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ์ฉ๋์์ผ๋ฏ๋ก ์๋ง๋ ์ฐ๋ฆฌ๊ฐ ๋ ธ์ถํ๋ ์๋นํ ์์์ ์ธ ๊ธฐ๋ณธ ์ ๋ณด ์ธํธ๋ฅผ ์ ๊ฑฐํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก CORS์ฉ OPTIONS์๋ง ์ง์คํ๋ ์๋ก ๊ณ ์นจ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค. .
+1
@tomchristie ๋ฉ์ด์ ๋ฒ์ ์ ๋ฐ์ดํธ/์์ ์ด ์ธ์ ์ผ์ด๋ ์ง ์๊ณ ์์ต๋๊น? ๋๋ ๋ํ์ด ๋ฌธ์ ๋ฅผ ์น๊ณ ์์ต๋๋ค.
ํํธ @medakk ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ฒฝํฉ๋๋ค!
3.9์ ๋ํ ์ ์ ํ ๊ณ ๋ ค๋ฅผ ๋ฐ์ ์ ์๋๋ก ์ด์ ํ๋ฅผ ์์ฑํฉ๋๋ค.
๋ค๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ทฐ์์ ์ด๋ฅผ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ์ฌ๋ฌ permission_classes๊ฐ ์๋ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ด ์ฒ๋ฆฌ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ DRY์ ๋๋ค.
def check_permissions(self, request):
if request.method == 'OPTIONS':
return
super(MyApiView, self).check_permissions(request)
https://github.com/OttoYiu/django-cors-headers ํจํค์ง๋ ๋ฏธ๋ค์จ์ด์์ preflighted OPTIONS
์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ์ง์ ๋ฐํํฉ๋๋ค. REST ํ๋ ์์ํฌ์ ๋๋ฌํ๊ธฐ ์ ์ ์์ฒญ/์๋ต์ด ๊ฐ๋ก์ฑ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ REST ํ๋ ์์ํฌ๊ฐ ๋ฌด์์ ํ๋์ง๋ ์ค์ํ์ง ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ด ๋ถ๋ช ํ์ง ์์ต๋๋ค.
์คํ ์ ์๋ต์ REST ํ๋ ์์ํฌ๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค: https://github.com/ottoyiu/django-cors-headers/blob/master/corsheaders/middleware.py#L83
๊ฐ์ฌ ํด์. ์ฐ๋ฆฌ๋ django-cors-headers๋ฅผ ์ฌ์ฉํ์ง ์์ง๋ง ์๋ง๋ ๊ทธ๋ ๊ฒ ํด์ผ ํ ๊ฒ์
๋๋ค.
๋๋ ์ฌ์ ํ DRF๊ฐ W3C ํธํ CORS ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ธ๋ถ ํจํค์ง๊ฐ ํ์ํ์ง ์์์ผ ํ๋ค๋ ์ด์ ์๊ฒฌ์ ๋์ํฉ๋๋ค.
์, ๋ฌธ์ ๋ฅผ ์ฐํํ๋ ๋ฐฉ๋ฒ/ํ์ฌ ํจํค์ง๊ฐ ๋ง์ด ์์ต๋๋ค.
ํ์ง๋ง ์ด ํฐ์ผ์ DRF๊ฐ W3C CORS ์ฌ์๊ณผ ํธํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์์ฑ๋์์ผ๋ฉฐ ์์ ๋์ด์ผ ํฉ๋๋ค.
์ค๋๋ ์๋ํฌ์ธํธ์ ๋ํด ์ํ๋๋ ๋๋ถ๋ถ์ OPTIONS
์์ฒญ์ ํ๋ฆฌํ๋ผ์ดํธ ๋ชฉ์ ์ ์ํ ๊ฒ์ด๋ฉฐ DRF์ ๋
๋จ์ ์ธ ์ ํ์ผ๋ก ์ธํด ์๋ก์ด DRF ์ฌ์ฉ์๊ฐ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒ์ ์๋ง๋ ๊ธฐ๋ง์ ์ผ ๊ฒ์
๋๋ค.
์ค๋๋ ์๋ํฌ์ธํธ์ ๋ํด ์ํ๋๋ ๋๋ถ๋ถ์
OPTIONS
์์ฒญ์ ํ๋ฆฌํ๋ผ์ดํธ ๋ชฉ์ ์ ์ํ ๊ฒ์ด๋ฉฐ DRF์ ๋ ๋จ์ ์ธ ์ ํ์ผ๋ก ์ธํด ์๋ก์ด DRF ์ฌ์ฉ์๊ฐ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒ์ ์๋ง๋ ๊ธฐ๋ง์ ์ผ ๊ฒ์ ๋๋ค.
CORS๊ฐ OPTIONS ๋ฉ์๋๋ฅผ ํ์ด์ฌํนํ๋ค๊ณ ํด์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณด์์ ์์ฉํ๋๋ก ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ํนํ CORS ์ง์์ด ์ ๋๋ก ๊ตฌํ๋๋ฉด ํ์ํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์ฃ์กํ์ง๋ง, ์ด๊ฒ์ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฐ๋ฐ์๋ DRF ๊ด๋ฆฌ์๊ฐ ์๋๋ผ ์์ ์ ์๊ฒฌ์ ํ์ธํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
CORS๊ฐ ํ์ํ ๊ฒฝ์ฐ ๋ฐํด๋ฅผ ๋ค์ ๋ฐ๋ช ํ๋ ๋์ ์ ์ ํ ๊ตฌํ์ ์ง์ํ๋ ๋ชจ๋์ ์ฌ์ฉํ๋๋ก ์ ์ํ๋ ๋ฌธ์ ๊ฐ์ ์ฌํญ์ผ ์ ์์ต๋๋ค.
๋ ๋ฒจ์ ๋ฎ์ถ์.
๋ฏธ๋ค์จ์ด ๋ CORS ํค๋๋ฅผ ์ฒ๋ฆฌํ๋ ํฉ๋ฆฌ์ ์ธ ์ฅ์์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ REST ํ๋ ์์ํฌ์ ๊ตฌ์ถ ํ ์ ์์ง๋ง ๊ธฐ์กด ํจํค์ง๋ ์ด๋ฏธ ๊ทธ๊ฒ์ ์ ๋ง ํ๋ฅญํ๊ฒ ๋ค๋ฃจ์์ต๋๋ค.
REST ํ๋ ์์ํฌ๊ฐ OPTIONS
์์ฒญ์ ๋ํด ๋ฐํํ๋ ๋ณธ๋ฌธ์ ์ฌ๊ธฐ์์ ๊ด๋ จ์ด ์์ต๋๋ค. preflighted CORS ์์ฒญ์ ์ด์จ๋ ๋ฏธ๋ค์จ์ด์์ ๊ฐ๋ก์ฑ์ผ ํ๊ณ ํ์ค CORS ์์ฒญ์ ๋ชจ๋ HTTP ๋ฉ์๋์ผ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
REST ํ๋ ์์ํฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ์๋ต ๋ณธ๋ฌธ์ ์ ๊ณต ํ์ง ์๋ ๊ฒ์ผ๋ก ์ด๋ํ๋ ๊ฒ์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ CORS ์ง์ ๋ฌธ์ ์ ์ฝ๊ฐ ๋ค๋ฅด๋ฉฐ REST ํ๋ ์์ํฌ๊ฐ ๊ฑฐ๊ธฐ์์ ๋ ๋จ์ ์ธ ํ๋์ ํ๋ ๊ฒ์ด ์๋๋ผ ์คํ๋ ค CORS๊ฐ ๋๋ฆฌ ๊ตฌํ๋๊ธฐ ์ด์ ์ ๋์์ ๋๋ค.
๋ฏธ๋ค์จ์ด ์๋ฃจ์ ๋ง์ผ๋ก๋ ๋ถ์กฑํ๊ฑฐ๋ ์ต์ํ DRF์ ํ์กฐ๊ฐ ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐธ์กฐ๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ ์ญ ๊ธฐ๋ณธ๊ฐ์ด CORS ํค๋๋ฅผ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉ๋๊ณ ์์์ ์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ ๋ณด๊ธฐ๊ฐ ์ง์ํ๋ ํค๋๋ฅผ ์ ์ญ์ ์ผ๋ก ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น?
๋ฐ๋ผ์ ๋ฏธ๋ค์จ์ด๊ฐ ๋ณด๊ธฐ ์งํฉ/๋ณด๊ธฐ์์ ์ด๋ฌํ ๊ตฌ์ฑ ์ต์
์ ์ฐ๊ฒฐํ๋ ํ์ค ๋ฐฉ๋ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ์๋ฅผ ๋ค์ด allowed_cors_headers
๋ฐฉ๋ฒ์
๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ทฐ์ ์ํด ์ฒ๋ฆฌ๋ ํ์๊ฐ ์๋ค๋ ๋ฐ ๋์ํ์ง๋ง ๊ทธ๊ฒ์ด ์ ๊ณตํ ์ ์๋ ๊ฒ์ ๋ํ ๋ทฐ์ ์ง์์ ์ ๋์ ์ผ๋ก ์กด์คํด์ผ ํฉ๋๋ค.
๋ผ์ฐํฐ์ ๋ชจ๋ ๋ณด๊ธฐ์ ์ ์ฉํ ๋ผ์ฐํฐ ์์ค ์ฌ์ ์๋ฅผ ๊ฐ๋ ๊ฒ๋ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ถ๊ฐ ๊ณ ๋ ค ์ฌํญ:
์ด๊ฒ์ ๋ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์ ํ์ ์๋์ง๋ง ํ์ฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์์ต๋๋ค.
๋ฌธ์๊ฐ CORS ์ฌ์ฉ์์ ๋ํ ์ ์ ํ ์ ๋ณด๋ก ์ ๋ฐ์ดํธ๋๋ฉด ์ด ํฐ์ผ์ ๋ซ์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค(์: "์กฐ์ฌ, DRF๋ OPTIONS ์์ฒญ์ ๋ํ W3C CORS ์ฌ์์ ์ถฉ์กฑํ์ง ์์ต๋๋ค. CORS์ OPTIONS๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ถ๊ฐํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ์ ์ ํ ๋ฏธ๋ค์จ์ด๊ฐ ์์ผ๋ฉด ์น์ธ ๋ถ์กฑ์ผ๋ก ์ธํด ์คํ ์ ์์ฒญ์ด ์คํจํ ์ ์์ต๋๋ค." ๋ฑ)
๊ธฐ์กด ๋ฌธ์ https://www.django-rest-framework.org/topics/ajax-csrf-cors/#cors ๋ ์๋ฒฝํ๊ฒ ํฉ๋ฆฌ์ ์ด๋ฉฐ ๋ฏธ๋ค์จ์ด์์ CORS๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ด๋ค ๊ฒฝ์ฐ์๋ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ ๋ณด๊ธฐ๊ฐ ์ง์ํ๋ ํค๋๋ฅผ ์ ์ญ์ ์ผ๋ก ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น?
๊ทธ๋ด ํ์๋ ์์ต๋๋ค. ์ฌ์ดํธ์ CORS ์ ์ฑ ์ด ๋ฌด์์ธ์ง ์์์ผ ํฉ๋๋ค.
CORS ๋ฌธ์๋ฅผ ๋ ๋์ ๋๊ฒ ๋ง๋ค๊ฑฐ๋ ์ ์ ํ ๋ค๋ฅธ ์์น์ ํฌํจ์ํค๋ pull ์์ฒญ์ ์๋ฝํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๊ทธ ์ธ์๋ ์ฌ๊ธฐ์ ์คํ ๊ฐ๋ฅํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ฌ์์ ๋ํ ๋์ ์คํด, ์์ค.
์ด ๊ฒฝ์ฐ ์ง์์ django ์ฌ์ดํธ ๊ธฐ์ฌ์ ๋ ์ ํฌํจ๋ ๊ฒ์
๋๋ค.
ํจํค์ง๊ฐ ์๋ drf.
๋ฅด๋ง๋ฅด. 19ํ 2019๋
10์ 22๋ถ, Tom Christie [email protected] a
์ํฌ๋ฆฌํธ :
๊ธฐ์กด ๋ฌธ์
https://www.django-rest-framework.org/topics/ajax-csrf-cors/#cors ๋
์๋ฒฝํ๊ฒ ํฉ๋ฆฌ์ ์ด๋ฉฐ ๋ฏธ๋ค์จ์ด์์ CORS๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ ํํฉ๋๋ค.
์ด๋ค ๊ฒฝ์ฐ์๋ ์ ๊ทผํฉ๋๋ค.๊ทธ๋ฌ๋ ๊ฐ ๋ณด๊ธฐ๊ฐ ์ง์ํ๋ ํค๋๋ฅผ ์ ์ญ์ ์ผ๋ก ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น?
๊ทธ๋ด ํ์๋ ์์ต๋๋ค. ์ฌ์ดํธ์ CORS ์ ์ฑ ์ด ๋ฌด์์ธ์ง ์์์ผ ํฉ๋๋ค.
โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/encode/django-rest-framework/issues/5616#issuecomment-465146969 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AFhtlM6bG-Bs2CvoO972pIfwvxLHbzAxks5vPAjAgaJpZM4Qlvkn
.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
DRF ๋ฒ์ : 3.7.3
ํ์ด์ฌ 3.6.3
์์์ ์ธ๊ธํ ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ํจ๊ณผ๊ฐ ์์์ต๋๋ค. PUT, POST, GET, OPTIONS ๋ฑ์ธ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ชจ๋ ์์ฒญ์ด ์ธ์ฆ๋์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ settings.py์์: