"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Spring Boot: 교차 원본 문제를 해결하는 방법

Spring Boot: 교차 원본 문제를 해결하는 방법

2024-11-08에 게시됨
검색:122

Spring Boot: How to Solve Cross-Origin Issues

교차 출처 문제 설명

다음 오류 메시지가 나타날 수 있습니다.

CORS 정책에 의해 차단되었습니다. 요청한 리소스에 'Access-Control-Allow-Origin' 헤더가 없습니다.

이 오류는 Access-Control-Allow-Origin 헤더가 리소스에 없기 때문에 특정 주소에 대한 요청이 CORS 프로토콜에 의해 차단되었음을 나타냅니다.

교차 출처 문제 분석

교차 출처 문제의 근본 원인은 브라우저가 보안상의 이유로 현재 사이트 외부의 리소스에 대한 액세스를 제한한다는 것입니다.

예를 들어, 특정 페이지가 있는 http://127.0.0.1:8080/에 호스팅된 웹사이트를 생각해 보세요. 동일한 사이트의 리소스에 액세스하는 경우 제한이 없습니다. 하지만 다른 사이트(예: http://127.0.0.1:8081)의 리소스에 액세스하려고 하면 브라우저가 요청을 차단합니다.

참고: 프로토콜, 도메인, 포트는 "동일 출처" 정의의 일부로 간주됩니다.

img 및 script 태그와 같은 src 속성이 있는 요소에는 이 제한이 적용되지 않습니다.

역사적으로 프런트엔드와 백엔드가 분리되지 않았을 때에는 페이지와 요청 인터페이스가 동일한 도메인과 포트에 존재했습니다. 그러면 브라우저는 한 도메인에서 호스팅되는 페이지의 요청을 허용하여 동일한 도메인의 리소스를 요청할 수 있습니다.

예를 들어 http://127.0.0.1:8080/index.html은 http://127.0.0.1:8080/a/b/c/userLit를 자유롭게 요청할 수 있습니다.

요즘에는 프런트엔드와 백엔드가 서로 다른 애플리케이션으로 분리되어 있으므로 이는 허용되지 않으며 CORS 문제를 유발합니다.

오리진(Origin)과 크로스 오리진(Cross-Origin)이란 무엇입니까?

원본(또는 소스)은 프로토콜, 도메인, 포트 번호로 구성됩니다.

URL은 프로토콜, 도메인, 포트, 경로로 구성됩니다. 프로토콜, 도메인, 포트가 모두 동일한 경우 두 URL은 "동일 출처"로 간주됩니다. 이 세 가지 요소 중 하나라도 차이가 있으면 교차 출처 요청이 됩니다.

https://www.baidu.com/index.html:

에 대한 출처 간 비교를 고려하세요.
URL 교차 출처 이유
https://www.baidu.com/more/index.html 아니요 동일한 프로토콜, 도메인, 포트
https://map.baidu.com/ 다른 도메인
http://www.baidu.com/index.html 다른 프로토콜
https://www.baidu.com:81/index.html 다른 포트

동일 출처 정책이란 무엇입니까?

동일 출처 정책은 기본적인 브라우저 보안 기능입니다. 그렇지 않으면 브라우저의 정상적인 기능이 위험해질 수 있습니다. 웹 아키텍처는 이 정책에 크게 의존하며 브라우저는 보안을 보장하기 위해 이를 구현합니다.

동일 출처 정책에는 다음이 포함됩니다.

  1. DOM 동일 출처 정책: 서로 다른 출처 페이지의 DOM 조작을 방지합니다. 서로 다른 도메인의 iframe이 서로 액세스할 수 없는 교차 출처 iframe 시나리오에 주로 적용됩니다.
  2. XMLHttpRequest 동일 출처 정책: XHR 객체를 사용하여 다른 출처에 대한 HTTP 요청을 금지합니다.

Spring Boot의 교차 원본 문제 해결

1. CORS를 처리하기 위한 필터 만들기

프런트엔드와 백엔드가 별도로 배포되는 프로젝트에서는 CORS를 해결하는 것이 중요합니다. 쿠키는 사용자 로그인 정보를 저장하는 데 사용되며 Spring 인터셉터는 권한을 관리합니다. 인터셉터와 CORS가 잘못된 순서로 처리되어 CORS 오류가 발생하는 문제가 발생합니다.

