Web

๋ฐฑ์—”๋“œ → ํ”„๋ก ํŠธ์—”๋“œ(localhost) ์ฟ ํ‚ค ์ „์†ก ๋ฌธ์ œ

presentKey 2024. 9. 15. 23:14

๐Ÿงท ์ถœ์ฒ˜

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://www.devyummi.com/page?id=66934f448a005e7d8f32213a

๐Ÿ”ฅ ๋ฌธ์ œ ์ƒํ™ฉ

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://www.devyummi.com/page?id=66934f448a005e7d8f32213a

๋กœ๊ทธ์ธ ์ฑ…์ž„์„ ๋ฐฑ์—”๋“œ๊ฐ€ ๋งก๊ณ  ์žˆ๋Š” ์นด์นด์˜ค, ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„์ค‘์ด์˜€๋‹ค.

์†Œ์…œ ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ, ๋ฐฑ์—”๋“œ์—์„œ ์ƒ์„ฑํ•œ jwt ํ† ํฐ ์ฟ ํ‚ค๊ฐ€ ๋ธŒ๋ผ์šฐ์ €(localhost)์— ์ €์žฅ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ ์ €์žฅ์ด ๋˜๊ณ  ์žˆ์ง€ ์•Š์•˜๋‹ค.

๐Ÿƒ‍โ™€๏ธ ์ฒซ ๋ฒˆ์งธ ์‹œ๋„

  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
    • ํ”„๋ก ํŠธ์—”๋“œ
      • http://localhost:5173
      • window.location.href = 'http://1.11.111.11:8080/oauth2/authorization/kakao';
        • ์†Œ์…œ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ, ํŽ˜์ด์ง€ ์ด๋™
        • httpํ”„๋กœํ† ์ฝœ
        • ์„œ๋ฒ„ ์ฃผ์†Œ(์•„์ดํ”ผ): 1.11.111.11:8080 (ํ•ด๋‹น ์ฃผ์†Œ๋Š” ์‹ค์ œ ์„œ๋ฒ„ ์•„์ดํ”ผ๊ฐ€ ์•„๋‹˜)
    • ๋ฐฑ์—”๋“œ
      • ์ฟ ํ‚ค ์„ค์ •
        • SameSite = lax
        • secure = false

์œ„ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ ์‹œ, ํด๋ผ์ด์–ธํŠธ localhost์— jwt ํ† ํฐ ์ฟ ํ‚ค๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š๊ณ  http://1.11.111.11:8080 ์„œ๋ฒ„์ชฝ์— ์ฟ ํ‚ค๊ฐ€ ์ €์žฅ๋˜์—ˆ๋‹ค.

๐Ÿƒ‍โ™€๏ธ ๋‘ ๋ฒˆ์งธ ์‹œ๋„

์„œ๋ฒ„์™€ localhost ๋„๋ฉ”์ธ์ด ๋‹ฌ๋ผ ์ฟ ํ‚ค๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋ฐฑ์—”๋“œ์˜ ์ฟ ํ‚ค ์„ค์ •์„ ์ˆ˜์ •ํ•ด๋ณด์•˜๋‹ค.

  • ์ฟ ํ‚ค ์„ค์ •
    • SameSite = none
    • secure = true

์ฒซ ๋ฒˆ์งธ ์‹œ๋„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„œ๋ฒ„์ชฝ์— ์ฟ ํ‚ค๊ฐ€ ์ €์žฅ๋˜์—ˆ๋‹ค. ๋‹ค์Œ ์„ค์ •๋“ค๋„ ํด๋ผ์ด์–ธํŠธ์ชฝ์œผ๋กœ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š์•˜๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ localhost https ์ ์šฉ
  2. ๋ฐฑ์—”๋“œ ์ฟ ํ‚ค ์„ค์ • domain:localhost ์ง€์ •

๐Ÿ‘€ ๊ฐ„๋‹จํžˆ ์ฟ ํ‚ค ์†์„ฑ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

  • domain
    • ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋  ์ˆ˜ ์žˆ๋Š” ๋„๋ฉ”์ธ์„ ์ง€์ •ํ•˜๋Š” ์†์„ฑ
    • domain=test.com์œผ๋กœ ์„ค์ •ํ•˜๋ฉด, test.com๊ณผ sub.test.com์—์„œ๋„ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋œ๋‹ค.
  • secure
    • ์ฟ ํ‚ค๊ฐ€ https ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ „์†ก๋˜๋„๋ก ํ•œ๋‹ค.
  • HttpOnly
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ฟ ํ‚ค๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋„๋ก ํ•œ๋‹ค.
  • SameSite
    • Strict: ์˜ค์ง ๊ฐ™์€ ์‚ฌ์ดํŠธ์—์„œ์˜ ์š”์ฒญ์—๋งŒ ์ „์†ก๋œ๋‹ค.
    • lax: ๊ฐ™์€ ์‚ฌ์ดํŠธ์—์„œ์˜ ์š”์ฒญ ๋ฐ Get ์š”์ฒญ, ๋งํฌ ์ด๋™ ๋“ฑ์—๋Š” ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋œ๋‹ค. ๋‹จ, POST, PUT, DELETE ์š”์ฒญ์€ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š๋Š”๋‹ค.
    • none: ๋ชจ๋“  ์‚ฌ์ดํŠธ ๊ฐ„ ์š”์ฒญ์—์„œ ์ „์†ก๋œ๋‹ค. ๋‹จ secure=true ์†์„ฑ์ด ์„ค์ •๋˜์•ผ ํ•œ๋‹ค.

๐Ÿƒ‍โ™€๏ธ ์„ธ ๋ฒˆ์งธ ์‹œ๋„(์„ฑ๊ณต)

