티스토리 뷰

728x90
반응형

목차

     

     

     

    CORS

     

    교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 추가 HTTP 헤더를 사용하여

     

    웹 애플리케이션이 다른 출처의 선택한 리소스에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 메커니즘이다.

     

    여기서 다른 출처란 프로토콜, 도메인, 포트가 다른 곳을 가리킨다.

     

    계속해서 CORS 정책을 지킨 요청이란 대상 리소스에서 올바른 CORS 헤더가 담긴 응답을 받는 요청이라 할 수 있다.

     

    참고로 교차 출처 요청이 발생할 시 브라우저는 요청 헤더에 Origin을 담아서 보낸다.

     

    또한 올바른 CORS 헤더란 보통 아래와 같은 "Access-Control-Allow-Origin:" 헤더를 말하며

    HTTP/1.1 200 OK
    Date: Mon, 01 Dec 2008 00:23:53 GMT
    Server: Apache/2
    Access-Control-Allow-Origin: *
    Keep-Alive: timeout=2, max=100
    Connection: Keep-Alive
    Transfer-Encoding: chunked
    Content-Type: application/xml
    
    […XML Data…]

    브라우저는 클라이언트와 서버 사이에서 Origin 값과 Access-Control-Allow-Origin 헤더를 확인해 이후의 동작을 결정한다.

     

    이어서 CORS는 크게 세 가지 시나리오에 따라 동작하는데, 이는 요약하면 아래와 같다.

     

    • Preflighted Request - OPTIONS 메서드를 사용한 예비 요청
    • Simple Request - 예비 요청 없이 바로 메서드 전송. 몇 가지 제약조건이 있다.

      • 메서드는 GET, POST, HEAD 중 하나
      • 헤더는 Accept, Accept-Language, Content-Language, Content-Type 만 허용
      • Content-Type 헤더는 다음의 값들만 허용

        • application/x-www-form-urlencoded
        • multipart/form-data
        • text/plain
    • Requests with Credentials - 미리 인증된 요청을 사용. credentials 옵션을 사용한다. 다음의 세 가지가 있다.

      • same-origin(default) - 동일 출처 간 요청에만 인증 정보를 담을 수 있다.
      • include - 모든 요청에 인증 정보를 담을 수 있다.
      • omit -  어떤 요청에도 인증 정보를 담지 않는다.

     

    CORS on Spring

     

    스프링을 사용해 서비스를 구성할 때 CORS 설정을 하는 방법은 크게 세 가지 정도가 있다.

     

    API Endpoint

     

    해당 요청을 받는 메서드나 클래스 위에 @CrossOrigin 애너테이션을 달고 허용할 도메인을 설정하는 방식이다.

     

    단독으로도 물론 설정이 가능하지만, 아래의 설정과 결합해

     

    간단하고, 섬세한 설정을 API별로 구성할 수 있다는 장점이 있다.

     

    Spring MVC

     

    WebMvcConfigurer를 상속하는 설정 클래스를 만들어 그 안의 addCorsMapping를 오버라이딩 하는 방식이다.

     

    허용 도메인, 메서드, 헤더, Credential설정 등을 전역적으로 할 수 있다. 

     

    구조상 시큐리티 필터가 먼저 처리되지만, 해당 방법을 구현해놓으면 시큐리티 필터가 알아서 탐지해서 활용한다.

     

    Spring Security

     

    시큐리티 설정파일의 필터 체인 안에 cors() 메서드를 끼워 넣는 방식이다.

     

    마찬가지로 허용 도메인, 헤더, Credential 설정 등을 전역적으로 할 수 있다.

     

    스프링 시큐리티 필터가 사용자와 가장 가까운 곳에서 요청을 처리하기 때문에

     

    두 프레임워크를 함께 사용한다면 이쪽에서 처리하는 것이 합리적으로 보인다.

     

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/09   »
    1 2 3 4 5 6 7
    8 9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30
    글 보관함