nginx로 https를 적용 한 후 https가 적용된 스웨거에서 API를 호출 해봤는데
mixed contents error가 떴다..
이 오류는 cors 중 하나로.. http < - > https 사이 통신에서 나오는 에러이다.
분명 https로 프록시를 잘 설정했는데 왜 그러는걸까?
swagger에서 url에 포트가 지정되지 않으면 기본으로 사용되는 url은 80포트를 사용한다, 즉 443으로 접속을 했지만 API서버는 80 포트인 http를 바라보고 있어
정작 접속은 https로 했지만 스웨거상에서 API를 호출 하면 요청 url이 http로 간다.
나는 처음에 내가 nginx 프록시 설정을 잘못한 줄 알고 ubuntu와 수많은 삽질을 했었는데
알고보니 swagger 쪽에 server를 박아주면 되는 부분이였다~
swagger 3.0 기준 해결방법이다.
@Component
public class Workaround implements WebMvcOpenApiTransformationFilter {
@Override
public OpenAPI transform(OpenApiTransformationContext<HttpServletRequest> context) {
OpenAPI openAPI = context.getSpecification();
Server localServer = new Server();
localServer.setDescription("local server");
localServer.setUrl("http://localhost:8080");
Server prodHttpsServer = new Server();
prodHttpsServer.setDescription("prod Https Server");
prodHttpsServer.setUrl("https:배포환경.com");
Server prodHttpServer = new Server();
prodHttpServer.setDescription("prod Http Server");
prodHttpServer.setUrl("ec2.url:8080");
openAPI.setServers(Arrays.asList(localServer, prodHttpsServer, prodHttpServer));
return openAPI;
}
@Override
public boolean supports(DocumentationType delimiter) {
return delimiter.equals(DocumentationType.OAS_30);
}
}
WebMvcOpenApiTransformationFilter
를 상속받아 내가 사용할 서버들을 세팅해준다.
그럼 스웨거 servers 안에 요청 url을 미리 정의한 서버로 지정해 줄 수 있다.
Request URL이 https 로 잘 가고 응답도 잘 오는것을 확인할 수 있다!!!!