[10๋ถ„ ํ…Œ์ฝ”ํ†ก] ๐ŸŒณ ๋‚˜๋ด„์˜ CORS

๋ฐ•์ฒ ํ˜„ยท2023๋…„ 4์›” 10์ผ
0

์˜์ƒํ›„๊ธฐ

๋ชฉ๋ก ๋ณด๊ธฐ
85/160

movie

  • SOP(Same Origin Policy) : ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ์ œํ•œํ•˜๋Š” ๋ณด์•ˆ ๋ฐฉ์‹

    https: (ํ”„๋กœํ† ์ฝœ)
    //github.com(ํ˜ธ์ŠคํŠธ)
    :443(ํฌํŠธ)
    /cheorhyeon?tab=repositories#example
  • ์ถœ์ฒ˜(origin)๋ž€?

    • Protocol, Host, Port๋ฅผ ํ†ตํ•ด ๊ฐ™์€ ์ถœ์ฒ˜์ธ์ง€ ๋‹ค๋ฅธ ์ถœ์ฒ˜์ธ์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ชจ๋‘ ๊ฐ™์•„์•ผ ๋™์ผ ์ถœ์ฒ˜
    • ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ : Port๊ฐ€ ๋‹ฌ๋ผ๋„ ๋™์ผ ์ถœ์ฒ˜๋กœ ์ธ์‹
  • localhost์™€ 127.0.0.1์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ธ์‹

    • String Value๋กœ ๋น„๊ตํ•˜๊ธฐ์— ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ ์ธ์‹
  • ์™œ SOP๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ? ๋ณด์•ˆ์— ์œ„ํ•จ

    ์„ ๋Ÿ‰ํ•œ ์‚ฌ์šฉ์ž

    1. ํŽ˜์ด์Šค๋ถ ์„œ๋น„์Šค ๋กœ๊ทธ์ธ ์ดํ›„ ์‚ฌ์šฉ
      (ํŽ˜์ด์Šค๋ถ์—์„œ ์ธ์ฆ ํ† ํฐ์„ ๋ฐ›์•„์˜ด)
    2. ํ•ด์ปค : ํฅ๋ฏธ์ง„์ง„ํ•œ ๋‚ด์šฉ๊ณผ ๋งํฌ๋ฅผ ๋ฉ”์ผ์„ ํ†ตํ•ด ๋ณด๋ƒ„
    3. ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋‹ˆ http://hacker.ck๋กœ ์ด๋™๋จ
    • ํ•ด๋‹น ๋งํฌ๋Š” ํŽ˜์ด์Šค๋ถ์— ๋‚˜๋Š” ๋ฐ”๋ณด๋‹ค ๋ผ๋Š” ํฌ์ŠคํŠธ ๊ฒŒ์‹œ ํ•˜๋ผ๋Š” ์ฝ”๋“œ ๋‚ดํฌ
    1. http://hacker.ck์—์„œ ์„ ๋Ÿ‰ํ•œ ์‚ฌ์šฉ์ž์˜ ํ† ํฐ์„ ์ด์šฉํ•ด ํŽ˜์ด์Šค๋ถ์— ๋‚˜๋Š” ๋ฐ”๋ณด๋‹ค ํฌ์ŠคํŠธ ๊ฒŒ์‹œ
    2. origin์ด ๋‹ค๋ฆ„
    • ํ•ด์ปค : http://hacjer.ck, ํŽ˜์ด์Šค๋ถ : https://www.facebook.com/
    • ์ฆ‰ ๋‹ค๋ฅธ Origin -> Cross Origin ์ด๋ผ ํŒ๋‹จํ•˜๊ณ  ์š”์ฒญ์€ ๋ฐ›์•„๋“ค์—ฌ์ง€์ง€ ์•Š์Œ

  • ๋งŒ์•ฝ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด? CORS ํ•„์š”!

  • CORS(Cross-Origin Resource Sharing)

    • ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ 
    • ์ถ”๊ฐ€ HTTP ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ํ•œ ์ถœ์ฒ˜์—์„œ ์‹คํ–‰ ์ค‘์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์„ ํƒํ•œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋„๋ก ๋ธŒ๋ผ์šฐ์ € ์•Œ๋ ค์ฃผ๋Š” ์ฒด์ œ
  • CORS ์ ‘๊ทผ์ œ์–ด ์‹œ๋‚˜๋ฆฌ์˜ค

    • ๋‹จ์ˆœ ์š”์ฒญ(Simple Request)
    • ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ(Preflight Request)
    • ์ธ์ฆ์ •๋ณด ํฌํ•จ ์š”์ฒญ(Credentialed Request)

  • ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ(Preflight Request) : ์‚ฌ์ „ ํ™•์ธ ์ž‘์—…

    • OPTIONS ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ๋ฆฌ์†Œ์Šค์— ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•œ ์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์—…

    • ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์‹ค์ œ ์š”์ฒญ(Actual Request)๋ฅผ ๋ณด๋‚ธ๋‹ค.

      Preflight Request

      • Origin : ์š”์ฒญ ์ถœ์ฒ˜
      • Access-Control-Request-Method : ์‹ค์ œ ์š”์ฒญ ๋ฉ”์„œ๋“œ
      • Access-Control-Request-Headers : ์‹ค์ œ ์š”์ฒญ์˜ ์ถ”๊ฐ€ ํ—ค๋”

      Preflight Response

      • Access-Control-Allow-Origin : ์„œ๋ฒ„์ธก ํ—ˆ๊ฐ€ ์ถœ์ฒ˜
      • Access-Control-Allow-Methods : ์„œ๋ฒ„ ์ธก ํ—ˆ๊ฐ€ ๋ฉ”์„œ๋“œ
      • Access-Control-Allow-Headers : ์„œ๋ฒ„ ์ธก ํ—ˆ๊ฐ€ ํ—ค๋”
      • Access-Control-Max-Age : preflight ์‘๋‹ต ์บ์‹œ ๊ธฐ๊ฐ„
  • Preflight ์š”์ฒญ : ํ™•์ธ + ์‹ค์ œ ์š”์ฒญ

    • ๋งค๋ฒˆ 2๋ฒˆ ๋ณด๋‚ด์•ผํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ
    • ๋”ฐ๋ผ์„œ ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์‘๋‹ต ์บ์‹ฑ ํ•ด๋‘๊ณ  ์š”์ฒญ์ด ์˜ค๋ฉด ์‚ฌ์ „ ํ™•์ธ ์—†์ด ๋ฐ”๋กœ ๋ณด๋‚ด๋Š”๊ฑฐ ๋ฐ›์•„๋“ค์ž„
      • PREFLIGHT RESPONSE ์†์„ฑ ์ค‘ Access-Control-Max-Age
  • Preflight Response๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ํŠน์ง•

    • ์‘๋‹ต ์ฝ”๋“œ๋Š” 200๋Œ€์—ฌ์•ผ ํ•œ๋‹ค.
    • ์‘๋‹ต ๋ฐ”๋””๋Š” ๋น„์–ด์žˆ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ๋‹จ์ˆœ ์š”์ฒญ(Simple Request) : ๋ฐ”๋กœ ๋ณธ ์š”์ฒญ์„ ๋‚ ๋ฆฌ๋ฉด์„œ ๋ฐ”๋กœ CORS์ธ์ง€ ํ™•์ธ(์•„๋ž˜ ์กฐ๊ฑด ๋ชจ๋‘ ์ถฉ์กฑ)

    • GET, POST, HEAD ๋ฉ”์„œ๋“œ ๋งŒ์กฑ
    • Content-Type ์•„๋ž˜ 3๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜
      • application/x-www-form-urlencoded
      • multipart/form-date
      • text/plain
    • ํ—ค๋”๋Š” Accept, Accept-Language, Content-Language, Content-Type๋งŒ ํ—ˆ์šฉ
  • ์™œ Preflight๊ฐ€ ํ•„์š”ํ• ๊นŒ? CORS๋ฅผ ๋ชจ๋ฅด๋Š” ์„œ๋ฒ„๋ฅผ ์œ„ํ•ด์„œ

    • ๋งŒ์ผ delete ์ด๋Ÿฐ ๋ช…๋ น์ด๋ผ๋ฉด, CORS ์—๋Ÿฌ๋ฅผ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋œ ๋‹ค์Œ์— ์‘๋‹ต๋ฐ›๊ธฐ์— ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ์ผ์ˆ˜๋„

  • ์ธ์ฆ์ •๋ณด ํฌํ•จ ์š”์ฒญ(Credentialed Request) : ์ธ์ฆ ๊ด€๋ จ ํ—ค๋”๋ฅผ ํฌํ•จํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์š”์ฒญ
    • ํด๋ผ์ด์–ธํŠธ์ธก credentials : include
    • ์„œ๋ฒ„์ธก Access-Control-Allow-Credentials : true
      • Access-Control-Allow-Origin: *๋Š” ์•ˆ๋จ, ํŠน์ • url ๋ช…์‹œ ํ•„์š”
      • Credentials true์ธ๋ฐ Origin *๋ฉด ์˜ˆ์™ธ ํ„ฐ์ง
  • CORS ํ•ด๊ฒฐ
    • ํ”„๋ก ํŠธ ํ”„๋ก์‹œ ์„œ๋ฒ„ ์„ค์ •(๊ฐœ๋ฐœ ํ™˜๊ฒฝ)
      • ๋ธŒ๋ผ์šฐ์ €์—์„œ 8181 -> ํ”„๋ก ํŠธ 8081 ๋ฐ›์•„์„œ ์„œ๋ฒ„ 8080์œผ๋กœ ํ† ์Šค
      • ํ”„๋ก ํŠธ -> ๋ฐฑ์€ ์•ˆํ„ฐ์ง
    • ์ง์ ‘ ํ—ค๋”์— ์„ค์ •
    • ์Šคํ”„๋ง ๋ถ€ํŠธ ์ด์šฉ
      • @CrossOrigin ์–ด๋…ธํ…Œ์ด์…˜
      • WebMvcConfigurer ๊ตฌํ˜„์ฒด
profile
๋น„์Šทํ•œ ์–ด๋ ค์›€์„ ๊ฒช๋Š” ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋˜๊ธธ

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด