์๋ ํ์ธ์ Mambo ์ ๋๋ค.
์ค๋์ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ํ์ฉํ TLS ์คํ๋ก๋์ ๋ํด์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํฉ๋๋ค. ์ง๋ SSL ์ธ์ฆ์์์๋ HTTPS๋ฅผ ์น ์๋น์ค์ ์ ์ฉํ๋ ์ด์ ์ ํจ๊ป SSL ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๊ณ TLS ํธ๋์์ดํฌ๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ํํ๋์ง๋ฅผ ํ์ธํ์ต๋๋ค. ์ด ๊ธ์์๋ ์๋ง์กด ์น ์๋น์ค์ ELB(Elastic Load Balancing)์์ ์ง์ํ๋ TLS ํธ๋์์ดํฌ ๋ฐ TLS ์คํ๋ก๋ฉ ๊ธฐ๋ฅ์ ๋ํด ์์๋ณด๊ณ ์ฐธ๊ณ ํด์ผํ ์ ๋ณด๋ฅผ ์๊ฐํฉ๋๋ค.
SSL ์คํ๋ก๋ โ
TLS(SSL) ์คํ๋ก๋๋ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ์์ TLS ํธ๋์์ดํฌ๋ฅผ ์ํํ์ง ์๊ณ ํธ๋ํฝ์ด ์ ๋ฌ๋๊ธฐ ์  ๋ก๋๋ฐธ๋ฐ์์์ SSL ์ธ์ฆ์๋ฅผ ๊ด๋ฆฌํ๊ณ TLS ํธ๋์์ดํฌ๋ฅผ ์ํํ๋ ๊ฒ์ ๋งํฉ๋๋ค. ๋๋ถ๋ถ์ ์น ์๋น์ค๋ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ด์ฉํ์ง ์๊ณ ํธ๋ํฝ ๊ท๋ชจ์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ํ์ฅํ๊ณ ํ์ฅ๋ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ์ ํธ๋ํฝ์ ๊ท ๋ฑํ๊ฒ ๋ถ์ฐ์ํค๊ธฐ ์ํ์ฌ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ์๋ง์กด ์น ์๋น์ค์ ELB ๋ก๋๋ฐธ๋ฐ์ ์ ํ ์ค NLB์ ALB๋ SSL ์ธ์ฆ์๋ฅผ ๋ฑ๋กํ๊ณ ํด๋ผ์ด์ธํธ์ TLS ํธ๋์์ดํฌ๋ฅผ ์ํํ์ฌ ํธ๋ํฝ์ด EC2 ์ธ์คํด์ค ๋๋ ์ปจํ ์ด๋๋ก ์ ๋ฌํ๋ TLS ์คํ๋ก๋ฉ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.
Mutual TLS โ
์น ์๋น์ค์ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ์์๋ ํด๋ผ์ด์ธํธ์ X.509 ์ธ์ฆ์๋ฅผ ํ ๋๋ก ์ฌ์ฉ์ ์ธ์ฆ์ ์ํํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํด๋ผ์ด์ธํธ์ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ ๋ชจ๋ ์ธ์ฆ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ Mutual TLS๋ผ๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฐ ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ๋ javax.servlet.request.X509Certificate ์์ฑ์ ํตํด X.509 ์ธ์ฆ์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์น ์์ฒญ์ด ๋ก๋๋ฐธ๋ฐ์์ ์ํด ํธ๋ํฝ์ด ์ ๋ฌ๋๋ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ ์ธ์ฆ์๋ฅผ ํฌํจํ์ฌ ์ ๋ฌํ๋ ๊ฒ์ด ๋ณด์ฅ๋์ง ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก Nginx๋ฅผ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์์ฒญ ์ ํฌํจ๋ ํด๋ผ์ด์ธํธ์ ์ธ์ฆ์ ์ ๋ณด๊ฐ X-SSL-CERT์ ๊ฐ์ ๋นํ์ค ํค๋๋ก ์ ๋ฌ๋ ์ ์๋๋ก ์ค์ ํฉ๋๋ค. ์ด๋ ๊ฒ ์์ฒญ ํค๋๋ก ์ธ์ฆ์๋ฅผ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ๊น์ง ์ ๋ฌํ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์ค์  ์์ดํผ๋ฅผ ์๊ธฐ ์ํ์ฌ ์ฌ์ฉ๋๋ ํ์ค ํค๋ X-Forwarded-For์ ๋น์ทํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
AWS NLB โ
์๋ง์กด ์น ์๋น์ค์ NLB(Network Load Balancer)๋ L4 ๋ ๋ฒจ์ ELB ๋ก๋๋ฐธ๋ฐ์ ์ ํ์ ๋๋ค. NLB๋ L4 ๋ ๋ฒจ์์ ๋ก๋๋ฐธ๋ฐ์ฑ์ ์ํํ๋ฉฐ ํ๋กํ ์ฝ๊ณผ ํฌํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ง์ ๋ ํ๋ ์ด์์ ๋์ ๊ทธ๋ฃน์ผ๋ก ์์ฒญ์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ๋๊ท๋ชจ ํธ๋ํฝ์ ๋น ๋ฅด๊ฒ EC2 ์ธ์คํด์ค๋ก ์ ๋ฌ๋๋๋ก ์ง์ํฉ๋๋ค.
ELB์ ๋ก๋๋ฐธ๋ฐ์ ์ ํ ๋น๊ต์์ ๋์์๋ฏ์ด NLB๋ TLS ์คํ๋ก๋๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋ก๋๋ฐธ๋ฐ์์ ์ธ์ฆ์๋ฅผ ๋ฑ๋กํ๊ณ TLS ํธ๋์์ดํฌ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ๊ตฌ์ฑํ ์ ์๊ฒ ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด NLB์ ๋ฆฌ์ค๋ ์ค์  ์ TLS ํ๋กํ ์ฝ์ ์ ํํ๊ณ TLS ๋ฒ์ ๊ณผ ์ํธํ ์ค์ํธ ๋ชฉ๋ก์ ๋ํ ๋ณด์ ์ ์ฑ ๊ทธ๋ฆฌ๊ณ SSL ์ธ์ฆ์๋ฅผ ๋ฑ๋กํ ์ ์์ต๋๋ค.

