ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [WEB]CORS
    CS/WEB 2021. 7. 13. 23:51

    📝 CORS


    ✨ 해당 글은 아래 [10분 테코톡]을 듣고 작성했습니다.✨

     

     


     

     

    📌 SOP란?

     

    🔎 먼저 SOP에 대해 알아보자.


    - 다른 리소스를 사용하는 것을 제한하는 보안 방식을 말한다.

     

    🔎 O에 해당하는 Origin이 무엇인지 알아보자.

    - URL은 다음과 같이 이루어져 있다.

    • 이때 URL의 Protocol, Host, Port를 통해 같은 출처인지 확인할 수 있다.
    • 브라우저 입장에서 Host 비교시 String으로 비교를 한다. (localhost와 127.0.0.1은 다른 Host로 판단된다.)

     

     

    🔎 SOP는 언제 사용할까?


    - 동일한 출처의 리소스만 허용한다.

    • A출처에서 온 리소스와 B출처에서 온 리소스를 상호작용 하지 못하도록한다.
    • 사용자 모르게 해커가 접근하여 서버로 요청을 보내고, 해당 요청에 대한 응답을 해커의 서버로 보내 정보가 유출될 수 있는 상황을 막을 수 있다.



    📌 CORS

     

    🔎 다른 출처의 리소스가 필요하면 어떻게 할 수 있을까?


    - Cross-Origin-Resource-Sharing을 사용한다. 다음과 같은 세 가지 접근제어 시나리오를 따른다.

    • 프리플라이트 요청(Preflight Request)
    • 단순 요청(Simple Request)
    • 인증 정보 포함 요청(Credentialed Request)

     


    🔎 프리플라이트 요청(Preflight Request)이란 무엇인지 알아보자.


    - 본 요청을 보내기 전에 사전에 물어본다.

    • 클라이언트는 서버에 사전 요청을 보내 확인하고, 서버는 해당 사전 요청에 응답을 한다.
    • 서버가 사전 요청을 허용했다면 다시 본 요청을 보낸다.
    • 총 2번의 통신을 주고 받는다.


    - 프리플라이트 요청 포맷을 알아보자.

    • Origin: 요청 출처
    • Access-Control-Request-Method: 실제 요청 메소드
    • Access-Control-Request-Headers: 실제 요청의 추가 헤더


    - 프리플라이트 응답 포맷을 알아보자.

    • Access-Control-Allow-Origin: 서버 측 허가 출처
    • Access-Control-Allow-Method: 서버 측 허가 헤드
    • Access-Control-Allow-Headers: 서버 측 허가 헤더
    • Access-Control-Max-Age: 프리플라이트 응답 캐시 시간


    - 프리플라이트 응답 메시지가 가져야할 특징이 있다.

    • 응답 코드는 200대여야 한다.
    • 응답 body는 비어있어야 한다.

     

     

    🔎 단순 요청(Simple Request)란 무엇인지 알아보자.


    - 프리플라이트 없이 바로 요청을 보낸다.

    • GET, POST, HEAD 메소드만 가능하다.
    • application/x-www-..., multipart/form-data, text/plan Content-type만 가능하다.
    • Accept, Accept-Language, Content-Language, Content-type 헤더만 가능하다.

     

     

    🔎 인증 정보 포함 요청(Credential Request)을 알아보자.


    - 인증 관련 헤더(쿠키, JWT 등)을 포함할 때 사용하는 요청이다.

    • 클라이언트 - crudentials : include
    • 서버 - Access-Control-Allow-Credential : true (이때는 Access-Control-Allow-Origin에 모든 요청을 허용하면 안된다.)

     

     

    🔎 프리플라이트는 왜 필요한 걸까?


    - CORS 이전에 만들어진 SOP 서버를 보호하기 위함이다.

    • CORS 이전에는 SOP만 가능했다.
    • CORS가 등장했지만 기존의 SOP는 CORS에 대한 보안 방식을 확인할 수 있는 메커니즘이 존재하지 않는다.
    • 보안적 문제가 생길 수 있으므로 프리플라이트를 통해 서버가 CORS를 인식하고 처리할 수 있는지 먼저 확인하여 CORS를 하지 못하는 서버를 보호할 수 있다.



    📌 CORS를 해결하는 방법!

     

    🔎 프론트 프록시 서버를 설정해 준다.


    - 프론트 서버에서 백엔드 서버로 요청을 보낼 때 target의 URL을 변경한다.

    • CORS는 브라우저에서 발생하므로 프론트 서버와 브라우저는 origin과 target을 동일하게 설정해 주고, 프론와 백엔드 통신에서 URL을 변경해 준다.

     

     

    🔎 직접 헤더에 설정해 준다.


    - 직접 헤더에 설정을 추가해 줄 수 있다.

     

    🔎 프레임워크를 사용한다.


    - 스프링부트의 경우 WebMvcConfigurer를 implements한 설정 파일을 추가하여 Allow-Origin을 추가해 줄 수 있다.

    'CS > WEB' 카테고리의 다른 글

    [WEB] Restful API  (0) 2021.08.09
    [WEB]웹 서버 VS WAS  (0) 2021.07.19
    WEB - AJAX  (0) 2021.02.26
    WEB - WAS  (0) 2021.02.20
    WEB - SPA  (0) 2021.02.20

    댓글

Designed by Tistory.