10 분 소요

api 폴더 만들기

  • 해당 프로젝트의 이름은 backend로 이름을 잡았다.
  • python manage.py startapp base 로 base 폴더를 하나 만들어준다.
  • base 폴더 밑에 api 폴더를 만들어준다.
    • api 폴더 밑에 views.py와 urls.py 그리고 init.py serializers.py를 만들어준다.

    image

    • 동작 과정을 확인하기 위해 간단한 코딩을 해준다.
# base/api/views.py
from django.http import JasonResponse

def getRoutes(request):
    routes = [
        '/api/token',
        '/api/token/refresh',
    ]
    return JsonResponse(routes, safe=False)
# backend/urls.py
from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('base.api.urls')),
]
# base/api/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.getRoutes),
]
  • 이렇게 한 후 /api/ url에 접속을 해보면 [“/api/token”, “/api/token/refresh”] 글자가 나오는 것을 확인할 수 있다.
  • api라는 url이 입력이 되면 backend/urls.py 에서 base.api.urls로 접근하게 된다.
  • base/api/urls.py에서는 공백 입력시 views.py에 있는 getRoutes라는 함수를 호출하게 된다.
  • return 값으로 JasonResponse를 주어서 글자가 뜨는것을 확인할 수 있다.

DRF(Django Rest Framework) 설치

pip install djangorestframework 
  • 터미널 창에 입력하여 설치한다.
INSTALLED_APPS = [
    ...
    'rest_framework',
]
  • 밑으로 내려보면 추가해야될 항목들이 나오게 된다.
  • settings.py에 이동해서 추가해 주도록 하자.
  • drf가 기능이 잘 하는지 확인하기 위해 base/api/views.py 를 수정해주도록 하자
# base/api/views.py
from django.http import JsonResponse
from rest_framework.response import Response
from rest_framework.decorators import api_view


@api_view(['GET'])
def getRoutes(request):
    routes = [
        '/api/token',
        '/api/token/refresh',
    ]
    return Response(routes)

image

  • drf 인터페이스가 입혀진 해당 페이지를 볼 수 있게 된다.

Authentication(인증)

기본 개념

로그인 상태가 유지가 되도록 하는게 어려움.

  • 인증 : Authetication(로그인)
    • 내가 이 사이트에 가입된 회원임을, 즉 특정 서비스에 일정 권한이 주어진 사용자임을 아이디랑 패스워드 등을 통해서 인증을 받는것
  • 인가 : Authorization
    • 이렇게 한 번 인증을 받은 사용자가 이후 서비스의 여러 기능들을 사용할때 즉, 이를테면 내가 페이스북에 로그인으로 인증을 하고 나서 내 친구들의 목록을 보거나 내 담벼락에 글을 작성하거나 친구의 게시물의 내 명의로 좋아요나 댓글을 다는 등 내 계정으로만 할 수 있는 활동을 시도할 때 페이스북이 내가 로그인 되어있음을 알아보고 허가를 해주는 것.
  • JWT는 Authorization에 연관된 기술

전통적으로 많이 사용되어온 세션 방식

  • 사용자가 로그인에 성공하면, 서버는 ‘세션 표딱지’란 걸 출력
  • 그리고 이걸 찢어서 반쪽은 사용자의 브라우저(크롬)로 보내고 다른 반족은 메모리에 올려놓는것.
  • 브라우저가 이 표를 Session ID란 이름의 쿠키로 저장, 쿠키는 브라우저에 저장되는 정보. 이 브라우저는 앞으로 사이트에 요청을 보낼때마다 이 표딱지(세션 ID)를 실어 보낸다.
  • 브라우저에서 세션아이디를 보내면 서버는 메모리에서 맞는 짝이 있는지 찾아서 있으면 Authorization해줌.

  • Session ID를 사용해서 어떤 사용자가 서버에 로그인 되어있음이 지속되는 상태를 세션이라고 한다.
  • 그런데 서버가 다운되거나 에러사항이 발생하면 다 튕기게 됨. 무거워지는걸 방지하기 위해서 고안이 된 것이

