카테고리 없음

cors 이해하기

또또니엘 2024. 1. 14. 23:29

💬 이번 새로운 프로젝트를 진행하기 이전 로그인 방식은 로그인 성공 시 response body에 token을 넘겨주고 프론트엔트에서 넘겨받은 토큰을 cookie에 저장하는 방식을 사용하였다. 그러나, 이번 프로젝트는 로그인 성공 시 response에 cookie를 set 해서 전달하는 방식을 선택하였다. 

문제는 여기서 시작되었는데 프론트엔드가 response에 쿠키가 있는 걸로 확인이 되었지만 다음 요청 시 request에 쿠키가 담겨있지 않았다. 문제를 찾아보던 중 cors와 관계있는 것을 알고 그동안 문제 해결만을 위해 코드에 옵션을 선택했지만 이번 계기로 cors를 정확하게 이해하고자 한다. 


CORS (Cross-origin resource sharing) 

[위키백과] 교차 출처 리소스 공유(Cross-origin resource sharing, CORS), 교차 출처 자원 공유 웹 페이지 상의 제한된 리소스를 최초 자원이 서비스된 도메인 밖의 다른 도메인으로부터 요청할 수 있게 허용하는 구조이다.

💬 필자가 이해하기로는 교차 출처, 서로 다른 출처의 리소스 공유를 말하는 듯했다. 그렇다면 cross-oring(교차 출처) 여기서 origin은 무엇을 의미할까?


Origin(출처)

아래 이미지와 같이 Protocal, Host, Port 3가지를 포함한 형태이다

 

💬 CORS를 찾다보면 많은 곳에서 같이 나타나는 단어가 SOP이다.

CORS를 공부하기위해 SOP를 공부해야할 필요성이 있다.


Same-Origin Policy (SOP)

Same-Origin Policy는 기본적으로 웹 보안을 강화하기 위해 설계되었으며, 다른 출처의 리소스와의 상호 작용을 제한함으로써 악의적인 공격이나 정보 유출을 방지한다. 이를 통해 한 웹 페이지가 다른 도메인의 리소스에 대해 제한 없이 접근하거나 조작하는 것을 방지할 수 있다.


💬 제목에서도 나타나듯 같은 출처에 대한 정책을 말한다. 다시 말해 출처가 다르면 의심해 볼 필요가 있다!

 

CORS 기본 동작 과정

 

1.  클라이언트에서 HTTP 요청 헤더이 Origin을 담아서 전달
2. 서버는 이 요청에 대해 응답헤더에 Access-Control-Allow-Origin을 담아서 클라이언트로 전달 

    *  Access-Control-Allow-Origin : 요청 가능한 Origin을 나타낸다. 

    * 응답 Access-Control-Allow-Origin으로 와일드카드(*) - 전체허용, 또는 특정 Origin을 지정할 수 있다. 

3.  클라이언트에서 Origin과 서버가 보내준 Access-Control-Allow-Origin을 비교

🚨 기존 CORS 세팅
allowedOrigins("*") // 허용할 출처를 명시, 전체 허용

allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS") // 허용할 HTTP METHOD

allowedHeaders("*") // 어떤 헤더들을 허용할 것인지

maxAge(3600) // preflight 결과를 캐시에 저장할 시간

🛠 수정 후 CORS 세팅

allowCredentials(true) 
allowedOrigins("http://localhost:3000", "https://localhost:3000")

allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS")

allowedHeaders("*"

maxAge(3600

 

💎 해결

1️⃣  allowCredientials(true) : cross origin의 요청 시 cookie를 담아 요청하는 것을 허용한다.
2️⃣ allowCredientials(true) 설정 시 allowedOrigins("*") 이와같이 allowedOrigins에 와일드 카드를 정책상 허용하지 않는다.

, 따라서 특정 도메인을 설정해 주었다.
3️⃣ 클라이언트 또한 credientials 옵션을 true로 설정해야 서로다른 도메인에 request요청 시  cookie를 담을 수 있다.

 

참조 

 1️⃣  Same-Origin Policy (SOP) : https://codingmoon.io/posts/interview-questions/describe-same-origin-policy/

 2️⃣  CORS 기본 동작 과정 : https://bombo96.tistory.com/63