๊ฐ์
์์ ํ๋ก์ ํธ์ฒ๋ผ, ์ด๋ฒ ํ๋ก์ ํธ์์๋ ํ๋ก ํธ์๋ ํ์ด Vercel ์ ๋ฐฐํฌ๋ฅผ ํ์์ต๋๋ค. ๋ฐฐํฌ๋ Vercel ํ์ด์ง์์๋ HTTPS ํต์ ์ ์ฌ์ฉํด์ผ ํ๊ณ , ์์ฒญ์ ๋ณด์ ์ฒ๋ฆฌ ํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์, HTTPS ํต์ ์ผ๋ก API ์์ฒญ์ ๋ฐ์ ์ ์์ด์ผ ํ์ต๋๋ค.
๋ฐฑ์๋ API ์๋ฒ์ ์ง์ HTTPS ํต์ ์ ๊ดํ ์ค์ ํ ์ ์์ง๋ง, ๊ทธ๋ ๊ฒ ํ์ง ์๊ณ SSL Termination ์ด๋ผ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ต๋๋ค. ์คํ๋ก๋ฉ(Offloading)์ ์์คํ ์ ํน์ ์์ ์ด๋ ์ฒ๋ฆฌ๋ฅผ ๋ค๋ฅธ ์์คํ , ์ฅ์น ๋๋ ํ๋ก์ธ์ค๋ก ์ด์ ํ์ฌ ๋ฉ์ธ ์์คํ ์ ๋ถํ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ธฐ์ ์ ๋๋ค. ๋ฐฑ์๋ ์๋ฒ์ ๊ณตํต๋ ์๋จ์ ํ ๊ณณ์์ SSL ๊ด๋ จ ์ฒ๋ฆฌ๋ฅผ ๋ชจ๋ ์งํํ๋ ๊ฒ์ ๋๋ค. SSL Termination์ SSL Offloading์ ํ ํํ๋ก, SSL/TLS ์ฐ๊ฒฐ์ด ๋ก๋ ๋ฐธ๋ฐ์๋ ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ์ ๊ฐ์ ์ค๊ฐ ์ฅ์น์์ ์ข ๋ฃ๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์์ ํ๋ก์ ํธ์์๋ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ํ์ฉํ์ฌ SSL Termination ์ฒ๋ฆฌํ์์ต๋๋ค.
https://programmer-may.tistory.com/176
์๋ฒ์ HTTPS ์์ฒญ ๋ณด๋ด๊ธฐ 1ํธ - (feat. Mixed Content ์๋ฌ ํด๊ฒฐ)
๊ฐ์์ต์ข ์ ์ผ๋ก ํ๋ก ํธ์๋์ ๋ฐฑ์๋์ ์์ ์ด ๋๋ ํ ์คํธ๋ฅผ ํด๋ณด๊ธฐ ์ํด, Vercel์ ๋ฐฐํฌ๋ ์น ํ์ด์ง์์ ํ ์คํธ ์๋ฒ EC2 ์ธ์คํด์ค API ์์ฒญ์ ๋ณด๋๋ค. ํ์ง๋ง ์ฐ๋ํ์๋ง์ ์๋ฌ๋ฅผ ๋ง๋ ์ ์
programmer-may.tistory.com
(์ด์ ํ๋ก์ ํธ ํธ๋ฌ๋ธ ์ํ ํฌ์คํ - ALB ๋ฅผ ์ด์ฉํ์ฌ Mixed Contents ์๋ฌ ํด๊ฒฐ)
ALB๋ฅผ ํ์ฉํ๋ฉด, AWS ๋ชจ๋์ ํ๋ ๋ ์ฌ์ฉํ๋ฏ๋ก์จ ๋น์ฉ์ด ๊ณผ๋ค ์ฒญ๊ตฌ๋ ์์๊ธฐ์, ๋น์ฉ ์ ๊ฐ ์ธก๋ฉด์์ ์ ๋ฒ ํ๋ก์ ํธ์๋ ๋ฐฉ์์ผ๋ก SSL Termination ์ฒ๋ฆฌํ ๊ฒ์ ํ์ ์๊ฒฌ ์ดํํ์ต๋๋ค. ํ ๋ด์์ ์ธํ๋ผ ๋ด๋น์ด ์ ํผ์์ด๋ ์ ์ ์๊ฒฌ์ ๋ฐ๋ฅธ๋ค๊ณ ํ์๊ณ , ๋น์ฉ๋ ์ ๊ฐํ ์ ์์ด์ ์ข๋ค๊ณ ํ์ต๋๋ค.
ALB๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ์คํ์์ค ์น์๋ฒ๋ฅผ ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ๋ก ๊ตฌ์ถํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ ํ์ฉ : ์ํ์น ํน์ NGINX ๋ฅผ ๊ตฌ๋์์ผ ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ๋ฅผ ๋ง๋ค์ด ๋ฐฑ์๋ ์๋ฒ์ ์์ฒญ์ด ์ค๋ฉด ๋จผ์ ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ์์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ์๋ Let's Encrypt ๊ฐ์TLS/SSL ์ธ์ฆ์๋ฅผ ์ฝ๊ฒ ๊ฐ์ ธ์ค๊ณ ์ค์นํ ์ ์๋ CA(์ธ์ฆ ๊ธฐ๊ด)์์ ์ ๊ณตํ๋ ์ธ์ฆ์๋ฅผ ์ค์ ํ์ฌ SSL Termination์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ์์ HTTP ์์ฒญ์ ๋ฐ์ผ๋ฉด HTTPS ์์ฒญ์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธ ์ํค๊ณ , HTTPS ์์ฒญ์ ๋ฐ์ผ๋ฉด SSL Termination ํ ํ ํ๋ฌธ ์์ฒญ์ Path ๋ง๋ ๋ฐฑ์๋ ์๋ฒ์ ํฌ์๋ฉ ํด์ฃผ๊ฒ ๋ฉ๋๋ค.
Apache HTTP Server VS NGINX
์์นญ ๊ฒฐ๊ณผ ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ๋ ์น์๋ฒ๋ก ์ฌ์ฉํ๋ ๋๋ฆฌ ์ฐ์ด๋ ์คํ ์์ค๋ ํฌ๊ฒ ์ํ์น HTTP ์๋ฒ์ ์์ง์์ค๊ฐ ์์์ต๋๋ค.
๋ ์ค์ ์ด๋ ๊ฒ์ ์ฌ์ฉํ ์ง ๊ณ ๋ฏผํ์ต๋๋ค. ์์ฒญ ์์ค ์๋ฒ์ ์ปค๋ฅ์ ์ ๋งบ์ด SSL Termination ํ๊ณ ์์ฒญ์ ๋ผ์ฐํ ํ ์ ๋์ ๋ชฉ์ ์ฑ๊ณผ, ๊ฐ๋ฒผ์ด ์ํคํ ์ฒ์ด๊ธฐ์ ์์ง์์ค๋ฅผ ์ ํํ์ต๋๋ค.
์ ์์ง์์ค๊ฐ ์ํ์น ์๋ฒ๋ณด๋ค ๊ฐ๋ณ๋ค๊ณ ํ ๊น์?
Apache HTTP Server
์์ฐจํผ ์๋ฒ๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ๋ฌ๊ฐ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๊ณ , ์ ์ปค๋ฅ์ ์ด ์๊ธธ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ํ ๋นํ๋ PREFORK ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฐ ๋ฐฉ์์ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ฒ ๋ฉ๋๋ค.
1. ์ปค๋ฅ์ ์๋ฆฝ์ keep-alive ํค๋๋ก ์ง์ ์ฐ๊ฒฐ์ ํ๊ฒ ๋๋ฉด ๋ฌด์ํ ๋ง์ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋๊ณ ๊ฒฐ๊ตญ C10K ๋ฌธ์ ๋ฅผ ๋ฐ์์ํต๋๋ค.
2. ์์ฒญ ๋ง๋ค ํ๋ก์ธ์ค๋ฅผ ํ ๋นํด์ CPU๊ฐ ์ฌ๋ฌ ํ๋ก์ธ์ค์ ์์ฒญ์ ํด๊ฒฐํ๋ฉด ์์ฃผ ์ปจํ ์คํธ ์ค์์นญ์ด ์ผ์ด๋๊ฒ ๋๊ณ , ํ๋ก์ธ์ค ์ปจํ ์คํธ ์ค์์นญ์ ๋์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค.
3. ์ฌ๋ฌ๊ฐ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ๋ ๋ชจ๋์ ์ง์ํด์ฃผ์ง๋ง, ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ด ๋ฌด๊ฑฐ์์ง๋๋ค.
NGINX
NGINX๋ ์ํ์น ์๋ฒ๋ฅผ ๋์ฒดํ๋ ค๊ณ ๋์จ ๊ฒ์ ์๋๋๋ค. ๋ณด์ํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค. ๋ง์ ์ปค๋ฅ์ ์ ์ ์ง๋ฅผ ํ ์ ์์๋๋ฐ, ์ด๋ ์์ง์์ค์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ ๋๋ถ์ ๋๋ค.
1. ์ปค๋ฅ์ ํ์ฑ, ์ปค๋ฅ์ ์ ๊ฑฐ ๊ทธ๋ฆฌ๊ณ ์๋ก์ด ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ด๋ฒคํธ๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, ์ด๋ฒคํธ๋ ํ์ ๋ด๊ธด ์ํ์์ ์์ปค ํ๋ก์ธ์ค๊ฐ ์ฒ๋ฆฌํ ๋๊น์ง ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋๊ธฐํ๊ณ ์์ปค ํ๋ก์ธ์ค๋ ํ๋์ ์ค๋ ๋๋ก ์ด๋ฒคํธ๋ฅผ ๊บผ๋ด์ ์ฒ๋ฆฌํด ๋๊ฐ๋๋ค.
2. ์์ปค ํ๋ก์ธ์ค๋ ๋ณดํต CPU์ ์ฝ์ด ์ ๋งํผ ์์ฑํฉ๋๋ค. ์ด๋ฌ๋ฉด ํ๋ก์ธ์ค ์ปจํ ์คํธ ์ค์์นญ์ด ์ผ์ด๋๋ ํ์๊ฐ ๋ํญ ์ค์ด CPU์ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
์ํ์น ์๋ฒ | ์์ง์์ค | |
์ํคํ ์ฒ | ํ๋ก์ธ์ค ๊ธฐ๋ฐ ๋ชจ๋ธ | ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ชจ๋ธ |
์์ ์ฑ | ๋๋ค(๊ฐ ์์ฒญ์ ๋ ๋ฆฝ๋ ํ๋ก์ธ์ค์์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์์ ์ฑ์ด ๋๋ค. ) | ๋น๊ต์ ๋ฎ๋ค(ํ ์์ปค ํ๋ก์ธ์ค์์ ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํ ์์ฒญ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ฉด ๋ค๋ฅธ ์์ฒญ์๋ ์ํฅ์ ๋ผ์น ์ ์๋ค.) |
์ฑ๋ฅ | ๋ง์ ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ ๋ ๋ฌด์ํ ๋ง์ ์ปจํ ์คํธ ์ค์์นญ์ด ์ผ์ด๋๋ฏ๋ก ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค. | ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ชจ๋ธ ๋๋ถ์ ๋ง์ ๋์ ์์ฒญ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค. |
๋ฉ๋ชจ๋ฆฌ | ์์ฒญ๋ง๋ค ํ๋ก์ธ์ค๋ฅผ ํ ๋นํ๋ ๊ตฌ์กฐ๋ผ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค. | ์ ์ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ ๋ค. |
ํ์ฅ์ฑ | ์ฌ๋ฌ ๋ชจ๋์ ์ถ๊ฐํ ์ ์์ด์ ํ์ฅ์ฑ์ ์ฉ์ดํ๋ค. ์์ง์์ค์ ๋นํด ์ ๊ณต๋๋ ๋ชจ๋์ด ๋ง๋ค. | ๋ฐํ์์ ๋ชจ๋์ ๋์ ์ผ๋ก ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์๋ค.(์์ปค ํ๋ก์ธ์ค๊ฐ ์ฌ๋ฌ ์์ฒญ์ ๋ด๋นํ๊ธฐ์ ๊ธฐ๋ฅ ์ถ๊ฐ๋ฅผ ํ๋ ค๊ณ ํ๋ฉด ์์ปคํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ฒ ๋์ด ์ง์ ๋ชจ๋์ ๋ง๋ค๊ธฐ ๊น๋ค๋กญ๋ค.) |
์ค์ | Apache์ ์ค์ ํ์ผ(httpd.conf ๋ฑ)์ ๋ณต์กํ ์ ์์ผ๋ฉฐ, ๊ณ ๊ธ ๊ธฐ๋ฅ ์ค์ ์ ์ํด ์์ธํ ๊ตฌ์ฑ์ด ํ์ํ ์ ์๋ค. | Nginx์ ์ค์ ํ์ผ(nginx.conf ๋ฑ)์ ๋น๊ต์ ๊ฐ๋จํ๊ณ ์ฝ๊ธฐ ์ฝ๋ค. |
์ฉ๋ | ๋์ ์ปจํ
์ธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค(Apache๋ PHP, Python, Perl ๋ฑ ๋์ ์ฝํ
์ธ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ชจ๋๊ณผ์ ํธํ์ฑ์ด ๋ฐ์ด๋๋ค.) ๋ชจ๋์ ํตํด ๋ณต์กํ ์ค์ ๋ฐ ๊ธฐ๋ฅ์ ์ฐ์ธ๋ค. |
์ฃผ๋ก ์ ์ ์ปจํ
์ธ ์ฒ๋ฆฌ(Nginx๋ ์ ์ ์ฝํ
์ธ (์ด๋ฏธ์ง, CSS, JavaScript ๋ฑ)๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ ๊ณตํ ์ ์๋ค.) ๋ฆฌ๋ฒ์ค ํ๋ก์ ๋ฐ ๋ก๋ ๋ฐธ๋ฐ์: Nginx๋ ๋ฆฌ๋ฒ์ค ํ๋ก์ ๋ฐ ๋ก๋ ๋ฐธ๋ฐ์๋ก์ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ฐํํ๋ค.(๋์ ์ค์ ๋ณ๊ฒฝ) |
์์ธํ ๋น๊ต ๋ด์ฉ์ ๋ฐ๋ก ๋ธ๋ก๊ทธ ํฌ์คํ ํ๊ธฐ์ ์๋ ํฌ์คํ ์ ์ฐธ๊ณ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
https://programmer-may.tistory.com/200
์ํ์น vs ์์ง์์ค
๊ฐ์๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ฉด์ ๋๋ฆฌ ์ฐ์ด๋ ์น์๋ฒ๋ก Apache HTTP Server, Nginx ๊ฐ ๋๋ฆฌ ์ฐ์ด์ง๋ง, ํ๋์ ์์๋ Nginx ์ ์์ฅ ์ ์ ์จ์ด Apache HTTP Server ๋ฅผ ๋ฐ์ด ๋์ด์ ์์ฅ ์ ์ ์จ์ด ๋ ๋์ Ng
programmer-may.tistory.com
๊ฒฐ๋ก
์ด๋ ๊ฒ ๋ณต์กํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฒ๋ ์๋๊ณ ์์ฒญ์ SSL Termination ํ๊ธฐ ์ํ ๋ชฉ์ ์ด๋ฏ๋ก ๊ฐ๋ณ๊ณ , ์ค๋ฒํค๋๊ฐ ์ ์ ๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ NGINX๋ฅผ ํ์ฉํ์ฌ ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ (Reverse Proxy Server)๋ฅผ ๊ตฌ์ถ ํ๊ธฐ๋ก ํ์ต๋๋ค.
๊ตฌ์ถ ๊ณผ์ ์ ์๋ ๋ธ๋ก๊ทธ์ ํฌ์คํ ํ์์ต๋๋ค.
https://programmer-may.tistory.com/196
SSL Termination ์ ์ํด NginX ๋ก ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ ๊ตฌ์ถํ๊ธฐ
๊ฐ์์์ ํ๋ก์ ํธ์์ Active Mixed Content ์๋ฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ฐฑ์๋ ์๋ฒ์ HTTPS ํต์ ์ด ๊ฐ๋ฅํด์ผ ํ์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด SSL Termination ๋ฐฉ์์ ์ฌ์ฉํ์๊ณ , SSL Termination ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
programmer-may.tistory.com
NGINX๋ฅผ ํ์ฉํ์ฌ ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ ์ค์ ์ ํ๋ฉด์ ๊ฒช์ ํธ๋ฌ๋ธ์ํ ๊ฒฝํ์ ์ด์ ๋ถํฐ ๊ณต์ ํ๊ฒ ์ต๋๋ค.
๐ ํธ๋ฌ๋ธ ์ํ 1
๋ฌธ์ ์ํฉ
ํ ์คํธ EC2 ์๋ฒ์ 8081 ํฌํธ์ ์คํ๋ง ๋ถํธ ์๋ฒ๋ฅผ ๋ฐฐํฌํ์๋๋ฐ, ์์ฒญ์ด ์๋ฒ๊น์ง ๋ฟ์ง ์๊ณ ์์์ต๋๋ค.
sudo ufw allow 8081
๋ฐฉํ๋ฒฝ ๋ฌธ์ ์ธ์ค ์๊ณ , 8081 ํฌํธ์ ๋ํ ๋ฐฉํ๋ฒฝ๋ ์ด์ด๋ณด๊ณ ๋ฐฉํ๋ฒฝ์ disable ํ์ง๋ง, ์๋ํ์ง ์์์ต๋๋ค.
์์
nginx -t
๋ช ๋ น์ด๋ฅผ ์ณ์ EC2 ์๋ฒ์์ ์คํ ์ค์ธ Nginx ์น ์๋ฒ์ ๋ก๊ทธ๋ฅผ ์ดํด๋ณด์์ต๋๋ค.
์์ธ
nginx: [warn] conflicting server name "api.yanabada.com" on 0.0.0.0:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ํ ์คํธ ๊ฒฐ๊ณผ ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ฌ์ต๋๋ค.
Nginx ์ค์ ํ์ผ(/etc/nginx/nginx.conf)์ ๊ตฌ๋ฌธ์ด ์ฌ๋ฐ๋ฅด๊ณ , Nginx ์ค์ ํ์ผ์ ๊ตฌ๋ฌธ ๊ฒ์ฌ์ ํ ์คํธ๊ฐ ์ฑ๊ณต์ ์ด๋ผ๊ณ ํ์ง๋ง ๋งจ์์ 80ํฌํธ์ ๋ํ ์๋ฒ ๋ค์์ด ์ถฉ๋์ ์ผ์ผํค๊ณ ์๋ค๊ณ ๊ฒฝ๊ณ ํ๊ณ ์์ต๋๋ค.
ํด๊ฒฐ
server {
listen 80;
server_name api.yanabada.com;
return 301 https://$server_name$request_uri;
}
server {
index index.html index.htm index.nginx-debian.html;
server_name api.yanabada.com;
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/api.yanabada.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/api.yanabada.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
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;
}
location /ws-stomp {
proxy_pass http://127.0.0.1:8081/ws-stomp;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
if ($host = api.yanabada.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name api.yanabada.com;
return 404; # managed by Certbot
}
๋งจ ์์ ๋งจ ์๋์ listen 80 ์ ๋ํ์ฌ ๊ฐ์ ์๋ฒ ๋ค์์ ๊ฐ๋ ์๋ฒ ๋ธ๋ก์ด ์์ด์ ์ด๊ฒ์ด ์ถฉ๋์ ์ผ์ผํค๋ ๊ฒ์ด์์ต๋๋ค. Nginx๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ ๋, ํน์ ์๋ฒ ๋ธ๋ก๊ณผ ์ฐ๊ด๋ ์ค์ ์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค. ๋์ผํ ์๋ฒ ์ด๋ฆ์ ๊ฐ์ง ์ฌ๋ฌ ์๋ฒ ๋ธ๋ก์ด ์กด์ฌํ๋ฉด, ์ด๋ ์๋ฒ ๋ธ๋ก์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ๋ ๊ณผ์ ์์ ํผ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ 80ํฌํธ์ ๋ํ ์๋ฒ๋ธ๋ก์ ํ๋ ์ง์์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
server {
listen 80;
server_name api.yanabada.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl ipv6only=on;
server_name api.yanabada.com;
ssl_certificate /etc/letsencrypt/live/api.yanabada.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.yanabada.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
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;
}
location /ws-stomp {
proxy_pass http://127.0.0.1:8081/ws-stomp;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
๊ฒฐ๊ณผ
์๋ฒ ๋ธ๋ก ์ถฉ๋์ ๋ํ ๊ฒฝ๊ณ ๋ ์๋ฒฝํ๊ฒ ํด๊ฒฐ๋์์ง๋ง, ์์ง๋ ์์ฒญ์ด ์คํ๋ง ์๋ฒ์ ์ค๊ณ ์์ง ์์์ต๋๋ค.
๐ ํธ๋ฌ๋ธ ์ํ 2
์์์ CORS ๋ฅผ ๊ณต๋ถํ์์ ๋ CORS ๋์ ๋ฐฉ์ ์ค ์ธ์ฆ๋ ์์ฒญ (Credentialed Request) ๋ฐฉ์์ด ์์์ต๋๋ค. JWT๋ฅผ ์ด์ฉํ์ฌ ์ฟ ํค๋ก ์๊ฒฉ ์ธ์ฆ์ ํ๋ ๊ฒฝ์ฐ ์ก์ธ์ค ํ ํฐ์ ์์ฒญ ํค๋์ Authorization ํ๋์ ์ค์ ํฉ๋๋ค. Authorization ํค๋๋ฅผ ํฌํจํ๊ธฐ ๋๋ฌธ์, ๋จ์ ์์ฒญ(simple request)์ด ์๋๋ฉฐ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ด ๋ฐ์ํฉ๋๋ค.
https://programmer-may.tistory.com/184
Network - CORS ์๋ฌ ๊ฐ๋ ๊ณผ ํด๊ฒฐ๋ฒ (Spring MVC, Spring Security)
์ด์ฌํ ๋ง๋ ํ๋ก์ ํธ๋ฅผ EC2์ ๋์ ์๋ฒ๋ฅผ ํ์ฑํ ์ํค๊ณ ํ๋ก ํธ ์๋์ ๋ก์ปฌ์์ ํ ์คํธ๋ฅผ ํด๋ณด๋ ค ํ๋๋ฐ, ๋ ์ฉ?! ํ์ด์ง์ ๋ฐ์ดํฐ๋ ๋ณด์ด์ง ์๊ณ , ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ผ๋ฉด ๋นจ๊ฐ ์๋ฌ๋ค๋ง ๊ฐ๋ํ
programmer-may.tistory.com
ํด๊ฒฐ
๋ฐ๋ผ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ Authorization ํค๋๊ฐ ํ์ํ๋ฐ, ์ด๋ ์์ง์์ค ์ค์ ํ์ผ์์๋ ํค๋๋ฅผ ๋ช ์ํด์ฃผ์ด์ผ ํ์ต๋๋ค.
๋ฆฌ๋ฒ์ค ํ๋ก์๋ก ๋์ํ๋ Nginx๋ ํด๋ผ์ด์ธํธ์ ๋ฐฑ์๋ ์๋ฒ ์ฌ์ด์ ์์นํ์ฌ ์์ฒญ์ ์ค๊ณํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Nginx๋ ํ๋ก์ ์์ฒญ์ ์ ๋ฌํ ๋, HTTP ์์ฒญ๊ณผ ์๋ต์ ์ต์ ํํ๊ธฐ ์ํด ํ์ ์๋ ํค๋๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ํค๋๋ฅผ ๋ช ์์ ์ผ๋ก ์ค์ ํ์ง ์์ผ๋ฉด, Nginx๊ฐ ์ด๋ฅผ ์ ๋ฌํ์ง ์๊ฑฐ๋ ๋ฌด์ํ ์ ์์ต๋๋ค.
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
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;
proxy_set_header Authorization $http_authorization; #Authorization ํค๋ ์ถ๊ฐ
๊ฒฐ๊ณผ
ํค๋๋ฅผ ๋ช ์ํ๊ณ ๋์ , ๋๋์ด ์คํ๋ง ๋ถํฐ ์๋ฒ์ ํต์ ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค. ํ์ง๋ง, WSS ์ฌ์ฉํ๋ ์ค์๊ฐ ํต์ ์ ์๋๋๊ณ ์์ง ์์ ๊ฑธ ํ์ธํ์์ต๋๋ค.
๐ ํธ๋ฌ๋ธ ์ํ 3
WSS ์ฌ์ฉํ๋ ์ค์๊ฐ ํต์ ์ ์๋๋์ง ์์ ๊ฒ๋ ํธ๋ฌ๋ธ ์ํ 2์ ๊ฐ์ ์ด์ ์์ต๋๋ค.
๋ฐ๋ก ํ์ํ ํค๋๊ฐ ๋๋ฝ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์์ ์น์์ผ ํ๋กํ ์ฝ์ ๊ณต๋ถํ์ ๋, ์น์์ผ ํ๋กํ ์ฝ๋ก ํต์ ํ๊ธฐ ์ํด์ HTTP/HTTPS ์์ฒญ์ ํตํด ์์ํ๋ค๊ณ ํ์ตํ์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ HTTP ์์ฒญ์ ๋ณด๋ด๊ณ , ์ด ์์ฒญ์ Upgrade ํค๋๋ฅผ ํฌํจํ์ฌ ์น์์ผ ํ๋กํ ์ฝ๋ก์ ์ ๊ทธ๋ ์ด๋๋ฅผ ์์ฒญํฉ๋๋ค.
https://programmer-may.tistory.com/191
๊ธฐ์ ์ฐ๊ณ ํ๋ก์ ํธ - ์ฑํ ๋๋ฉ์ธ : ์ค์๊ฐ ์ฑํ
๊ฐ์์ฌ๋ฌ ์๋น์ค๋ฅผ ๋ณด๋ค๋ณด๋ฉด ์ค์๊ฐ์ฑ์ด ์ค์ํ ์๋น์ค๋ค์ด ์์ต๋๋ค. ์๋๋ฐฉ๊ณผ ํจ๊ป ๊ฒจ๋ฃจ๋ ๊ฒ์์ด๋, ์ฃผ์์ด๋ ๊ฒฝ๋งค ๋ฑ๋ฑ ์ฌ๋ฌ๊ฐ์ง๋ฅผ ๋ ์ฌ๋ฆด ์ ์๋๋ฐ์. ๊ทธ์ค์ ์ฐ๋ฆฌ์๊ฒ ์น์ํ ์๋น์ค๋ก
programmer-may.tistory.com
Upgrade ํค๋: ์ด ํค๋๋ ํด๋ผ์ด์ธํธ๊ฐ HTTP ์ฐ๊ฒฐ์ WebSocket์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋ ค๊ณ ํ๋ค๋ ์ ํธ๋ฅผ ๋ณด๋ ๋๋ค. Connection ํค๋: ์ด ํค๋๋ ์ ๊ทธ๋ ์ด๋ ์์ฒญ์ด ์์์ ๋ํ๋ ๋๋ค.
Upgrade: websocket
Connection: Upgrade
ํด๊ฒฐ
location /ws-stomp {
proxy_pass http://127.0.0.1:8081/ws-stomp;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; #Upgrade ํค๋ ์ถ๊ฐ
proxy_set_header Connection "Upgrade"; #Connection ํค๋ ์ถ๊ฐ
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
๋ฐ๋ผ์ Upgrade ํค๋์ Connection ํค๋๋ฅผ ์ถ๊ฐํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์์ต๋๋ค. ์ถ๊ฐ์ ์ผ๋ก proxy_buffering off; ์ค์ ์ ํ์ฌ Nginx๋ ๋ฐฑ์๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต์ ๋ฒํผ๋งํ์ง ์๊ณ , ๊ณง๋ฐ๋ก ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๊ฒ ํด์ฃผ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก, Nginx๋ ๋ฐฑ์๋ ์๋ฒ๋ก๋ถํฐ ์๋ต์ ๋ฐ์ ๋ ์ด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋์คํฌ์ ๋ฒํผ๋งํ ํ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํฉ๋๋ค. ๋ฒํผ๋ง์ ํตํด Nginx๋ ํด๋ผ์ด์ธํธ์ ๋ฐฑ์๋ ์๋ฒ ๊ฐ์ ์๋ ์ฐจ์ด๋ฅผ ์ํํ๊ณ , ๋คํธ์ํฌ ๋์ญํญ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ฉฐ, ๋ฐฑ์๋ ์๋ฒ์ ๊ฐํด์ง๋ ๋ถํ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
proxy_buffering off; ์ค์ ์ ์ฌ์ฉํ๋ฉด Nginx๋ ๋ฐฑ์๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต์ ๋ฒํผ๋งํ์ง ์๊ณ , ์ฆ์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํฉ๋๋ค. ์ด๋ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ์ด ํ์ํ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, WebSocket ์ฐ๊ฒฐ, ์ค์๊ฐ ๋ฐ์ดํฐ ํผ๋, ์๋ฒ ์ผํธ ์ด๋ฒคํธ(Server-Sent Events) ๋ฑ์์๋ ๋ฒํผ๋ง์ ๋๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.
๊ฒฐ๊ณผ
๋จ์ API ์์ฒญ ๋ฟ์๋๋ผ ์ด์ ์ค์๊ฐ ์ฑํ ๊น์ง ์ ๋์ํ๋ ๊ฑธ ํ์ธํ ์ ์์์ต๋๋ค. ์ด๋ก์จ ์์ง์์ค ์ค์ ํ์ผ์ ๋ํ ๋ชจ๋ ํธ๋ฌ๋ธ์ ๋ํด์ ํด๊ฒฐ์ ์๋ฃํ์ต๋๋ค.
๋ง๋ฌด๋ฆฌํ๋ฉฐ
์ํ์น ์๋ฒ์ ์์ง์์ค๋ฅผ ๋น๊ต ๊ณต๋ถํ๋ฉด์ ํ์ CS๋ฅผ ๋ฐฐ์์ผํ๋ ์ด์ ๊ฐ ์๊ตฌ๋ ์๊ฐํ์ต๋๋ค. ํ๋ก์ธ์ค๋ฅผ ํ์ฉํ ์ค๊ณ์ ๊ธฐ๋ฅ ์ ๊ณต๋ฉด์์ ์ฐจ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ OS ๋ฅผ ๊ณต๋ถํ๋ ๊ฒ์ด ๋ง์ด ๋์์ด ๋์ต๋๋ค. ์ ํ๋ก์ธ์ค ์ปจํ ์คํธ ์ค์์นญ ๋น์ฉ์ด ๋์์ง, ์ ๋ง์ ํ๋ก์ธ์ค๋ ๋ง์ ์ฃผ์ ๊ณต๊ฐ์ ์ฐจ์งํ๊ฒ ๋๋์ง, CPU ๋ณ๋ ฌ์ฑ ๋ฑ ํ์ ๋ฐฐ์ด ๋ด์ฉ๋ค์ ์ ๋ชฉ์ํค๊ณ ์ดํดํ ์ ์์ด์ ๋ฟ๋ฏํ์ต๋๋ค.
๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ๋ฅผ ๊ตฌ์ถํ์ฌ Nginx ์ค์ ํ์ผ์ ๋ํ ํธ๋ฌ๋ธ์ํ ์ ์งํํ๋ ๊ณผ์ ์์ ๋ง์ ๊ฒ์ ๋ฐฐ์ฐ๊ณ ๊ฒฝํํ์ต๋๋ค. ๋จผ์ , Nginx์ ๋ค์ํ ์ค์ ์ต์ ๊ณผ ๊ทธ ์ญํ ์ ๊น์ด ์ดํดํ๊ฒ ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Authorization ํค๋์ WebSocket ๊ฐ์ ํน์ํ ์๊ตฌ์ฌํญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ํค๋ ์ค์ ์ด ํ์ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
ํธ๋ฌ๋ธ์ํ ๊ณผ์ ์์ ๊ฐ์ฅ ํฌ๊ฒ ๋๋ ์ ์ Nginx ์ค์ ์ ์์ ์ค๋ฅ๋ ๋๋ฝ๋ ์ค์ ์ด ํฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ํนํ, ๋์ผํ ์๋ฒ ์ด๋ฆ์ ๊ฐ์ง ์๋ฒ ๋ธ๋ก์ด ์ค๋ณต๋์ด ๋ฐ์ํ๋ ์ถฉ๋ ๋ฌธ์ ๋, ํน์ ํค๋๊ฐ ์ ๋๋ก ์ ๋ฌ๋์ง ์์ ๋ฐ์ํ๋ API ์์ฒญ ๋๋ฝ์ ํด๊ฒฐํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ํฌ์ํ์ต๋๋ค.
๋ถ์กฑํ ๋ถ๋ถ์ผ๋ก๋, ๋ณต์กํ ์ค์ ํ์ผ์ ๊ด๋ฆฌํ๊ณ ์ ์ง๋ณด์ํ๋ ๋ฐ ์์ด์ ์ฒด๊ณ์ ์ธ ์ ๊ทผ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ๋ํ, ์ค์๊ฐ ๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋ก๊ทธ ํ์ผ์ ํจ๊ณผ์ ์ผ๋ก ๋ถ์ํ๋ ๋ฅ๋ ฅ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๋๊ผ์ต๋๋ค.
'Web programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ํ์น vs ์์ง์์ค (0) | 2024.03.29 |
---|---|
SSL Termination ์ ์ํด NginX ๋ก ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ ๊ตฌ์ถํ๊ธฐ (0) | 2024.02.20 |
CORS ์๋ฌ ๊ฐ๋ ๊ณผ ํด๊ฒฐ๋ฒ (Spring MVC, Spring Security) (0) | 2023.12.20 |
Web programming : RESTful URL ์ค๊ณ ๊ท์น (0) | 2023.12.13 |
Web programming : RESTful API ๋ (0) | 2023.12.12 |
๋๊ธ