"Where are you from?"; CORS

oswaldeff·2021년 11월 13일
0
post-thumbnail

글을 쓰기로 마음먹고 안쓴지도 너무 오래됐지만 코로나 때문에 해외여행을 안간지도 너무 오래됐다.

의식의 흐름대로 쓴것마냥(사실 어느정도는 맞지만...🙄), 뜬금없이 해외여행 얘기에 의아할 수 있지만 CORS(Cross-Origin Resource Sharing)는 마치 입국심사 같은 개념이라고 생각한다.

📗 CORS

좀더 명확히 얘기하자면 프로토콜 or 도메인 or 포트가 다른 프론트와의 협업에서 API통신을 할때 이 CORS를 통해 서버를 방문(서버리소스 사용)을 할 수 있는지에 대한 권한 여부를 결정하는 것이다.

...더 보기

url이 "https://example.com" 일때,
프로토콜은 https
도메인은 example.com
포트는 https의 경우 443port로 서버에서 리버스 프록시 설정을 통해 사용한다.

다시 CORS에 대해 얘기하자면 SOP도 짚고 넘어가야 하는데, SOP는 RFC6465에서 나온 보안정책으로

"Network resources can also opt into letting other origins read their information, for example, using Cross-Origin Resource Sharing."

						-RFC6465(Request for Comments)

예외조항 이외의 접근에서는 출처가 같아야 리소스를 공유할 수 있다는 내용이다.

이때 CORS가 위의 예외조항에 해당된다.

💾 install

장고(pip, 가상환경인 경우 env or conda)에서는

pipenv install django-cors-headers

를 통해 서드파티 패키지를 설치해야 한다.

📃 settings.py

설치 완료 후 패키지의 사용을 위해

INSTALLED_APPS = [
...
	'corsheaders'
]

MIDDLEWARE = [
...
	'corsheaders.middleware.CorsMiddleware',

]

앱과 미들웨어에 패키지를 설정해준다.

만약 프론트에서 특정자원(DB or function)을 서버에 요청한다면,
preflight를 통해 CRUD 메서드를 확인하게 된다.
네트워크 탭을 통해 확인한다면 아래와 같다.

로그인 리소스 요청 이전에 preflight를 통해 메소드에 대해 검증한다.

preflight의 헤더를 열어보면 위와 같다.

이때, access-control-allow-credentials와 access-control-allow-headers, allow adress(CORS_ALLOWED_ORIGINS)는 직접 설정해야 한다.

# cors setting
CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = ['https://example.com']

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',
'credentials',
'Access-Control-Allow-Origin',
'Access-Control-Allow-Credentials',
'Access-Control-Request-Method',
'Access-Control-Request-Headers',
'Cookies',
]

CORS_ORIGIN_ALLOW_ALL이 True인 경우 모든 요청에 대해 자원을 사용가능하겠다는 것이기 때문에
보통 개발환경에서만 사용하는 것으로 알고
핵심내용은 CORS_ALLOW_CREDENTIALS는 True, CORS_ORIGIN_ALLOW_ALL는 False로 설정하여 CORS_ALLOWED_ORIGINS에 약속된 특정 프론트의 url(ex: https://example.com)을 리스팅함으로서 서버의 자원을 제한적인 url에서만 사용할 수 있게 해준다는 것이다.

0개의 댓글