ECC ์ธ์ฆ์ ๋ฏธ์ง์ โ
TLS ์คํ๋ก๋๋ฅผ ์ง์ํ๋ค๊ณ ๋์์์ง๋ง ๋ชจ๋ SSL ์ธ์ฆ์๋ฅผ ์ง์ํ๋ ๊ฒ์ ์๋๋๋ค. ํ์ฌ์์ ์ฌ์ฉ์ค์ธ ์ธ์ฆ์์ ๊ฐ์ ํ์ ๊ณก์ ํ ํค๋ฅผ ์ฌ์ฉํ๋ ECC ์ธ์ฆ์๋ฅผ ๋ฑ๋กํ๊ฒ ๋๋ฉด ์๋ง์กด ์น ์๋น์ค๋ก๋ถํฐ ์๋ฆผ์ ๋ฐ๊ฒ๋๊ณ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ๋ก ํธ๋ํฝ์ด ์ ๋ฌ๋์ง ์๋ ์ํ๊ฐ ๋ ์ ์์ต๋๋ค.

NLB์ ๋ํ ๋ฆฌ์ค๋ ์ค์  ๋ฌธ์๋ฅผ ์ดํด๋ณด๋ฉด 2048 ์ด์์ ๋นํธ๋ฅผ ์ฌ์ฉํ๋ RSA ํค ๋๋ EC ํค๋ก๋ ์ธ์ฆ์๋ฅผ ์ง์ํ์ง ์๋๋ค๋ผ๊ณ ๊ฒฝ๊ณ ํ๊ณ ์์ผ๋ฉฐ ๋ฌธ์๋ฅผ ์ดํด๋ณด๊ธฐ๊น์ง ์ด๋ฌํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ ๊ณณ์ ์์์ต๋๋ค.

