본문 바로가기

spring

cors 에러

1. cors(Cross-origin resource sharing)란?

  • 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제
  • 즉, 다른 출처의 resource(url)를 공유할 수 있도록 설정하는 것을 의미

2. cors 에러

  • cors 설정을 해주지 않으면 cors 에러가 발생해 api 호출이 불가능하게 된다.

3. cors 에러 발생 이유

  • 프론트와 back의 코드가 각각 다른 서버에서 운영되기 때문에 보통 발생한다.
  • front와 back이 같은 domain에서 온다면 cors 에러 처리를 따로 하지 않아도 된다.

4. cors back-end 해결

import org.springframework.stereotype.Component
import java.io.IOException
import javax.servlet.*
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

@Component
class WebConfig : Filter {
    @Throws(IOException::class, ServletException::class)
    override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
        val req = request as HttpServletRequest
        val res = response as HttpServletResponse
        res.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"))
        res.setHeader("Access-Control-Allow-Credentials", "true")
        res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, PATCH")
        res.setHeader("Access-Control-Max-Age", "3600")
        res.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me")
        chain.doFilter(request, response)
    }
}

 

4. cors test

import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.ActiveProfiles
import org.springframework.transaction.annotation.Transactional


@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CLASS)
@ActiveProfiles("test")
@Transactional
@SpringBootTest
@AutoConfigureMockMvc
annotation class MockMvcTest
import com.caring.home.MockMvcTest
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status

@MockMvcTest
class CorsTest {
    @Autowired
    lateinit var mockMvc: MockMvc

    @DisplayName("cors test")
    @Test
    @Throws(Exception::class)
    fun corsTest() {
        mockMvc.perform(MockMvcRequestBuilders.options("/")
            .header("Access-Control-Request-Method", "GET")
            .header("Origin", "https://test.domain.co.kr"))
            .andExpect(status().isOk)
    }
}

 

 

references

1) cors

https://developer.mozilla.org/ko/docs/Web/HTTP/CORS

https://dev-pengun.tistory.com/entry/Spring-Boot-CORS-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

 

2) cors test

https://stackoverflow.com/questions/42588692/testing-cors-in-springboottest

 

 

 

 

 

 

 

'spring' 카테고리의 다른 글

backend logging 시스템 구축  (0) 2023.02.16
Thymeleaf 작동 구조  (0) 2022.09.06
slf4j  (0) 2022.06.18
배포방식  (0) 2021.12.17
http와 https 둘 다 운영하는 방법  (0) 2021.12.17