토큰 방식(JWT)

  • 토큰 방식 : JWT(Jason Web Token)
    • 사용자가 로그인 하면 토큰을 출력해서 건네준다.
    • 찢어서 주지 않고 그냥 줌.
    • 서버가 뭔가를 기억하고 있지 않다는 뜻
    • 인코딩 또는 암호화된 3가지 데이터를 이어붙인것이 JWT
    • XXXXXX.YYYYYY.ZZZZZZ
      • header, payload, verify signature
      • 헤더, 페이로드, 서명

      • 페이로드
        • Base64로 디코딩해보면 JSON 형식으로 여러 정보들이 들어있음.
        • 누가 누구에게 발급했는지, 이 토큰이 언제까지 유효한지
        • 서비스가 사용자에게 이 토큰을 공개하기 원하는 내용
        • 이를테면 사용자의 닉네임, 서비스상의 레벨, 관리자 여부 등
        • 이렇게 토큰에 담긴 사용자 정보 등의 데이터를 Claim이라고 한다.
      • 헤더
        • 두개의 정보가 들어감
          1. 토큰의 타입 여기에는 항상 JWT가 들어감. type이 JWT여야 JWT임. 고정값
          2. alg 이건 알고리즘의 약자. 3번 서명값을 만드는데 사용될 알고리즘이 지정됨.
            • HS256 등 여러 암호화 방식 중 하나를 지정할 수 있다.
      • 서명 값
        • 1번 헤더와 2번 페이로드, 그리고 서버에 감춰놓은 비밀 값 이 셋을 암호화 알고리즘에 넣고 돌리면 3번 서명 값이 나옴.

JWT의 결점과 보완 방법

  • 그래서 세션에서 서버는 사용자들의 상태를 어디다가 따로 기억을 해 둘 필요가 없이, 이 비밀 값만 손에 쥐고 있으면 요청들 들어올때마다 토큰 스캔해서 사용자들을 걸러낼 수 있다.

    • 이처럼 시간에 따라 바뀌는 어떤 상태값을 안 갖는 걸 stateless하다고 함
    • 세션은 반대로 stateful임.

하지만 JWT에는 큰 결점이 있음.

  • 세션처럼 stateful해서 모든 사용자들의 상태를 기억하고 있다는 건 구현하기 부담되고 고려사항도 많지만, 이게 되기만 하면 기억하는 대상의 상태들을 언제든 제어할 수 있음.
  • 예를 들어 한 기기에서만 로그인 가능한 서비스를 만들려는 경우 PC에서 로그인한 상태의 어떤 사용자가 핸드폰에서 또 로그인하면 PC에서는 로그아웃되도록 기존 세션을 종료할 수 있음.
  • 그런데 JWT는 이미 토큰을 줘버려서 서버에서 컨트롤 못함. 어떤 악당이 토큰을 가져가버리면 토큰을 무효화할 방법도 없음.
  • 때문에 실 서비스중에 JWT만으로 인가를 구현하는 곳은 생각보다 많지 않다.

그래서 이러한 문제점을 보완하기 위한 방법

  • 만료시간을 가깝게 잡아서 토큰의 수명을 아주 짧게 준다.
  • 로그인을 하고 나면 토큰을 두 개 준다.
    1. 수명이 몇 시간이나 몇 분 이하로 짧은 access 토큰
    2. 꽤 길게, 보통 2주 정도로 잡혀 있는 refresh 토큰
  • access 토큰과 refresh 토큰을 발급하고 클라이언트에게 보내고 나서 refresh 토큰은 상응값을 데이터베이스에도 저장함.
  • 손님은 access 토큰의 수명이 다하면 refresh 토큰을 보냄.
  • 서버는 그걸 데이터베이스에 저장된 값과 대조해보고 맞다면 새 access 토큰을 발급해줌.
  • 이제 이 refresh 토큰만 안전하게 관리된다면 이게 유효할 동안은 access 토큰이 만료될 때마다 다시 로그인을 할 필요 없이 새로 발급을 받을 수 있음.

  • 이렇게 되면 중간에 access 토큰이 탈취 당해도 강제 로그아웃 시키기 위해 refresh 토큰을 DB에서 지워서 토큰 갱신이 안되게 하면 됨. 하지만 바로 로그아웃은 못시킴.
  • access 토큰이 살아있는 동안은 로그인이 되어있기 때문.

이어서

  • drf 공식 홈페이지의 Authentication에 들어간다.
  • JWT(JSON Web Token) 클릭
  • 그곳에서 JSON Web Token Authentication 목차에 simplejwt의 github가 있다.
  • github로 이동하게 되면 Simple JWT주소가 나오게 된다.
  • 접속해서 installation으로 이동한다.
pip install djangorestframework-simplejwt
  • 설치해준다.
# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
}
  • settings.py에 추가해준다.
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
  • 이런 코드들을 추가해주라고 나온다.
  • 우리는 이미 앞에서 backend 폴더의 urls.py에서 api/라는 url을 주었기 때문에 base/api/urls.py에 있는 url에는 앞에 붙어있는 api를 빼고 넣도록 하자.