์„œ๋ฒ„ ์ฃผ์†Œ๋ฅผ ์•„์ดํ”ผ๊ฐ€ ์•„๋‹Œ ๋„๋ฉ”์ธ์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๋ธŒ๋ผ์šฐ์ € localhost์— jwt ํ† ํฐ ์ฟ ํ‚ค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ €์žฅ๋˜์—ˆ๋‹ค.

  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
    • ํ”„๋ก ํŠธ์—”๋“œ
      • http://localhost:5173
      • window.location.href = 'https://custom-domain.com/oauth2/authorization/kakao';
        • ์•„์ดํ”ผ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ ๋„๋ฉ”์ธ์œผ๋กœ ๋ณ€๊ฒฝ
    • ๋ฐฑ์—”๋“œ
      • ์ฟ ํ‚ค ์„ค์ •
        • SameSite = lax
        • secure = true

๐Ÿค” ์ฒซ ๋ฒˆ์งธ ์‹œ๋„์—์„œ๋Š” ์™œ ์ฟ ํ‚ค๋ฅผ ์ „๋‹ฌ๋ฐ›์ง€ ๋ชปํ–ˆ์„๊นŒ?

๋จผ์ € localhost๋Š” ํŠน์ˆ˜ํ•œ ๋„๋ฉ”์ธ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. SameSite๊ฐ€ lax ๋˜๋Š” strict๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ, ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ € localhost๋Š” ์„œ๋ฒ„์—์„œ ๋ณด๋‚ด์ค€ ์ฟ ํ‚ค๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, secure=true๋กœ ์„ค์ •๋˜์—ˆ์–ด๋„ https๊ฐ€ ์•„๋‹Œ http ํ™˜๊ฒฝ์—์„œ secure ์ฟ ํ‚ค๊ฐ€ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. (firefox์˜ ๊ฒฝ์šฐ strict๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ์ฟ ํ‚ค๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š์•˜๋‹ค.)

 

localhost๊ฐ€ ๋ณด์•ˆ ์ •์ฑ…์—์„œ ์กฐ๊ธˆ ๋Š์Šจํ•˜๋‹ค๋ฉด, ์ฒซ ๋ฒˆ์งธ ์‹œ๋„์—์„œ ์ฟ ํ‚ค๋Š” localhost์— ์ €์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ €์žฅ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ ์ด ์ด์œ ๋ฅผ gpt๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ตํ–ˆ๋‹ค.(100% ์‹ ๋ขฐํ•˜์ง€ ๋งˆ์„ธ์š”!)

  • ๋ธŒ๋ผ์šฐ์ €๋Š” IP ์ฃผ์†Œ์™€ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • IP ์ฃผ์†Œ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ์™€ ์ •์ƒ์ ์ธ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ฟ ํ‚ค์˜ SameSite, Secure ์†์„ฑ์„ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠนํžˆ, ๋„๋ฉ”์ธ ์ด๋ฆ„์ด ์•„๋‹Œ IP ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•˜๋ฉด ์ฟ ํ‚ค๊ฐ€ SameSite=Strict๋‚˜ SameSite=Lax ์„ค์ •์—์„œ ์ฟ ํ‚ค ์ „์†ก์ด ์ฐจ๋‹จ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’์Šต๋‹ˆ๋‹ค.
  • IP ์ฃผ์†Œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋ณด์•ˆ ๋ชจ๋ธ์—์„œ ๋„๋ฉ”์ธ์ฒ˜๋Ÿผ ์‹ ๋ขฐ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ๋ณด์•ˆ ์ฟ ํ‚ค ์ •์ฑ…์ด ๋” ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ์ •์ฑ… ์ƒ IP ์ฃผ์†Œ(http://1.11.111.11:8080/oauth2/authorization/kakao)๋กœ ์ ‘๊ทผํ•˜์—ฌ ์ฟ ํ‚ค ์ „์†ก์ด ์ฐจ๋‹จ๋  ๊ฑธ๋กœ ๋ณด์ธ๋‹ค.

 

๐Ÿค” ๋‘ ๋ฒˆ์งธ ์‹œ๋„์—์„œ๋Š” ์™œ ์ฟ ํ‚ค๋ฅผ ์ „๋‹ฌ๋ฐ›์ง€ ๋ชปํ–ˆ์„๊นŒ?

SameSite = None์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ชจ๋“  ์‚ฌ์ดํŠธ๊ฐ„ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜์ง€๋งŒ, http ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฑ์—”๋“œ(http://1.11.111.11:8080)๊ฐ€ secure = true ์ฟ ํ‚ค ์„ค์ •์ด ๋˜์–ด ์žˆ์–ด ์ „์†ก๋˜์ง€ ์•Š์•˜๋‹ค.

 

๐Ÿงฉ ์ผ€์ด์Šค ์ •๋ฆฌ

  • window.location.href = http://1.11.111.11:8080~~~
    • SameSite = lax, secure = false: 1.11.111.11 ์„œ๋ฒ„์— jwt ํ† ํฐ ์ฟ ํ‚ค ์ €์žฅ (localhost๋กœ ์ „์†ก X)
    • SameSite = none, secure = true: 1.11.111.11 ์„œ๋ฒ„์— jwt ํ† ํฐ ์ฟ ํ‚ค ์ €์žฅ (localhost๋กœ ์ „์†ก X)
  • window.location.href = 'https://custom-domain~~~
    • SameSite = lax, secure = false: localhost์— jwt ํ† ํฐ ์ฟ ํ‚ค ์ €์žฅ
    • SameSite = lax, secure = true: localhost์— jwt ํ† ํฐ ์ฟ ํ‚ค ์ €์žฅ
    • SameSite = none, secure = true: localhost์— jwt ํ† ํฐ ์ฟ ํ‚ค ์ €์žฅ