HTTP 요청은 서블릿에 도달하기 전에 먼저 필터를 통과한 다음 인터셉터에 도달합니다. 인증을 가로채기 전에 CORS 처리가 이루어지도록 하기 위해 CORS 구성을 필터에 배치할 수 있습니다.

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
}

2. WebMvcConfigurer에서 CORS 구성

JSONP는 프런트 엔드에서 원본 간 문제를 해결할 수 있지만 RESTful 애플리케이션에서는 제한되는 GET 요청만 지원합니다. 대신 백엔드에서 CORS(Cross-Origin Resource Sharing)를 사용하여 원본 간 요청을 처리할 수 있습니다. 이 솔루션은 Spring Boot에만 고유한 것이 아니며 기존 SSM 프레임워크에서 사용되었습니다. WebMvcConfigurer 인터페이스를 구현하고 addCorsMappings 메서드를 재정의하여 이를 구성합니다.

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowCredentials(true)
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .maxAge(3600);
    }
}

3. 컨트롤러에서 CORS 구성

@RequestMapping 주석에 @CrossOrigin 주석을 추가하여 특정 컨트롤러 메서드에 대해 CORS를 활성화할 수 있습니다. 기본적으로 @CrossOrigin은 @RequestMapping에 지정된 모든 원본과 HTTP 메서드를 허용합니다.

@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

@CrossOrigin 매개변수 이해하기:

  • 매개변수가 없는 @CrossOrigin을 사용하면 모든 URL에 액세스할 수 있습니다.
  • @CrossOrigin(origins = "http://127.0.0.1:8080")은 지정된 URL에 대한 액세스를 제한합니다.
  • 이 주석은 클래스나 메서드에 사용할 수 있습니다.
  • 값 또는 출처 속성은 허용된 URL을 지정합니다.
  • maxAge는 실행 전 요청 캐시의 최대 수명을 초 단위로 나타냅니다.
  • AllowCredentials는 자격 증명(쿠키)이 허용되는지 여부를 나타냅니다. 기본값은 false입니다.
  • allowedHeaders는 허용되는 요청 헤더를 지정합니다.
  • 메소드는 허용되는 요청 메소드를 지정하며 기본값은 GET, POST, HEAD입니다.

@CrossOrigin이 작동하지 않는 이유

  1. @CrossOrigin을 지원하려면 Spring MVC 버전이 4.2 이상이어야 합니다.
  2. 잘못된 요청은 부적절한 서버 응답으로 인해 교차 출처 문제로 나타날 수 있습니다.
  3. 컨트롤러 주석 위에 @CrossOrigin을 추가하면 여전히 문제가 발생하는 경우 가능한 해결 방법 중 하나는 @RequestMapping에 HTTP 메서드를 지정하는 것입니다.

예:

@CrossOrigin
@RestController
public class PersonController {

