Spring

[Spring / Swagger] Cors , Fail to Fetch 해결방법

공부하고 기억하는 공간 2025. 1. 24. 12:04
728x90
반응형
SMALL

현재 상황은 다음과 같다.

1. 서버를 배포함

2. 무료 도메인 duckdns를 사용하여 도메인 서버에 내 주소를 등록

3. Nginx를 사용해서 SSL 통신 적용, https 통신

4. Security에 Cors설정을 해둔 상황

 

Postman이나 클라이언트단에서 요청을 보내면 정상적으로 데이터를 수신할 수 있었으나 내가 Swagger에서 직접 요청을 보내면 위와 같은 에러가 뜨는 상황이었다. 

원인은 Swagger에 설정하지 않은 내 도메인주소로 인해 일치하지 않은 Origin 정책이 발생한다는 것이었다.

현재는 상대 경로 설정을 통해 해결할 수 있었지만 그 이전에는 http://[도메인주소]로 지정이 되어 있었고, 내 실제 도메인은 https://[도메인주소]였기에 정상적인 통신이 불가능했다. 이를 해결하기 위한 방법으로는 몇 가지가 있으나 난 이 방법을 통해 해결했다.

 

전체 코드

 

package com.mentit.mento.global.swagger;

import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.servers.Server;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SwaggerConfig {

    @Bean
    public OpenAPI openAPI() {
        License license = new License();
        license.setName("dotorit");

        Info info = new Info()
                .title("\"dotorit API Document\"")
                .description("mentoApp API 문서 입니다.")
                .version("v0.0.1")
                .license(license);

        String jwt = "JWT";
        SecurityRequirement securityRequirement = new SecurityRequirement().addList(jwt); // 헤더에 토큰 포함
        Components components = new Components().addSecuritySchemes(jwt, new SecurityScheme()
                .name(jwt)
                .type(SecurityScheme.Type.HTTP)
                .scheme("bearer")
                .bearerFormat("JWT"));

        return new OpenAPI()
                .info(info)
                .addSecurityItem(securityRequirement)
                .addServersItem(new Server().url("/"))
                .components(components)
                .addSecurityItem(new SecurityRequirement().addList(jwt));

    }

}

 

핵심 코드

.addServersItem으로 상대 경로 "/"를 설정해주면 현재 서버 주소를 기반으로 요청을 보내기에 도메인과 프로토콜 포트등이 일치하기 때문에 CORS에러가 발생하지 않는다.

return new OpenAPI()
        .info(info)
        .addSecurityItem(securityRequirement)
        .addServersItem(new Server().url("/"))
        .components(components)
        .addSecurityItem(new SecurityRequirement().addList(jwt));

 

 

728x90
반응형
SMALL