# base/api/urls.py
from django.urls import path
from . import views
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    path('', views.getRoutes),
    path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
  • TokenObtainPairView를 이용하여 access token과 refresh token을 받아온다.
  • TokenRefreshView를 이용하여 refresh token에 대응하는 access token을 새로 발급해준다.
  • 그런데 우리는 user가 한명도 없기 때문에 로그인을 해서 토큰을 발급 받을수가 없기 때문에 superuser를 만들어준다.
python manage.py createsuperuser
  • user를 만들어주고 /api/token/ url로 접속을 해보자.
  • 그리고 생성한 super user로 로그인을 해보면

image

  • 위 이미지처럼 토큰 쌍을 주게 된다.

  • 토큰의 디코딩 값을 알고 싶다면 jwt.io 로 이동해보자.
  • 그리고 각 refresh 토큰과 access 토큰을 복사해서 붙여넣기 해보면

image

  • 위의 이미지처럼 나오게 된다.
  • 이제 토큰을 구성하기 위해서 settings에 더 추가해야할 항목이 있다.
  • simple-JWT 공식 홈페이지에 가서 settings에 들어가보자.
  • 기본적으로 커스터마이징 되어 있는 설정값들이 나오게 된다.
# Django project settings.py

from datetime import timedelta
...

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    'ROTATE_REFRESH_TOKENS': False,
    'BLACKLIST_AFTER_ROTATION': False,
    'UPDATE_LAST_LOGIN': False,

    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,
    'AUDIENCE': None,
    'ISSUER': None,
    'JWK_URL': None,
    'LEEWAY': 0,

    'AUTH_HEADER_TYPES': ('Bearer',),
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',
    'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',
    'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',

    'JTI_CLAIM': 'jti',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}
  • 추가해준다.
  • 맨 위의 access 토큰의 생명 주기는 5분으로 설정해준다.
  • refresh 토큰의 생명주기는 90일로 바꾸어준다.
  • 우리는 refresh 토큰을 한번 받으면 받은 환경에서 90일동안 로그인이 유지가 된다.
  • 그런데 다른 환경에서 로그인을 하게 될 때 새로운 refresh 토큰을 받아서 다른 기기의 연결을 끊고 싶다면?
  • 일단 Rotate refresh tokens의 설정값을 True로 바꾸어준다.
    • Rotate를 True로 하면 다른 환경에서 로그인 할때마다 refresh 토큰이 갱신됨.
    • 그런데 갱신이 되어도 그 전 refresh 토큰도 또한 사용을 할 수 있게 됨.
    • 그래서 밑에 기능인 blacklist 기능을 이용해야 하는데 이를 이용하기 위해서는
    • ‘rest_framework_simplejwt.token_blacklist’, 를 installed app에 추가해줘야함.
      INSTALLED_APPS = [
          ...
          'rest_framework_simplejwt.token_blacklist',
      ]
    
  • 그리고 이 기능도 True로 바꾸어준다면?
    • 이제 갱신되기 전 refresh 토큰은 블랙리스트에 올라서 더이상 사용 못하게된다.
    • 그러면 다른 기기에서 로그인 했을 때, 전 기기에서 access 토큰의 사용기간이 만료가 되면 더이상 로그인이 지속되지 않는다.
  • 서버를 끄고 python manage.py migrate를 해주고 정상 작동하는지 확인.

image

  • 처음에 먼저 api/token 주소에서 로그인을 하여 refresh 토큰을 받고 api/token/refresh로 이동
  • 그 후 발급 받은 refresh 토큰을 입력해서 다시 refresh 토큰과 access 토큰 발급 받기
  • 그 전 refresh 토큰을 입력하게 되면 위 이미지 처럼 블랙리스트에 올라와서 더이상 사용할 수 없다고 뜨게 됨.
  • 그리고 이 발급된 토큰들을 디코딩해서 사용자 정보로 출력해줘야 한다.

사용자 정보 출력

  • simple-JWT 사이트로 이동
  • Customizing token claims 이동
# base/api/views.py
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)

        # Add custom claims
        token['username'] = user.username
        # ...

        return token

class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer
  • 추가를 해준다.
  • 이 기능은 암호화된 토큰에 사용자의 정보를 추가해주는 역할을 한다.
  • 그러면 이제 앞에서 base/api/urls.py에서 불러올 함수를 정의해줬던 것을 위의 두 함수로 바꾸어 줘야 한다.
from django.urls import path
from rest_framework_simplejwt.views import TokenRefreshView
from . import views
from .views import MyTokenObtainPairView

