• SOP (Same Origin Policy) 보안 정책이란?
    • 대부분의 웹 브라우저에서 Same Origin Policy 를 준수
    • 내가 접속한 사이트(Origin)에서 다른 Origin에 요청한 것을 기본적으로 제한하여 해킹 공격 방어
    • 다른 Origin에서 온 HTML 특정 Tag (img,script,link,iframe 등) 는 임베딩 할 수 있게 허용


  • CORS (Cross-Origin Resource Sharing, 교차 출처 리소스 공유) 란
    • 교차 호출이 해킹에 활용된다는 보안 취약점을 해결하기 위해 등장 (브라우저 - 웹 서버 간)
    • 브라우저에서 보안적인 이유로 Cross-Origin HTTP 요청을 제한
      • 호출 발생 시점부터 Origin을 체크하도록 보안 강화
    • 이러한 호출을 위해서는 서버 측의 동의가 필요
      • HTTP header 를 사용한 메커니즘
      • 다른 출처(서버 측)의 응답에 올바른 CORS 헤더가 포함되지 않는 한 해당 API를 사용하는 웹 애플리케이션은 애플리케이션이 로드 된 동일한 출처의 리소스만 요청할 수 있다


  • Origin 이란?
    • [Protocol]://[HOST IP 주소 또는 도메인 명]:[포트번호]


  • CORS 에러가 발생하는 원인
    • 대부분의 CORS Error 는 Origin의 불일치에서 발생
      • 프로토콜 -> HTTP 또는 HTTPS 로 프로토콜을 일치
      • 도메인 -> 도메인을 일치 시킨다. (IP 또는 도메인으로)
      • 포트번호 -> 포트번호를 일치 시킨다.
    • CORS 기능을 지원하는 서버 측 설정
      • 허용 된 헤더 가 아닌 경우
      • 허용 된 메소드가 아닌 경우
      • 허용 된 Origin이 아닌 경우


  • 브라우저의 리소스 요청 방식 (Preflight request vs Simple request)
    • Preflight request 란
      • CORS 이슈의 어떤 조건을 만족하는 경우 해당 리소스에 접근하기 위한 사전 요청
      • Simple request 와 다르게 '사전검사'를 한 후 브라우저에서 실제 요청을 보낸다.
      • Simple request 의 조건이 충족되지 않는 경우의 요청일 때 Preflight request를 보낸다.
      • 해당 요청은 HTTP 메소드의 OPTIONS를 이용하여 이루어진다.
Note. Preflight request 에서 Content-type 이 아래 값이 아닐 경우 Supported Header에 열어 주어야 함 (23.02.21 - SKBS Issue)



  • 요청 방식에 따른 CORS 에러 해결 방법
    • Simple Request 의 경우
      • 브라우저가 받은 요청이 어느 Origin에서 시작했는지 헤더 추가
      • 서버 측 응답 헤더 Access-Control-Allow-Origin 에 요청 측 Origin 값을 넣어 준다.
    • Preflight Request 의 경우
      • 서버 측 응답 헤더에서 Access-Control-Allow-* 로 시작하는 헤더들의 설정이 필요 (HTTP 응답헤더 참고)
        • "Access-Control-Allow-Origin": 허용하는 Origin 나열
        • "Access-Control-Allow-Headers" : 허용하는 헤더 나열
        • "Access-Control-Allow-Methods": 허용하는 HTTP Method 나열
        • "Access-Control-Expose-Headers" : 브라우저가 접근할 수 있는 서버의 헤더 (화이트 리스트)
        • "Access-Control-Max-Age" : Preflight request 요청 결과를 캐싱하는 시간
        • "Access-Control-Allow-Credentials" : 자격 증명(쿠키, Authorization 헤더, TLS 클라이언트 인증서) 모드의 경우 JavaScript 코드에 응답을 노출할지 여부를 브라우저에 알려준다 (True일 때)






  • webMethods 의 CORS 기능
    • Extended Settings 에서 CORS 정책 지원
    • Response Processing Policy 에서 CORS 정책을 지원 (API Gateway의 API 단위 CORS 정책 설정)


    • watt.server.cors.enabled = true (API Gateway 의 CORS 기능 켜기)
    • watt.server.cors.exposedHeaders = value1, value2 ... (API Gateway 에서 Client 브라우저 쪽으로 Expose 할 헤더 목록)
      • Access-Control-Allow-Origin
      • Access-Control-Allow-Headers
      • Access-Control-Allow-Methods
      • Access-Control-Expose-Headers
      • Access-Control-Max-Age
      • Access-Control-Allow-Credentials
    • watt.server.cors.host = : 로컬네임서버나 DNS 서버를 사용하는 경우 허용 Origin 설정인 듯 해보이며, 테스트 필요
    • watt.server.cors.maxAge = Preflight Request 의 요청 결과 캐싱 시간 설정 (default = -1 = disable 인 듯 해보임)
    • watt.server.cors.supportsCredentials = true , Access-Control-Allow-Credentials 헤더 지원 여부 설정
    • watt.server.cors.supportedHeaders = header1,header2,header3... CORS 요청을 허용하는 요청 헤더를 지정. Preflight Request에 응답할 때 이 헤더를 Access-Control-Allow-Headers 응답 헤더 값으로 포함 (x-Gateway-APIKey 와 같은 Custom Header 설정에 사용)
    • watt.server.cors.supportedMethods = GET,POST,PUT,PATCH,DELETE, "OPTIONS", 허용 HTTP 메소드 설정 Preflight request 는 OPTIONS 메소드를 사용하기에 설정하지 않으면 403 에러 발생


  • API Policy 설정 방법 예시 (Response Processing > CORS 설정)
    • Allowed Origins -> * (모두 허용)
    • Allow Headers -> x-gateway-apikey (API Gateway의 Default API Key 헤더)


  • 테스트 결론
    • Extended Settings 는 Global CORS 설정
      • host 설정은 테스트 필요
    • API Policy의 CORS 정책은 API 단위 설정







  • API Gateway CORS 설정 예시
    • watt.server.cors.allowedOrigins
      • 호출에 대한 특정 Origin 허용 여부 설정으로 * Allow All 설정
    • watt.server.cors.supportedHeaders
      • 호출에 대한 지원 헤더 설정 (Access-Control-Allow-Origin 헤더와, 인증을 위한 API Key 헤더를 요청 받을 것이기에 Supported Header 에 설정)
      • Access-Control-Allow-Origin, x-Gateway-APIKey 또는 apiKey.Header에 설정 된 값
    • watt.server.cors.enabled
      • CORS를 허용할 것인지에 대한 설정 (true로 설정, default : false)





  • SK Bioscience AWS 아키텍처 및 의문점

=> HTTPS -> HTTP 호출 시에는 CORS 에러가 발생하지 않는 듯 함