๐จ TroubleShotting
๋ฌธ์ ๋ฐ์์ ๋ฐฐ๊ฒฝ - As Is
ํ์ฌ ์น์์ผ์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ค์๊ฐ ํฌํ ์๋น์ค๋ฅผ ๊ฐ๋ฐ ์ค์ด๋ค.
์๋น์ค์ ๊ฐ๋จํจ์ ๊ณ ๋ คํ์ฌ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ด ๊ตณ์ด ํ์์๋ค๊ณ ํ๋จํ์ง๋ง, ํฌํ์ ์ฃผ์ฒด์ธ ์ ์ ์๋ณ ๊ธฐ๋ฅ์ ํ์ํ๋ค.
๋ฐ๋ผ์, ์ธ์
์ ์ด์ฉํด์ ์๋ฒ์์ ์ธ์
ID๋ฅผ ๋ฐ๊ธ ๋ฐ ์ฟ ํค์ ๋ด์์ฃผ๋ฉด - ํ๋ก ํธ์์ ์์ฒญ๋ง๋ค ์ฟ ํค๋ฅผ ํฌํจํ๋ ๋ฐฉ์์ผ๋ก ์ ์ ๋ฅผ ์๋ณํ๊ณ ์ ํ๋ค.
๊ทธ๋ฐ๋ฐ ๋ถ๋ช ํ ์๋ฒ์์ sessionID๋ฅผ ๋ฐ๊ธํด์ ์ฟ ํค์ ๋ฃ์ด์ฃผ์๊ณ , ํ๋ก ํธ์์๋ document.cookies๋ก ์ฟ ํค ํ์ธ์ด ๊ฐ๋ฅํ๋,
์์ฒญ์๋ ์ฟ ํค๊ฐ ํฌํจ๋์ง ์๋ ํ์
How(๊ณผ์ ) ?
์ํ์ฐฉ์ค 1
- Websocket ์์ฒญ ํค๋์ ํฌํ ์ ๋ณด๋ฅผ ๋ด์์ ๋ฐฑ์๋๋ก ๋ณด๋ด๋ ค๊ณ ํ๋ค.
- ์คํจ
- ์น์์ผ ์์ฒญ์ ์ฒ์์๋ http๋ก ์์ํ์ฌ ํธ๋์์ดํฌ -> Websocket ํ๋กํ ์ฝ๋ก ์ ๊ทธ๋ ์ด๋ ๋๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- ์ด ๋, Websocket ํ๋กํ ์ฝ์๋ Header ์ธํฐํ์ด์ค ์์ฒด๊ฐ ์๋ค.
- ์ฆ, Websocket ํ๋กํ ์ฝ ์์ฒด๋ ํค๋๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
- ์คํจ
์ํ์ฐฉ์ค 2
- ๊ทธ๋ผ ํธ๋์์ดํฌ ๋จ๊ณ๊น์ง๋ง์ด๋ผ๋ ์ฟ ํค๋ฅผ ๋ด์์ ์์ฒญ์ ๋ณด๋ด๋ณด์.
- ํ๋ก ํธ์์ ์ฐ์ `credentials: include`(fetch) ๋๋`withCredentials: true`(Axios)๋ฅผ ์ค์ ํด์ผ ์ฟ ํค๊ฐ ์์ฒญ์ ํฌํจ๋๋ฏ๋ก ์ถ๊ฐ
- ์คํจ
- ์์ฒญ์ ์ฟ ํค๋ฅผ ๋ด์์ ๋ณด๋ผ ๋๋ ๋ช ๊ฐ์ง ์กฐ๊ฑด์ด ํ์ํจ
- CORS - ๊ฐ์ ์ถ์ฒ์ธ๊ฐ?
- No, ํ์ฌ ํ๋ก ํธ๋ ๊ฐ๋ฐ ๋ชจ๋๋ก `localhost:3300`, ๋ฐฑ์๋๋ `golaping.site` ์ฃผ์ ์ฌ์ฉ ์ค
- ์ถ์ฒ๊ฐ ๋ค๋ฅด๋ฏ๋ก, Access-origin ์ค์ ์ธ์๋ `Samesite=None` ์ค์ ํ์
- `Samesite=None`์ด๋ฉด, `secure=true` ์ค์ ๋ฐ https ํ๊ฒฝ ํ์
- SSL ์ธ์ฆ์ ์ค์น
- CORS - ๊ฐ์ ์ถ์ฒ์ธ๊ฐ?
- ์ด ๊ณผ์ ์ ๊ฑฐ์ณ์ `localhost:3300` ์์ ๋ฐฑ์๋ ์๋ฒ๋ก ์ฟ ํค๋ฅผ ๋ด์ ์์ฒญ ๋ณด๋ด๊ธฐ์ ์ฑ๊ณตํ๋ค.
์ํ์ฐฉ์ค 3
๊ทธ๋ฐ๋ฐ, ๋ฌธ๋ ๋ค์๊ณผ ๊ฐ์ ์๊ฐ์ด ๋ค์๋ค.
`Samesite=None`์ด ํ์ฉ๋๋ฉด, CSRF ๊ณต๊ฒฉ์ ์ทจ์ฝํ ์ ์์ง ์์๊น?
CSRF ๊ณต๊ฒฉ ์ํ์ฑ์ ๋ง๋ ๋ฐฉ๋ฒ์ ๋ณดํต ์๋ 3๊ฐ์ง์ด๋ค.
- CSRF ํ ํฐ ์ฌ์ฉ
- CORS ์ค์ - ํ์ฉ๋ ๋๋ฉ์ธ์์๋ง ์์ฒญ์ ๋ฐ์ ์ ์๋๋ก ์ ํ
- `SameSite=Strict` - ๋ค๋ฅธ ์ฌ์ดํธ์์ ์ฟ ํค๊ฐ ์ ์ก๋์ง ์๋๋ก
SameSite = Strict
๊ทธ ์ค `SameSite=Strict`๋ฅผ ์ ์ฉํ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด์๋ค.
๋จผ์ , SameSite=Strict ๋, ๋์ผ ์ฌ์ดํธ ๊ฐ์ ์์ฒญ์๋ง ์ฟ ํค๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ ์ ์ฑ
์ด๋ค.
๊ทธ๋ผ ์ฌ๊ธฐ์ ๋์ผ ์ฌ์ดํธ๋? ์๋ ์ด๋ฏธ์ง์ ๊ฐ์ด
- "์คํค๋ง์ eTLD+1(TLD + TLD ๋ฐ๋ก ์์ ๋๋ฉ์ธ)์ด ๋์ผํ ์น์ฌ์ดํธ" ๊ฐ ๋์ผ ์ฌ์ดํธ์ด๋ค.
ํ๋ก ํธ์ ๋ฐฑ์๋ ๊ฐ์ ๋๋ฉ์ธ์ ์ผ์น์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ญ๊ฐ ์์๊น ์๊ฐํด๋ณด์๊ณ , 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ๋ ์ฌ๋๋ค.
๋ฐฉ๋ฒ 1
- ํ๋ก ํธ EC2 ์๋ฒ์ nginX์์ proxy_pass๋ฅผ ํตํด Host ํค๋๋ฅผ ๋ฐฑ์๋ ํธ์คํธ๋ก ๋ณ๊ฒฝ
์ฆ, ๋ฐฑ์๋์์๋ ๋ค์ด์ค๋ ์์ฒญ์ ๊ฐ์ ์ฌ์ดํธ๋ก ์ธ์ํ๋๋ก ํ๊ธฐ
server {
listen 80;
server_name frontend.com; # ํ๋ก ํธ์๋ ๋๋ฉ์ธ
location /api/ {
proxy_pass http://api.com/; # ๋ฐฑ์๋ API ์๋ฒ๋ก ํ๋ก์
proxy_set_header Host api.com; # ---> 'Host' ํค๋๋ฅผ api.com์ผ๋ก ์ค์
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
- Host ํค๋๋?
- HTTP ์์ฒญ์์ ์์ฒญ์ ๋ณด๋ด๋ ๋์์ ๋๋ฉ์ธ ์ด๋ฆ์ ๋ํ๋ธ๋ค. ์๋ฅผ ๋ค์ด, http://api.com/somepath๋ก ์์ฒญ์ ๋ณด๋ผ ๋, Host ํค๋๋ api.com์ด ๋๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด, ๋ฐฑ์๋ ์๋ฒ๋ frontend.com ์ผ๋ก ์์ํ ์์ฒญ์ด api.com์์ ์จ ๊ฒ์ฒ๋ผ ์ฒ๋ฆฌํ์ฌ `SameSite=Strict`๋ก ์ค์ ์ด ๊ฐ๋ฅํด์ง๋ค.
๋ฐฉ๋ฒ 2
ํ๋ก ํธ์ ๋ฐฑ์๋๊ฐ ๋ชจ๋ ์ต์์ ๋๋ฉ์ธ์ ๊ณต์ , ์๋ธ๋๋ฉ์ธ์ผ๋ก ๋ฑ๋กํ๊ธฐ
Type: A
Name: frontend
Value: XX.XX.XX.XX # EC2 ํผ๋ธ๋ฆญ IP
TTL: 3600
Type: A
Name: api
Value: YY.YY.YY.YY # ๋ฐฑ์๋ EC2 ํผ๋ธ๋ฆญ IP
TTL: 3600
- AWS Route53 ์๋น์ค๋ฅผ ์ด์ฉํด์ ๋ฐฑ์๋ ๋๋ฉ์ธ์ ์๋ธ๋๋ฉ์ธ์ผ๋ก ์ค์ ๊ฐ๋ฅํ๋ค.
what(๊ฒฐ๊ณผ) - To Be
์ฐ๋ฆฌ๋ ๊ฒฐ๊ตญ ์๋ธ๋๋ฉ์ธ์ ์ค์ ํ๋, ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ ํํ๋ค.
๊ทผ๋ฐ ์ด ๋ฐฉ๋ฒ.. AWS์ Route53์ ์ฌ์ฉํ๋๋ ๊ณผ๊ธ์ด ๋๋ค... ๋ฉ์ผ์ด ๋ ๋ผ์ด
๊ณง nginX ๋ฐฉ๋ฒ์ผ๋ก ๋ณ๊ฒฝํ ์ง๋ ๋ชจ๋ฅธ๋ค.
๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ๋ค์ ๊ธฐ๋กํ์.
๐ก ์๋กญ๊ฒ ์๊ฒ๋ ์
- ๋์ผ ์ถ์ฒ์ ๋์ผ ์ฌ์ดํธ ๊ฐ์ ์ฐจ์ด์ ๋ํด์ ์ ๋๋ก ์๊ฒ ๋์๋ค.
- ๋์ผ ์ถ์ฒ: ์คํด + ๋๋ฉ์ธ + ํฌํธ๊น์ง ์ผ์นํด์ผ ํ๋ค.
- ๋์ผ ์ฌ์ดํธ: ์คํด + eTLD+1 ๊น์ง๋ง ์ผ์นํ๋ฉด ๋๋ค(ํฌํธ ๋ฌ๋ผ๋ ๋จ)
์ถ์ฒ
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie - SameSite=Strict ๋
- https://web.dev/articles/same-site-same-origin?hl=ko - ๋์ผ ์ถ์ฒ? ๋์ผ ์ฌ์ดํธ?
- https://apidog.com/kr/blog/http-host-header-2/ - Host ํค๋๋ ๋ฌด์์ธ๊ฐ?
- https://seungyong.tistory.com/83 - ๊ฐ์ SameSite ์ด์๋ฅผ ๊ฒช์ ๋ธ๋ก๊ฑฐ
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SSL ์ธ์ฆ์ ๋ฐ๊ธ๊ณผ IP ์ฃผ์ (0) | 2025.03.03 |
---|---|
๋ฐฐํฌ๋ฐฉ๋ฒ ๊ณ ๋ฏผ - EC2 + NginX vs CloudFront + S3 (0) | 2025.01.11 |
npx? npm? pnpm? (2) | 2024.11.10 |
๋ชจ๋ฌ์ฐฝ ๊ตฌํํ๊ธฐ - RootLayout์ ์์น vs createPortal (0) | 2024.07.10 |
Next.js Server-Action๊ณผ ๋๊ด์ ์ ๋ฐ์ดํธ (0) | 2024.07.02 |