urlpatterns = [
    path('', views.getRoutes),
    path('token/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
  • token 주소로 접속을 했을 때 MyTokenObtainPairView 함수를 호출해줄 것이다.
  • 아까와 별반 다를바 없는 refresh 토큰과 access 토큰이 출력된다. 하지만 이 토큰을 긁어서 jwt.io로 이동을 해서 써보면?

image

  • 위의 사진처럼 username이 추가된 것이 보인다.
  • 우리는 username을 위에 MyTokenObtainPairSerializer의 get_token 함수에서 추가해주었기 때문에 나타나게 된다.
  • Serializer를 이용해 사용자의 정보를 토큰에 더 집어넣어준것이다.
  • 프론트에 접근을 해서 이 데이터들을 보여주어야 하는데 문제가 있다.

CORS

  • CORS는 Cross Origin Resource Sharing의 약자로 도메인 또는 포트가 다른 서버의 자원을 요청하는 매커니즘이다.

  • 최근 대부분의 웹 브라우저는 Javascript를 이용한 AJAX(Asynchronous Javascript XML)통신을 통한 데이터 송수신을 하는데,

  • 다른 도메인을 가진 서버의 URL을 호출해 데이터를 가져오려고 하는 경우 보안 문제인 Cross Domain 이슈를 발생시킨다.

  • 왜냐하면 만약 우리 웹 서비스에서 사용하기 위해 다른 서브 도메인을 가진 API 서버를 구축했는데, 우리가 아닌 다른 웹 서비스에서 이 API 서버에 접근해서 마음대로 API를 호출해서 사용하면 안되기 때문이다.

  • 예를들어, www.ozit.co.kr 도메인에선 www.ozit.co.kr 도메인 내에 있는 URL 만을 호출할 수 있다.
  • www.ozit.co.kr 도메인에서 www.tistory.com도메인의 URL은 AJAX로 호출할 수가 없다.

  • Javascript는 동일 출처 정책이라는 정책을 두어 도메인이 다른 서버로부터 요청을 받으면 보안 문제로 간주하고 CORS 이슈를 발생시켜 이를 차단한다.

  • 동일 출처 정책(Same Origin Policy) 때문에 CORS가 발생하는데, 브라우저에서 외부 서버가 cross-origin HTTP로 요청한 데이터를 보안 목적으로 차단한다.
  • 그래서 데이터를 받을 수가 없다.

  • 즉, 자신과 동일한 도메인에 한해서만 요청을 허용하고 처리해준다.

CORS 문제 해결 방법

  • CORS 문제는 다른 도메인의 서버로부터 요청이 들어왔을 때, 헤더에 접근을 허락하는 내용이 없으면 발생한다.

  • 예를 들어 클라이언트는 localhost:3000이고 외부 서버는 localhost:8000이면 포트가 달라서 CORS가 발생할 수 있다.

  • (가장 쉬운 해결방법은 클라이언트와 서버가 같은 도메인과 포트를 사용하는 거지만.. )

  • 이럴 경우 외부 서버에서 보내는 요청의 헤더(Access-Control-Allow-Origin response 헤더)에 cross origin HTTP 요청을 허가해 접근을 허락하는 내용을 추가해 주면 된다.

cross origin HTTP 요청을 허가해주는 방법

  • 헤더에 접근을 허락하는 내용을 추가
    1. pip install로 django-cors-headers 앱을 설치한다.
      • django-cors-headers는 Cross-Origin Resource Sharing(CORS) 에 필요한 서버의 헤더를 조작하기 위한 Django 앱이다.
       $ pip install django-cors-headers
      
      • django-cors-headers 장고앱을 이용해서 response에 CORS(Cross Origin Resource Sharing) 헤더를 추가한다,

      • 이렇게 하면 다른 서버에서로부터 내 서버 앱으로 들어오는 브라우저를 통한 요청을 허가한다.

    2. installed apps 목록에 corsheaders를 추가한다.

       # settings.py
       INSTALLED_APPS = [
           ...
           'corsheaders',
           ...
       ]
      
    3. middleware class도 추가해야 한다.

       # settings.py
       MIDDLEWARE = [
           'corsheaders.middleware.CorsMiddleware', # <- 가능한 높게 위치시켜야 한다.
           'django.middleware.common.CommonMiddleware', 
           ...
       ]
      
      • CorsMiddleware는 가능한 높게 위치시켜야 한다.

      • 특히 Django의 CommonMiddleware나 Whitenoise의 WhiteNoiseMiddleware와 같은 응답을 생성할 수 있는 미들웨어 전이어야 한다.

      • 이러한 미들웨어 전이 아닌 경우엔, 이러한 응답들에 CORS 헤더를 추가할 수 없기 때문이다.

    4. Django settings에서 미들웨어의 동작을 구성해야 한다.
      • CORS_ORIGIN_WHITELIST에는 cross-site 요청을 허용하는 호스트들을 추가한다.
      • 또는 모든 호스트를 허용하고 싶으면 CORS_ORIGIN_ALLOW_ALL을 True로 설정한다.
      • 만약 CORS_ORIGIN_ALLOW_ALL이 True 이면, whitelist는 쓰이지 않고, 모든 origin에서의 요청이 허용된다.
      • Default는 False이다.
      • CORS_ORIGIN_WHITELIST는 cross-site HTTP 요청을 할 수 있는 권한이 주어지는 origin들의 리스트이다.
      • Default는 [] 이다.
      • Origin은 URI scheme + hostname + port 등으로 정의된다.
       # settings.py
       CORS_ORIGIN_ALLOW_ALL = True # <- 모든 호스트 허용
      
       # or 
      
       CORS_ORIGIN_WHITELIST = (
           "https://example.com",
           "https://sub.example.com",
           "http://localhost:8080",
           "http://127.0.0.1:9000"
       )
      
      • 이렇게 헤더에 추가해주면 된다.
    5. 5번부터는 쓰지 않아도 되는 선택적인 세팅이다. 몇 가지만 살펴보겠다.
      • CORS_ALLOW_CREDENTIALS
      • CORS_ALLOW_CREDENTIALS가 True인 경우, 쿠키가 cross-site HTTP 요청에 포함될 수 있다.
      • 기본값은 False이다.
       CORS_ALLOW_CREDENTIALS = True
      
      • CORS_ALLOW_METHODS
      • 실제 요청에 허용되는 HTTP 동사 리스트이다. 기본값은 다음과 같다:
       # settings.py
       CORS_ALLOW_METHODS = [
           'DELETE',
           'GET',
           'OPTIONS',
           'PATCH',
           'POST',
           'PUT',
       ]
      
      • 기본값은 corsheaders.defaults.default_methods로 임포트 할 수 있으므로, 커스텀 메소드들은 확장해서 사용하면 된다.

      • 예를 들어:

       from corsheaders.defaults import default_methods
      
       CORS_ALLOW_METHODS = list(default_methods) + [
           'POKE',
       ]
      
      • CORS_ALLOW_HEADERS
      • 실제 요청을 할 때 사용될 수 있는 non-standard HTTP 헤더 목록이다.
      • 기본값은 다음과 같다
       # settings.py
       CORS_ALLOW_HEADERS = [
           'accept',
           'accept-encoding',
           'authorization',
           'content-type',
           'dnt',
           'origin',
           'user-agent',
           'x-csrftoken',
           'x-requested-with',
       ]
      
      • 이것 또한 기본값은 corsheaders.defaults.default_headers로 임포트 할 수 있으므로, custom 헤더들은 확장해서 사용하면 된다.

      • 예를 들어

       from corsheaders.defaults import default_headers
      
       CORS_ALLOW_HEADERS = list(default_headers) + [
           'my-custom-header'
       ]
      

      SETTINGS.PY

    • 위의 내용을 바탕으로 작성한 settings.py 파일의 일부

        INSTALLED_APPS = [
            'corsheaders',
            'django.contrib.contenttypes',
            'django.contrib.sessions',
            'django.contrib.messages',
            'django.contrib.staticfiles',
            'account',
            'product',
            'review',
        ]
      
        MIDDLEWARE = [
            'django.middleware.security.SecurityMiddleware',
            'django.contrib.sessions.middleware.SessionMiddleware',
            'django.middleware.common.CommonMiddleware',
            'django.contrib.messages.middleware.MessageMiddleware',
            'django.middleware.clickjacking.XFrameOptionsMiddleware',
            'corsheaders.middleware.CorsMiddleware',
        ]
      
        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',
        )
      

프로젝트에 CROS 해결

pip install django-cors-headers
# settings.py
INSTALLED_APPS = [
    ...,
    "corsheaders",
    ...,
]
MIDDLEWARE = [
    ...,
    "corsheaders.middleware.CorsMiddleware",
    ...,
]
  • 위의 항목들 전부 설치 및 추가해주기.
  • 위에 설명에서 말했듯이 특정 url만 접근 허용하게 해줄 수 있고 전부 허용하게 해줄 수 있다.
  • 해당 프로젝트에서는 CORS_ALLOWED_ORIGINS = True로 해주었다.
# settings.py
CORS_ALLOW_ALL_ORIGINS = True

댓글남기기