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 |