스프링 공부/게시판 프로젝트 만들기

[스프링] 1. CORS 설정해주기

장아장 2022. 12. 28. 15:46

일단 프로젝트를 만들 때, 버전 2.7.0에 자바는 버전 11로 맞추어주었다. 주변에서 듣기로는 제일 실무에서 많이 쓰인다고 들었기 때문이다(소문)

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.projectlombok:lombok:1.18.22'
implementation 'mysql:mysql-connector-java'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'mysql:mysql-connector-java'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
// JUnit5
testImplementation("org.junit.platform:junit-platform-launcher:1.5.2")
testImplementation("org.junit.jupiter:junit-jupiter:5.5.2")
// jwt
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.2'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.2'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.2'
// OAuth2
implementation group: 'com.auth0' , name: 'java-jwt', version: '3.10.3'
// Swagger
implementation 'io.springfox:springfox-boot-starter:3.0.0'
// validation
implementation 'org.springframework.boot:spring-boot-starter-validation'
의존성은 이렇게 주입한 상태이다. 기본적으로 Json Web Token(후에 설명할)을 위한 의존성, Spring Security를 이용한 회원을 만들기 위한 Spring Security, OAuth2(후에 설명할 것), Swagger(바로 다음 단계) 등등 후에 어떤 기능인지와 어떻게 만들었는지 같이 정리해보려고 한다. 
 

이후 CORS를 설정해두었다. 

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter(){
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedMethod("*");
        config.addAllowedHeader("*");
        source.registerCorsConfiguration("/api/**", config);
        return new CorsFilter(source);
    }
}

@Configuration으로 설정 클래스임을 명시하고, 내부에 Spring Bean에 들어갈 객체를 만들어주었다. 

cors에 대한 필터를 설정해주었다. 

Credentials 처리방식을 설정해준다. 기본적으로 요청에 대한 응답으로 json타입이 나간다. 이를 Javascript에서 처리할 수 있게 해준다. 이를 통해 프론트엔드에서 처리된 응답을 뷰에 맞게 설정해줄 수 있다. 
Origin 출처, 보낸 곳의 IP + Port를 명시한다. addAllowOrigin("*")는 모든 출처를 허용한다는 뜻이다. 
Method 방식, Get/Post/Update/Delete등의 요청을 허용하는 방식을 설정한다. "*"는 모든 방식을 허용한다는 뜻이다.
Header  


이런 방식으로 존재하는 헤더에 대해, 허용하는 헤더의 타입을 설정할 수 있다. "*"는 모든 헤더를 허용한다는 뜻이다. 

이렇게 만들어진 config(설정값)이 존재할 때, 이를 내 서버의 Cross-Origin-Resource-Sharing(쉽게 말하면 다른 서버의 리소스 공유)설정에 등록해준다. 이렇게 적용된 내 서버의 외부 서버 리소스 공유 방식의 설정을 반환하게 설정해준다. 

 

그러면 뭐가 변한 걸까?

원래는 한 서버는 다른 ip의 서버어 리소스를 공유하지 못하게 설정해둔다. 

스프링의 SOP(단일 Origin 규칙)에 따라 다른 서버에 접근할 수 없지만, Cors를 통해 접근을 가능하게 해준다. 

즉, Cors가 없다면 우리가 요즘 흔하게 보는

이런, 다른 계정을 통한 로그인을 할 수 없다. 

내가 만든 서버는 SOP로 인해 외부 IP의 계정으로 로그인할 수 없으니까.