    @RequestMapping(method = RequestMethod.GET)
    public String add() {
        // some code
    }
}
릴리스 선언문 이 기사는 https://dev.to/wilson_evan_1efa5910f8855/spring-boot-how-to-solve-cross-origin-issues-4non?1에 복제되어 있습니다.1 침해 내용이 있는 경우, [email protected]에 연락하여 삭제하시기 바랍니다. 그것
최신 튜토리얼 더>
  • Lithe의 미들웨어: 작동 방식 및 자신만의 미들웨어를 만드는 방법
    Lithe의 미들웨어: 작동 방식 및 자신만의 미들웨어를 만드는 방법
    미들웨어는 애플리케이션에 들어오는 HTTP 요청을 검사하고 필터링하기 위한 편리한 메커니즘을 제공합니다. 예를 들어 Lithe에는 사용자가 인증되었는지 확인하는 미들웨어가 포함되어 있습니다. 그렇지 않은 경우 미들웨어는 사용자를 로그인 화면으로 리디렉션합니다. 사용자가...
    프로그램 작성 2024-11-08에 게시됨
  • JavaScript에서 반복되는 요소로 배열을 만드는 방법은 무엇입니까?
    JavaScript에서 반복되는 요소로 배열을 만드는 방법은 무엇입니까?
    JavaScript의 반복 요소 배열여러 번 반복되는 동일한 요소가 있는 배열을 만드는 것은 다양한 프로그래밍 시나리오에서 필수적입니다. Python에서는 [2] * 5와 같이 목록 곱셈을 통해 이를 달성할 수 있습니다. 그러나 이 기능은 JavaScript 배열에서 ...
    프로그램 작성 2024-11-08에 게시됨
  • ## MySQL의 LIKE와 LOCATE: 성능 측면에서 왕이 되는 연산자는 무엇입니까?
    ## MySQL의 LIKE와 LOCATE: 성능 측면에서 왕이 되는 연산자는 무엇입니까?
    MySQL LIKE 대 LOCATE 성능 비교MySQL에서 데이터를 검색할 때 LIKE와 LOCATE 중 어느 연산자가 더 효율적인지 궁금할 수 있습니다. 이 문서에서는 이 두 연산자 간의 성능 차이를 살펴봅니다.일반적인 사용 시나리오에서 LIKE는 LOCATE보다 약...
    프로그램 작성 2024-11-08에 게시됨
  • PHP를 사용하여 양식 데이터로 여러 MySQL 행을 업데이트하는 방법은 무엇입니까?
    PHP를 사용하여 양식 데이터로 여러 MySQL 행을 업데이트하는 방법은 무엇입니까?
    양식 데이터로 여러 MySQL 행 업데이트웹 개발에서는 사용자가 데이터베이스의 레코드를 편집할 수 있는 양식을 갖는 것이 일반적입니다. 일반적인 시나리오는 동일한 테이블의 여러 행을 수정된 데이터로 업데이트하는 것입니다. 이는 PHP와 MySQL을 사용하여 수행할 수 ...
    프로그램 작성 2024-11-08에 게시됨
  • Go에서 문자열에 []바이트를 할당할 수 없는 이유는 무엇입니까?
    Go에서 문자열에 []바이트를 할당할 수 없는 이유는 무엇입니까?
    바이트 할당 오류 이해: []바이트를 문자열에 할당할 수 없습니다.폴더 내의 파일을 읽으려고 시도하는 중에 오류가 발생했습니다. 파일의 내용을 읽으려고 할 때 "다중 할당에서 []바이트를 z(유형 문자열)에 할당할 수 없습니다." 이 오류의 원인을 자...
    프로그램 작성 2024-11-08에 게시됨
  • React 및 Typescript를 사용하여 사용자 정의 테이블 구성 요소를 만드는 방법(2부)
    React 및 Typescript를 사용하여 사용자 정의 테이블 구성 요소를 만드는 방법(2부)
    소개 예! ? 두 부분으로 구성된 이 시리즈의 마지막 부분에 도달했습니다! 아직 파트 1을 확인하지 않으셨다면 여기서 잠시 멈추고 먼저 파트 1을 살펴보세요. 걱정하지 마세요. 당신이 돌아올 때까지 기다리겠습니다! ? 1부에서는 CustomTable 구...
    프로그램 작성 2024-11-08에 게시됨
  • TypeScript 및 ioredis를 사용하여 Node.js에서 고성능 캐시 관리자 구축
    TypeScript 및 ioredis를 사용하여 Node.js에서 고성능 캐시 관리자 구축
    ioredis에 구축된 다용도의 사용하기 쉬운 캐시 관리자로 Node.js 앱 성능을 향상하세요. 캐싱을 단순화하고, 효율성을 최적화하고, 운영을 간소화하세요. 저는 사용 편의성과 성능에 중점을 두고 필요에 따라 ioredis를 기반으로 구축된 클래스를 개발했습니다. ...
    프로그램 작성 2024-11-08에 게시됨
  • 슈퍼클래스 참조 및 하위클래스 객체
    슈퍼클래스 참조 및 하위클래스 객체
    자바는 강력한 형식의 언어입니다. 기본 유형에는 표준 변환 및 자동 승격이 적용됩니다. 유형 호환성은 엄격하게 적용됩니다. 일반적으로 한 클래스의 참조 변수는 다른 클래스의 객체를 참조할 수 없습니다. 클래스 X와 Y가 구조적으로 동일하더라도 유형이 다르기 때문에 X...
    프로그램 작성 2024-11-08에 게시됨
  • Flexbox에서 flex-grow와 width는 어떻게 다릅니까?
    Flexbox에서 flex-grow와 width는 어떻게 다릅니까?
    Flexbox에서 flex-grow와 너비의 차이점Flexbox는 요소 간에 공간을 분배하는 두 가지 기본 방법인 flex-grow와 너비를 제공합니다. 효과적인 Flexbox 사용을 위해서는 이러한 속성 간의 차이점을 이해하는 것이 중요합니다.Flex-grow 대 너...
    프로그램 작성 2024-11-08에 게시됨
  • 양식 레이블과 입력을 같은 줄에 수평으로 정렬하는 방법은 무엇입니까?
    양식 레이블과 입력을 같은 줄에 수평으로 정렬하는 방법은 무엇입니까?
    양식 레이블의 수평 배치 및 동일한 행에 입력 달성웹 개발에서 양식의 미학은 사용자 경험에 매우 중요합니다. 레이블과 입력 필드를 같은 줄에 배열하면 양식의 가독성과 유용성을 향상시킬 수 있습니다. 이 문서에서는 길이에 관계없이 입력 요소를 해당 레이블과 원활하게 정렬...
    프로그램 작성 2024-11-08에 게시됨
  • 재귀 -1
    재귀 -1
    소개 1 함수가 자신을 호출하는 과정을 재귀라고 하며 해당 함수를 재귀 함수라고 합니다. 컴퓨터 프로그래밍은 수학의 기본적인 응용이므로 먼저 재귀 뒤에 숨어 있는 수학적 추론을 이해하려고 노력합니다. 일반적으로 우리 모두는 함수의 개념을 알고 있습니다...
    프로그램 작성 2024-11-08에 게시됨
  • Go API에 로깅 및 오류 처리 미들웨어 추가
    Go API에 로깅 및 오류 처리 미들웨어 추가
    빠른 참고: JWT 인증에 대한 이전 게시물을 확인하고 일부 렌더링 문제를 발견했다면 이제 해당 문제가 해결되었습니다! 이 예제는 해당 튜토리얼을 기반으로 구축되었으므로 다시 한 번 살펴보시기 바랍니다. :) 자 여러분, Go API를 실행하고 JWT 인증을 추가했으며...
    프로그램 작성 2024-11-08에 게시됨
  • Tensorflow 음악 예측
    Tensorflow 음악 예측
    이 글에서는 텐서플로우를 사용하여 음악 스타일을 예측하는 방법을 보여줍니다. 제 예에서는 테크노와 클래식 음악을 비교합니다. 내 Github에서 코드를 찾을 수 있습니다. https://github.com/victordalet/sound_to_partition ...
    프로그램 작성 2024-11-08에 게시됨
  • useEffect 후크 설명
    useEffect 후크 설명
    useEffect 후크는 React의 기본 부분으로, 기능적 구성 요소에서 부작용을 수행할 수 있도록 해줍니다. 자세한 내용은 다음과 같습니다. useEffect란 무엇인가요? useEffect 후크를 사용하면 구성 요소에서 데이터 가져오기, 구독 또는 ...
    프로그램 작성 2024-11-08에 게시됨
  • CSS 파일 경로의 버전 번호가 어떻게 웹사이트 성능을 향상시킬 수 있습니까?
    CSS 파일 경로의 버전 번호가 어떻게 웹사이트 성능을 향상시킬 수 있습니까?
    CSS 파일 경로의 버전 번호로 캐시 무효화웹 개발에서 사용자 경험을 향상하려면 CSS 파일과 같은 리소스를 효율적으로 로드해야 하는 경우가 많습니다. . 사용된 한 가지 영리한 기술은 특정 웹사이트에서 볼 수 있듯이 CSS 파일 경로에 버전 번호를 추가하는 것입니다:...
    프로그램 작성 2024-11-08에 게시됨

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3