Post

๐Ÿ’ฅ Spring Security์™€ CORS ๋ฌธ์ œ

๐Ÿ’ฅ Spring Security์™€ CORS ๋ฌธ์ œ

๋ฌธ์ œ ์ƒํ™ฉ

  • ํ”„๋ก ํŠธ์—”๋“œ ์ž‘์—…์„ ํ•˜๋Š”๋ฐ, Gateway ์„œ๋ฒ„์— CorsWebFilter๋ฅผ ๊ตฌํ˜„ํ–ˆ์Œ์—๋„ CORS ๊ด€๋ จ ๋ฌธ์ œ๋กœ ํŠน์ • ์„œ๋น„์Šค์— ๋กœ๊ทธ์ธ์ด ๋ถˆ๊ฐ€๋Šฅ ํ–ˆ๋‹ค.
  • ๊ทธ ๊ณผ์ •์—์„œ Gateway ์„œ๋ฒ„์™€ ์„œ๋น„์Šค์— ํ•ด๋‹นํ•˜๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— CORS ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ๊ฐ ํ•ด๋ณด์•˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

๋ฌธ์ œ ์›์ธ

  • Spring Security์— ์„ค์ •ํ•œ ์ปค์Šคํ…€ ํ•„ํ„ฐ์—์„œ OPTIONS ์š”์ฒญ์— ๋Œ€ํ•œ ์ธ๊ฐ€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ๊ฐ™์€ API๋Š” ์ธ์ฆ์ด ์•ˆ ๋˜์–ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋„ ์š”์ฒญ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— OPTIONS ์š”์ฒญ์ด ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค
  • ๊ทธ ์™ธ์—๋„ Content-Type์ด application/json์ด๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ PUT, PATCH, DELETE์ธ ๊ฒฝ์šฐ, Authorization ํ—ค๋”๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €๋Š” OPTIONS ์š”์ฒญ์„ ๋ณด๋‚ด ํŠน์ • ๋„๋ฉ”์ธ์˜ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ—ˆ์šฉํ•  ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

1
2
3
private boolean isOptionsRequest(ServerHttpRequest request) {  
    return request.getMethod() == HttpMethod.OPTIONS;  
}
  • ์ปค์Šคํ…€ ํ•„ํ„ฐ์—์„œ ์œ„ ๋ฉ”์„œ๋“œ๋ฅผ ๋กœ์ง์— ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

ํšŒ๊ณ 

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ API ์š”์ฒญ์— ๋Œ€ํ•ด ์šฐ์„ ์ ์œผ๋กœ OPTIONS ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด PREFLIGHT ์š”์ฒญ์„ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ๊ทธ ์™ธ์—๋„ Gateway ์„œ๋ฒ„์—์„œ corsWebFilter๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๊ฐ ์„œ๋น„์Šค์˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ๋Š” CORS๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ์ฐธ๊ณ ๋กœ ์„œ๋ฒ„๋Š” PREFLIGHT ์š”์ฒญ๊ณผ ์‹ค์ œ ์š”์ฒญ์— ๋ชจ๋‘ CORS ํ—ค๋”๋ฅผ ๋ถ™์—ฌ์„œ ์‘๋‹ตํ•ด์•ผ ํ•œ๋‹ค.
This post is licensed under CC BY 4.0 by the author.