Spring & Spring Boot

[Spring Boot] CORS의 기본 개념

사과씨앗 2024. 6. 16. 22:35
728x90
반응형

Cross-Origin Resource Sharing(CORS)은 웹 브라우저에서 다른 도메인 간에 리소스를 요청하고 제공하는 방법을 정의하는 표준입니다. 보안상의 이유로, 브라우저는 스크립트가 원본(origin)을 초과하여 다른 도메인의 리소스에 접근하는 것을 제한합니다. 예를 들어, 한 도메인에서 로드된 웹 페이지가 다른 도메인에 있는 API에 요청을 보내고 데이터를 받아오는 경우가 이에 해당합니다.

 

CORS의 기본 개념

  1. Same-Origin Policy (동일 출처 정책)
    • 동일 출처 정책은 웹 브라우저가 처음 요청을 보낸 출처와 동일한 출처로부터만 리소스를 가져올 수 있도록 하는 보안 정책입니다.
    • 출처는 세 부분으로 구성됩니다: 프로토콜(예: http, https), 호스트(예: example.com), 포트(예: 80, 443).
    • 동일 출처 정책은 악의적인 웹 사이트가 사용자의 데이터를 훔치거나 조작하는 것을 방지합니다.
  2. CORS (Cross-Origin Resource Sharing)
    • CORS는 동일 출처 정책을 우회할 수 있도록 허용된 출처에서 요청을 보낼 수 있게 하는 메커니즘입니다.
    • 서버는 특정 출처에서의 요청을 허용할 것인지 설정할 수 있습니다.
    • 이를 위해 서버는 HTTP 응답 헤더에 필요한 정보를 추가하여 브라우저에 권한을 부여합니다.

CORS 요청의 종류

  1. Simple Requests (단순 요청)
    • GET, HEAD, POST 중 하나의 메서드를 사용하며, 특정 조건을 만족하는 요청.
    • 요청 헤더는 Accept, Accept-Language, Content-Language, Content-Type(단순 텍스트나 URL 인코딩된 데이터)만 포함합니다.
    • 예: 단순 GET 요청.
  2. Preflight Requests (사전 요청)
    • 서버에 사전 요청을 보내 실제 요청이 허용되는지 확인하는 과정.
    • OPTIONS 메서드를 사용하여 서버에 사전 요청을 보냅니다.
    • 서버가 허용하는 메서드와 헤더를 응답으로 반환합니다.
    • 예: Content-Type이 application/json인 POST 요청.
  3. Actual Requests (실제 요청)
    • Preflight 요청이 성공적으로 끝난 후 실제 데이터 요청이 이루어집니다.

CORS 헤더

  1. Access-Control-Allow-Origin
    • 특정 출처를 지정하여 해당 출처의 요청을 허용.
    • 모든 출처를 허용하려면 * 사용.
    • 예: Access-Control-Allow-Origin: http://example.com
  2. Access-Control-Allow-Methods
    • 서버가 허용하는 HTTP 메서드 목록.
    • 예: Access-Control-Allow-Methods: GET, POST, PUT, DELETE
  3. Access-Control-Allow-Headers
    • 서버가 허용하는 HTTP 요청 헤더 목록.
    • 예: Access-Control-Allow-Headers: Content-Type, Authorization
  4. Access-Control-Allow-Credentials
    • 자격 증명(쿠키, 인증 헤더 등)을 포함한 요청을 허용.
    • 예: Access-Control-Allow-Credentials: true
  5. Access-Control-Expose-Headers
    • 클라이언트가 접근할 수 있는 응답 헤더 목록.
    • 예: Access-Control-Expose-Headers: X-Custom-Header
  6. Access-Control-Max-Age
    • Preflight 요청의 결과를 캐시할 시간(초 단위).
    • 예: Access-Control-Max-Age: 3600

예제

Spring Boot 애플리케이션에서 CORS 설정 예제:

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.web.servlet.config.annotation.CorsRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer

@Configuration
class WebConfig : WebMvcConfigurer {
    @Bean
    fun corsConfigurer(): WebMvcConfigurer {
        return object : WebMvcConfigurer {
            override fun addCorsMappings(registry: CorsRegistry) {
                registry.addMapping("/**")
                        .allowedOrigins("http://localhost:3000")
                        .allowedMethods("GET", "POST", "PUT", "DELETE")
                        .allowedHeaders("*")
                        .allowCredentials(true)
                        .maxAge(3600)
            }
        }
    }
}

 

이 예제에서는 http://localhost:3000에서 오는 모든 요청에 대해 GET, POST, PUT, DELETE 메서드를 허용하고, 모든 헤더를 허용하며, 자격 증명을 포함한 요청을 허용합니다.

CORS 설정을 올바르게 이해하고 구성하면, 다양한 출처 간에 안전하게 리소스를 공유할 수 있습니다. CORS는 웹 애플리케이션 개발에서 중요한 보안 메커니즘 중 하나입니다.

728x90
반응형