[Spring] Cookie and CORS

Spring Boot

(Update : 2022-09-05)

Language :

spring boot version: 2.7.0

CORS 설정

@Configuration
class WebMvcConfig : WebMvcConfigurer {

    override fun addCorsMappings(registry: CorsRegistry) {
        registry.addMapping("/**")
            .allowedOriginPatterns("http://localhost")
            .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE", "HEAD")
            .allowedHeaders("*")
            .exposedHeaders("Set-Cookie")
            .allowCredentials(true)
    }
}

Cookie 객체 설정

data class Token(
    val accessToken: String,
) {

    fun cookie(): ResponseCookie {
        return ResponseCookie.from("accessToken", accessToken)
            .path("/")
            .secure(true)
            .sameSite("Strict")
            .httpOnly(true)
            .domain("localhost")
            .maxAge(60 * 60 * 6)  // 6 hours
            .build()
    }

}
  • path
  • httpOnly=true 인 경우 요청 URL에서 생성한 쿠키를 domain으로 지정한 URL에 적용
  • root path("/")를 설정하지 않으면 요청 URL에서만 쿠키를 가짐 (httpOnly 가 true 경우만)
  • httpOnly
  • true: 서버에서 쿠키 관리(암호화된 쿠키). 서버만 쿠키를 읽고 사용 가능. 클라이언트에서 쿠키 알 수 없음
  • path 설정 안하면 쿠키가 가진 도메인을 통해 해당 도메인에서만 쿠키 사용 가능
  • false: 클라이언트에서 쿠키 관리(암호화되지 않은 쿠키)
  • maxAge
  • expires. 쿠키 유지 시간 설정
  • sameSite
  • 서로 다른 도메인 간의 쿠키 전송에 대한 보안 설정
  • None: 동일 사이트와 크로스 사이트에 모두 쿠키 전송 가능
  • CSRF(Cross-site request forgery) 및 의도하지 않은 정보 유출에 취약해질 가능성이 높다고 함
  • Strict: 서로 다른 도메인 간에 쿠키 전송 불가
  • Lax: Strict 설정에 일부 예외를 두어 쿠키 전송 가능

Cookie 설정

@RestController
class AdminAuthController {

    @PostMapping("/sign-in")
    fun signIn(@RequestBody request: AuthRequest): ResponseEntity<Any> {
        /** ... */

        // Cookie
        val token = Token("asdfasd")

        return ResponseEntity.ok()
            .header(SET_COOKIE, token.cookie().toString())
            .body(mapOf("result" to "SUCCESS"))
    }

}

확인

개발자 도구 / Application / Cookies 에서 확인

cookie.png

cookie.png

민갤

Back-End Developer

백엔드 개발자입니다.