์์ธ๋ก ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ ECC ์ธ์ฆ์์ ๋ํด์๋ NLB์์ TLS ์คํ๋ก๋๋ฅผ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ์์ SSL ์ธ์ฆ์๋ฅผ ๊ด๋ฆฌํ๊ณ TLS ํธ๋์์ดํฌ๋ฅผ ์ํํด์ผํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ ๋ฐฐํฌ ์ Elastic Beanstalk์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Java SE ํ๋ซํผ์ ํตํด EC2 ์ธ์คํด์ค์ Nginx๋ฅผ ํ์ฉํ์ฌ ์ญ๋ฐฉํฅ ํ๋ก์๋ฅผ ๊ตฌ์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ์์ TLS ํธ๋์์ดํฌ๋ฅผ ์ํํด์ผํ๋ ๊ฒ์ ์๋๋๋ค.
ํ์ฌ์์ ์ด์์ค์ธ ์น ์๋น์ค๋ Nginx๋ฅผ ์ฌ์ฉํ์ง ์๊ณ NLB์์ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ๋ก ํธ๋ํฝ์ด ์ ๋ฌ๋๋๋ก ๊ตฌ์ฑํ์์ง๋ง ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ ๊ท๋ชจ๊ฐ ์ปค์ง์ผ๋ก ์ธํ์ฌ ๋ด๋ถ์ ์ผ๋ก ๋์ํ๋ ์์ ์ด ๋ง์์ง์ ๋ฐ๋ผ TLS ํธ๋์์ดํฌ ๋ถํ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ์์ ๋ถ๋ฆฌํ๊ธฐ ์ํ์ฌ Nginx์์ TLS ์คํ๋ก๋๋ฅผ ์ํํ๋๋ก ์ ํํ ์์ ์ ๋๋ค.
AWS ALB โ
ECC ์ธ์ฆ์๋ฅผ ์ง์ํ์ง ์๋ NLB์ ๋ค๋ฅด๊ฒ ALB(Application Load Balancer)๋ 4096 ๋นํธ ํค ๊ธธ์ด์ RSA ์ธ์ฆ์์ ECDSA๋ก ์๋ช ๋ EC ์ธ์ฆ์๋ฅผ ์ง์ํฉ๋๋ค. ํ์ฌ์์ ์ด์์ค์ธ ์น ์๋น์ค๋ฅผ NLB์์ ALB๋ก ์ ํํ์ง ์๋ ์ด์ ๋ ์์ ํ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๊ฐ ์๋๋ฏ๋ก ๊ฒฝ๋ก ๊ธฐ๋ฐ์ผ๋ก ๋ณ๋์ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ๋ก ์ ๋ฌํด์ผํ๋ ์๊ตฌ์ฌํญ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ธํด ๋น ๋ฅด๊ฒ ๋ก๋๋ฐธ๋ฐ์์์ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ๋ก ํธ๋ํฝ์ด ์ ๋ฌ๋๋๋ก NLB๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
IT ๋ถ์ผ๋ ์๊ฐ์ด ์ง๋๋ฉด์ ๊ธฐ์ ์ด ์ ์ฐจ ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ์๋ง์กด ์น ์๋น์ค๊ฐ ์ ๊ณตํ๋ ์๋น์ค ๊ธฐ๋ฅ๋ ๋ฐ์ ํ๊ณ ์์์ ํ์ธํ ์ ์๋๋ฐ 2019๋ ์ ์์ฑ๋ ๊ณ ์  ์ธ์  ๊ด๋ จ ๊ธ์์๋ NLB๊ฐ ๊ณ ์  ์ธ์  ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๋๋ค๊ณ ๋์์์ง๋ง ํ์ฌ ELB์ ์ ํ ๋น๊ตํ์ ๋น๊ตํด๋ณด๋ฉด ๋ฐฑ์๋ ์ํธํ, ๊ณ ์  ์ธ์  ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ๊ธฐ๋ฅ์ ์ง์ํ๊ณ ์์ต๋๋ค.
ELB TLSv1.3 ๋ฏธ์ง์ โ
์๋ง์กด ์น ์๋น์ค์ ELB์์ TLS ์คํ๋ก๋ ๊ธฐ๋ฅ์ ์ง์ํ์ง๋ง ๋ณด์ ์ ์ฑ ์ ๋ฐ๋ผ TLS ํธ๋์์ดํฌ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๋ TLS 1.3์ ์ฌ์ฉํ ์ ์์ต๋๋ค. TLS 1.3์ ์ง์ํ๊ธฐ ์ํ ์์ ์ ์์ง ์งํ์ค์ด๋ฏ๋ก ํด๋ผ์ด์ธํธ์๊ฒ TLS 1.3์ ์ง์ํ๊ณ ์ํ๋ ๊ฒฝ์ฐ์๋ ELB์์ TLS ์คํ๋ก๋๋ฅผ ์ํํ๋๋ก ๊ตฌ์ฑํ ์ ์๊ณ NLB์ TCP ๋ฆฌ์ค๋๋ฅผ ์ค์ ํ์ฌ ํธ๋ํฝ์ด EC2 ์ธ์คํด์ค๋ก ์ ๋ฌ๋๋๋กํ๊ณ EC2 ์ธ์คํด์ค์ ์คํ๋์ด์๋ Nginx๋ฅผ ํตํด TLS 1.3์ ์ฌ์ฉํ ์ ์๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
Elastic Beanstalk TLS ์คํ๋ก๋ โ
ELB์์๋ TLS 1.3์ ์ง์ํ์ง ์์ผ๋ฉฐ NLB์์๋ ECC ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์์์ผ๋ฏ๋ก Elastic Beanstalk์ผ๋ก ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์  ๋ฐฐํฌ ์ Nginx์์ SSL ์ธ์ฆ์๋ฅผ ๊ด๋ฆฌํ๊ณ ํด๋ผ์ด์ธํธ๊ฐ TLS 1.3 ๋ฒ์ ์ผ๋ก TLS ํธ๋์์ดํฌ๋ฅผ ์ํํ ์ ์๋๋ก ํ ์ ์๋๊ฐ๋ฅผ ๊ฒ์ฆํด๋ณด๊ณ ๋ง๋ฌด๋ฆฌ ํ๊ฒ ์ต๋๋ค.
Elastic Beanstalk Java SE ํ๋ซํผ โ
์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ธฐ ์ํด์๋ Java SE ํ๋ซํผ ํ๊ฒฝ์ ๊ตฌ์ฑํด์ผํฉ๋๋ค. ์ด๋, ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก Beanstalk ํ๊ฒฝ์ ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.


Beanstalk ํ๊ฒฝ ๊ตฌ์ฑ ์ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์ค์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ถ๊ฐ ์ต์  ๊ตฌ์ฑ์ ํตํด ์ฌ์ฉ์ ์ ์ ์ค์ ์ ์งํํด์ผ ํฉ๋๋ค.

๋ฐฐํฌํ๊ณ ๋ณด๋ ์คํ๊ฐ ์์๋ค์ ๐


๊ทธ๋ฆฌ๊ณ EC2 ์ธ์คํด์ค ์ ๊ทผ์ ์ํ ํค๋ฅผ ์ค์ ํ๋ ๋ฑ ๋ถ๊ฐ ์ค์ ์ ํ๊ณ ํ๊ฒฝ์ ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐฐํฌ๋๋ ํ๊ฒฝ์ด ์ค๋น๋ฉ๋๋ค.

์ฒ์ ํ๊ฒฝ์ ๊ตฌ์ฑํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ Beanstalk์์๋ ํ๊ฒฝ ์ญ์  ๋ฒํผ์ด ํ์ฑํ๋์ง ์์ ๋นํฉํ ์ ์์ผ๋ CloudFormation ์๋น์ค๋ก ์ด๋ํ์ฌ Beanstalk ํ๊ฒฝ์ ๊ตฌ์ฑ์ค์ธ ์คํ์ ์ญ์ ํ ์ ์์ต๋๋ค.
์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์  ํจํค์ง ๋ฐ Java SE ํ๋ซํผ ํ์ฅ โ
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ธฐ ์ํ Java SE ํ๋ซํผ์ด ์์ฑ๋์์ผ๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ํจํค์งํ์ฌ Beanstalk์ ๋ฐฐํฌํ๊ธฐ ์ํ ์์ค ๋ฒ๋ค ํ์ผ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์์ค ๋ฒ๋ค์๋ ํจํค์ง๋ ์ ํ๋ฆฌ์ผ์ด์  Jar ํ์ผ๊ณผ ํจ๊ป ์ ํ๋ฆฌ์ผ์ด์  ์คํ๋ฅผ ์ํ Procfile์ ํฌํจ์์ผ์ผ ํฉ๋๋ค.
task procfile(dependsOn: bootJar) {
    doFirst {
        new File("build/libs", "Procfile").text = "web: java -Xmx1g -Dfile.encoding=UTF-8 -jar ${bootJar.archiveName}"
    }
}
task awsbuild(type: Zip, dependsOn: procfile) {
    from ('.beanstalk/.ebextensions') { into '.ebextensions' }
    from ('.beanstalk/.platform') { into '.platform' }
    from ('build/libs') {
        include('Procfile')
        include(bootJar.archiveName)
    }
    baseName = 'beanstalk'
}์์ธํ ๋ด์ฉ์ Procfile์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์  ํ๋ก์ธ์ค ๊ตฌ์ฑ์ ์ฐธ๊ณ ํ์ธ์.
Java SE ํ๋ซํผ ํ์ฅ ๊ตฌ์ฑ โ
Beanstalk๋ .ebextensions์ .platform์ ํ์ฉํ์ฌ EC2 ์ธ์คํด์ค ํ๊ฒฝ์ ํ์ฅํ ์ ์๋ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ HTTP๋ก ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ์ ํจ๊ป TLS ์คํ๋ก๋๋ฅผ ์ํํ Nginx๋ฅผ ๊ตฌ์ฑํด์ผํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ ๋ฐ ํ๋ซํผ ํ์ฅ ํ์ผ์ ์์ฑํฉ๋๋ค.
Nginx์์ ์ฌ์ฉํ SSL ์ธ์ฆ์ ํ์ผ ์์ฑ
files:
    /etc/nginx/cert/server.crt:
        mode: "000400"
        owner: nginx
        group: nginx
        content: |
            -----BEGIN CERTIFICATE-----
            #### PROTECTED ####
            -----END CERTIFICATE-----
    /etc/nginx/cert/server.key:
        mode: "000400"
        owner: nginx
        group: nginx
        content: |
            -----BEGIN EC PARAMETERS-----
            #### PROTECTED ####
            -----END EC PARAMETERS-----
            -----BEGIN EC PRIVATE KEY-----
            #### PROTECTED ####
            -----END EC PRIVATE KEY-----
    /etc/nginx/cert/server-ca-bundle:
        mode: "000400"
        owner: nginx
        group: nginx
        content: |
            -----BEGIN CERTIFICATE-----
            #### PROTECTED ####
            -----END CERTIFICATE-----
            -----BEGIN CERTIFICATE-----
            #### PROTECTED ####
            -----END CERTIFICATE-----
            -----BEGIN CERTIFICATE-----
            #### PROTECTED ####
            -----END CERTIFICATE-----
commands:
    00-chain-ca-bundle:
        cwd: /etc/nginx/cert
        command: |
            cat server.crt server-ca-bundle > server-ca.pem
            chown nginx:nginx server-ca.pem
            chmod 400 server-ca.pem
    99-remove-bak:
        cwd: /etc/nginx/cert
        command: rm -f *.bakํ์ฌ ๋๋ฉ์ธ์ ๋ํ ์ธ์ฆ์์ด๋ฏ๋ก ์ธ์ฆ์ ๋ด์ฉ์ ๋ง์คํน ์ฒ๋ฆฌํ์์ต๋๋ค.
Nginx ์ค์  ํ์ผ ํ์ฅ
location / {
    return 301 https://$host$request_uri;
}๊ธฐ๋ณธ์ผ๋ก ๋ง๋ค์ด์ง๋ 00_application.conf ํ์ผ์ 80 ํฌํธ์ ๋ํ์ฌ 5000 ํฌํธ๋ก ์ ๋ฌ๋๋๋ก ๊ตฌ์ฑํ๋ฏ๋ก 443 ํฌํธ๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋๋ก ํ์ฅํฉ๋๋ค.
user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    32768;
events {
    use  epoll;
    worker_connections  1024;
}
http {
    include         /etc/nginx/mime.types;
    default_type    application/octet-stream;
    log_format      main    '$remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for"';
    include conf.d/*.conf;
    map $http_upgrade $connection_upgrade {
      default     "upgrade";
    }
    server {
        listen                80 default_server;
        access_log            /var/log/nginx/access.log main;
        client_header_timeout 60;
        client_body_timeout   60;
        keepalive_timeout     60;
        gzip                  off;
        gzip_comp_level       4;
        gzip_types            text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
        # Include the Elastic Beanstalk generated locations
        include conf.d/elasticbeanstalk/*.conf;
    }
    server {
        listen                   443 ssl default_server;
        server_name              springboot;
        ssl_certificate          /etc/nginx/cert/server-ca.pem;
        ssl_certificate_key      /etc/nginx/cert/server.key;
        ssl_protocols            TLSv1.2 TLSv1.3;
        ssl_ciphers              HIGH:!aNULL:!MD5;
        ssl_verify_client        optional_no_ca;
        location / {
            proxy_pass          http://127.0.0.1:5000;
            proxy_http_version  1.1;
            proxy_set_header    Connection          $connection_upgrade;
            proxy_set_header    Upgrade             $http_upgrade;
            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-SSL-CERT          $ssl_client_escaped_cert;
            proxy_buffering     off;
        }
    }
}์์ธํ ๋ด์ฉ์ Elastic Beanstalk Linux ํ๋ซํผ ํ์ฅ์ ์ฐธ๊ณ ํ์ธ์. elastic-beanstalk-samples์ฒ๋ผ ์ํ ํ์ผ๋ ๊ณต์ ๋์ด์์ต๋๋ค.
์ด์  ์ํ ์ ํ๋ฆฌ์ผ์ด์  ๋์ ์ฐ๋ฆฌ๊ฐ ์ค๋นํ ์ ํ๋ฆฌ์ผ์ด์  ์์ค ๋ฒ๋ค์ ์ ๋ก๋ํ๋ฉด Benstalk ์์ง์ด ์์ค ๋ฒ๋ค์ ์ถ์ถํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ฒ ๋ฉ๋๋ค. Route 53์ผ๋ก Beanstalk ํ๊ฒฝ ์ฃผ์๋ฅผ DNS๋ก ์ฐ๊ฒฐํ๊ณ ์ ์ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด TLS ํธ๋์์ดํฌ๊ฐ ์ํ๋์์์ ํ์ธํ ์ ์์ต๋๋ค.

NLB๋ ํธ๋ํฝ์ EC2 ์ธ์คํด์ค์ 443 ํฌํธ๋ก ์ ๋ฌํ์ ๋ฟ TLS ์คํ๋ก๋๋ Nginx์์ ์ํํ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑํ๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์์๋ TLS 1.3 ๋ฒ์ ์ผ๋ก TLS ํธ๋์์ดํฌ๋ฅผ ์ํํ์ต๋๋ค. ์ด๋ ๊ฒ ์๋ง์กด ์น ์๋น์ค์์ TLS 1.3์ ์ง์ํ๊ธฐ ์ํด์๋ NLB์ TCP ๋ฆฌ์ค๋์ Nginx์ TLS ์คํ๋ก๋๋ฅผ ํ์ฉํ๋ฉด ๊ฐ๋ฅํจ์ ๊ฒ์ฆํ์ต๋๋ค.
ํธ๋ฌ๋ธ์ํ โ
Elastic Beanstalk๋ก ์ ํ๋ฆฌ์ผ์ด์  ๋ฐฐํฌํ๋ ๊ณผ์ ์์ ์๊ฐ๋ณด๋ค ์ค๋ฅ๊ฐ ๋ง์ ์ ์์ต๋๋ค. ์ด ๋ด์ฉ์ Benstalk์์ ์ ํ๋ฆฌ์ผ์ด์  ๋ฐฐํฌ ์ ๋ฐ์ํ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ ๋์์ด ๋๋ ํญ๋ชฉ์ ์ ๋ฆฌํ ๊ฒ์ ๋๋ค. ๋ฐ๋ผํด๋ณด๋ ๋ถ๋ค์๊ฒ ๋์์ด ๋์ จ์ผ๋ฉด ํ๋ ๋ฐ๋จ์ผ๋ก ๊ณต์ ํฉ๋๋ค.
| ๊ฒฝ๋ก | ์ฉ๋ | |
|---|---|---|
| /etc/nginx/ | Nginx ๊ตฌ์ฑ | |
| /var/app/current | ์ ํ๋ฆฌ์ผ์ด์  ์์ค ๋ฒ๋ค ์ถ์ถ ๊ฒฝ๋ก | |
| /var/log/eb-engine.log | Beanstalk ๋ก๊ทธ | |
| /var/log/nginx | Nginx ๋ก๊ทธ | |
| /var/log/web.stdout.out | ์น ์ ํ๋ฆฌ์ผ์ด์  ๋ก๊ทธ | 
Beanstalk ๋ก๊ทธ๋ Beanstalk ์์ง์ด ํ๋ซํผ ํ์ฅ ํ์ผ๋ค์ ์คํํ๊ณ ์ฑ๊ณตํ๋์ง ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ์ด ๋ก๊ทธ๋ฅผ ํตํด ์ด๋ ๋จ๊ณ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์  ๋ฐฐํฌ ๋ฐ ์ ํ์ด ์คํจํ์๋์ง ํ์ธํ ์ ์๋ ์ค์ํ ๋ก๊ทธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง ํญ๋ชฉ์ ํตํด ์ค์ ํ ๊ตฌ์ฑ ๋ฐ ํ์ฅ ํ์ผ์ด ์ ๋๋ก ์ถ์ถ๋์ด ๋ณต์ฌ๋์๋์ง Nginx๊ฐ ELB์ ์ํด ์ ๋ฌ๋ ํธ๋ํฝ์ ์ ํ๋ฆฌ์ผ์ด์ ๊น์ง ์ ๋ฌํ ์ ์๋์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
Nginx์ ๋ํด์ ์์ธํ ์๋ ๊ฒ์ ์๋๋ฏ๋ก ์ค์  ํ์ผ์ด ์๋ชป๋ ๋ถ๋ถ์ด ์์ ์ ์์ผ๋ ์ํด ๋ฐ๋ผ๋ฉฐ ์๋ชป๋ ์ ์ ํจ๋๋ฐฑ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.