Http ๋ ์น์๋ฒ์ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ฌ์ด์ ๋ฌธ์๋ฅผ ์ ์กํ๊ธฐ ์ํ ํ๋กํ ์ฝ์ ๋๋ค. ์ด ํ๋กํ ์ฝ์ ์๋ฒ์ ์ฃผ๊ณ ๋ฐ์ ์ ๋ณด๊ฐ ์ํธํ ๋์ด์์ง ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋๋ ๋นํ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋์จ ๊ฒ์ด Http + SSL ์ด ํฉ์ณ์ง ํ๋กํ ์ฝ์ด๋ค. SSL(๋ณด์ ์์ผ ๊ณ์ธต)์ ์ฌ์ฉํจ์ผ๋ก์จ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ๋ Https๋ ๋ณด์์์๋ง ์ด๋์ ๋ณด๋๊ฒ์ด ์๋๋ผ ๊ฒ์์ค์ง ์ต์ ํ์์์ด์๋ ์ด๋์ ๋ณธ๋ค.
Http ๋ ํต์ ํ๊ธฐ ์ํด 3 way handshake๋ฅผ ํ๋ค. ๊ทธ ํ Secure Socker Layer ์ ํต์ ์์ ๋จ๊ณ์์ ๋ค์ HandShake ๊ณผ์ ๊ฑฐ์น๋ค.
SSL ๋จผ์ TCP ์์ด์ ๋์ํ๊ธฐ ๋๋ฌธ์ TCP ์ฐ๊ฒฐ์ด ๋จผ์ ์ฑ๋ฆฝ๋์ด์ผ ํ๋ค.
- ์์ ์ด ์ฌ์ฉํ ์ ์๋ Cipher Spec(์ํธํ ๋ฐฉ๋ฒ) ๋ชฉ๋ก ์ ๋ณด๋ธ๋ค.
- Clinet Nonce(๋์) ๋ณด๋ธ๋ค. ๋์๋ฅผ ๋ณด๋ด๋ ์ด์ ๋ ํต์ ๋ด์ฉ์ ํต์งธ๋ก ๊ฐ์ ธ๊ฐ ๋ณต์ฌํ๋ ํ์๋ฅผ ๋ง๊ธฐ์ํด์ ์ด๋ค. ์์ ์๋ณ์์ ๊ฐ์ ์ ๋ณด๋ค์ด ๋ถ๊ฐ์ ์ผ๋ก ์ ์ก๋๋ค.
- Client ๊ฐ ๋ณด๋ธ ClinetHello ํจํท์ ์ฒ๋ฆฌํ ํ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ Ciper Spec ์ค ํ๋๋ฅผ ์ ํํ ํ Client ์๊ฒ ์๋ฆฐ๋ค.
- Server Certificate(์ธ์ฆ์ (๊ณต๊ฐํค))
- Server Nonce
- CA ๊ฐ Certificate๊ฐ ๋๊ตฌ์ ์์ ์ธ์ง ๋ณด์ฆํ๋ฏ๋ก, ์ด๊ณผ์ ์์ ์๋ฒ๋ Client์๊ฒ ์์ ์ ์ธ์ฆํ ์ ์๋ค. ์ฆ, Client๋ ์์ ์ด ์ต์ด์ ์๋ํ๋ Server์ ํต์ ํ๊ณ ์์์ ์ด ๊ณผ์ ์์ ํ์ธํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
- Encrypted Pre-master secret (PMS)
Client์์ ์ผ์ข ์ ๋์ ๊ฐ์ธ Pre-master secret(PMS)(server์ ํต์ ํ ๋์นญํค๋ก ํ์ฉํ ๊ฐ)๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ Server์ Publiuc Key๋ก ์ํธํํ์ฌ Server๋ก ์ ์กํฉ๋๋ค.
์ดํ Client์ Server๋ {PMS, Client Nonce, Server Nonce} ์ด ์ธ ๊ฐ์ ๋ฐํ์ผ๋ก ๊ฐ๊ฐ Encryption Key์ MAC Key๋ฅผ ๊ณ์ฐํฉ๋๋ค.
Encryption Key๋ ์ถํ ์ฌ์ฉ๋ ์ํธํ ํต์ ์์ ์ฌ์ฉํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ฉ๋ Key์ด๊ณ ,
MAC(Message Authentication Code) Key๋ ๊ฐ SSL Message Block์์ Message์ HMAC๊ฐ ๊ณ์ฐ์ ์ฌ์ฉ๋ Key์ ๋๋ค.
์ฐธ๊ณ ์ ์ผ๋ก, SSL์ ๋ณด์ ํต์ ์์ ์ฌ์ฉ๋๋ Key๋ ๋์นญํค์ ๋๋ค. ์ฆ, Client ๋ฐ Server์์ ๊ฐ๊ฐ ๊ณ์ฐํด์ ์์ฑํ Key๋ค์ ์์ธก์ด ๊ฐ์ ๊ฐ์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
- ๋ณด์ ํต์ ์ ์ํ Key ์์ฑ์ด ์๋ฃ๋์์ผ๋ฏ๋ก, ์ฌ๊ธฐ์๋ถํฐ ์ํธํ๋ ๋ณด์ ํต์ ์ด ์์๋ฉ๋๋ค.
๊ทธ ๋์ ์ ์กํ๋ ๋ชจ๋ Message๋ค์ ๋ํ MAC๊ฐ ์ด ๋จ๊ณ๋ถํฐ ๋ณด์ ํต์ ์ด ๊ฐ๋ฅํ๋ฏ๋ก ๋ณธ๊ฒฉ์ ์ผ๋ก Data๋ฅผ ๊ตํํ ์ ์์ง๋ง, ๊ทธ ์ด์ ์ด ํด์ผ ํ ์ผ์ด ์์ต๋๋ค.
๋ฐ๋ก ๊ทธ๊ฐ Handshake๊ณผ์ ์์ ์ฃผ๊ณ ๋ฐ์๋ Message์ ๋ฌด๊ฒฐ์ฑ(Integrity)๋ฅผ ๊ฒ์ฆํ๋ ๊ฒ์ ๋๋ค.
์ฆ, ๋น๋ก SSL Handshake๊ฐ ์ ์์ ์ผ๋ก ์ด๋ฃจ์ด์ก์ง๋ง, ์ค๊ฐ์ ํน์ ์์์ง ๋ชจ๋ฅผ ๊ณต๊ฒฉ์๊ฐ Handshake Message๋ฅผ ๋ณ์กฐํ์ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํฉ๋๋ค.
์๋ฅผ ๋ค์ด, Client๊ฐ ์ง์ Cipher Spec ๋ชฉ๋ก์ ๋ณด๋ผ ๋ ๊ณต๊ฒฉ์๊ฐ ์ด๋ฅผ ๊ฐ๋ก์ฑ์ ๋์ ์ํธํ ์์ค์ Spec์ ์ ๊ฑฐํ๋ค๊ฑฐ๋, Server๊ฐ ์ ํํ Spec์ ๋ฎ์ ์ํธํ ์์ค์ Spec์ผ๋ก ๋ณ์กฐํ๋ ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ PMS๊ฐ ๊ตํ๋๊ธฐ ์ด์ ๊น์ง์ ํต์ ์ ๋ชจ๋ ์ํธํ๊ฐ ๋์ง ์์ ์ํ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋๋ค.
๋ฐ๋ผ์ ์ํธํ ํต์ ์ด ๊ฐ๋ฅํด์ง ์ฒซ ์์ ์ Client์ Server๋ ๊ฐ๊ฐ ๊ทธ ๋์ ์์ ์ด ์ ์กํ๋ ๋ชจ๋ Message๋ค์ MAC๊ฐ์ ๊ณ์ฐํด์ ์๋์ธก์๊ฒ ์ ์กํฉ๋๋ค.
์๋๋ฐฉ์ผ๋ก๋ถํฐ ๋ฐ์ MAC๊ฐ๊ณผ ๊ทธ ๋์ ์์ ์ด ๋ฐ์๋ Message๋ค๋ก๋ถํฐ MAC๊ฐ์ ๋ค์ ๊ณ์ฐํ ๊ฐ์ด ์ผ์นํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ์ฌ Handshake Message๋ค์ ๋ฌด๊ฒฐ์ฑ์ ์ฒดํฌํ ์ ์์ต๋๋ค.
์ด Handshake๊ณผ์ ์ ๋ฌด๊ฒฐ์ฑ ์ฒดํฌ๊น์ง ๋ฌด์ฌํ ํต๊ณผ ํ๋ฉด ์ด์ ๋น๋ก์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ณด์ ํต์ ์ ํตํ Data ๊ตํ์ ์์ํ ์ ์๊ฒ ๋ฉ๋๋ค
- ์ฐธ๊ณ
- http ์์์ ๋์ํ๊ธฐ ๋๋ฌธ์ ๋จผ์ TCP 3way handshake๋ฅผ ์ํํ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ์๊ฒ ์์ ์ด ์ฌ์ฉํ ์ ์๋ ์ํธํ ๋ชฉ๋ก๊ณผ, client ๋์๋ฅผ ๋ณด๋ธ๋ค.๊ฐ์ข sessionId ์ ๊ฐ์ ๋ถ๊ฐ์ ๋ณด๋ฅผ ๋ณด๋ธ๋ค.(ํต์งธ๋ก ๋ณต์ฌํด ์ฌ์ฉํ๋ ์ผ์ ๋ฐฉ์งํ๊ธฐ ์ํด)
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ์ํธํ๋ชฉ๋ก์ค ๊ฐ์ฅ ๊ฐ๋ ฅํ ์คํ์ ๊ณจ๋ผ ํด๋ผ์ด์ธํธ์๊ฒ server ๋์, ์๋ฒ์ ๊ณต๊ฐํค๊ฐ ๋ด๊ธด ์ธ์ฆ์๋ฅผ ๋ณด๋ธ๋ค.
- ๋์นญํค๋ก ์ฌ์ฉ๋ Pre-master secret(PMA)๋ฅผ ์์ฑํ๊ณ ์๋ฒ์ public key๋ก ์ํธํ ํ๋ค. ์ดํ ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ PMS์ ๋์๊ฐ์ ๋ฐํ์ผ๋ก Encryption key(๋์นญํค)์ Mac key๋ฅผ ๊ณ์ฐํ๋ค.
- handShake ๊ณผ์ ์์ ์ฃผ๊ณ ๋ฐ์๋ Message์ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ ํ ์ํธํ ํต์ ์ด ๊ฐ๋ฅํ๋ค.
๋์นญํค: ์ก์ ์ ์์ ์๊ฐ ๊ฐ์ ๋น๋ฐํค๋ฅผ ๊ฐ๊ณ ์ํธํ ๋ณตํธํ๋ฅผ ํจ ๋น๋ฐํค: ์ก์ ์ ์์ ์๊ฐ ๊ฐ์์ ๊ณต๊ฐํค/๊ฐ์ธํค๋ฅผ ๊ฐ๊ณ ์๋ค.
- nginx๊ฐ 80 ํฌํธ๋ฅผ listen ํ๊ณ ์๋ค. ๊ทธ๋ด๊ฒฝ์ฐ 301 redirect๋ก https ๋ก ์์ฒญํ๋ค.
- ํด๋น์์ฒญ์ ๋ณด๋ด๋ฉด proxy_pass ๋ก ํฐ์ผ์ผ๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
ssl_protocols TLSv1.1 TLSv1.2;
์ฌ์ฉํ ํ๋กํ ์ฝ์ ๋ํ๋ ๋๋ค. SSL ํ๋กํ ์ฝ์ ๋๋ฌด ์ค๋๋๊ธฐ๋๋ฌธ์ ์ด์ ์ง์ํ์ง ์๋๋ค. ๊ทธ๋ฌ๋ ๋ณด์์ ๋ ๊ณ ๋ คํ๋ค๋ฉด TLSv1.0๊ณผ TLSv1.1 ์ง์์ ์ค๋จํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค. ์ด๋ฏธ TLSv1.0์ ์์ฅ์์ ์ง์์ด ์ค๋จ๋ ์ํ์ด๊ธฐ๋ ํ๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ์๊ฐ ํ๊ธฐ๋๊ฒ์ธ์ง ํ์ธํ๊ธฐ ์ํด ํ์ธํด์ผํ๋ค. CRL ,OCSP ,OCSP Stapling 3๊ฐ์ง ๋ฐฉ์์ด ์๋๋ฐ
- CRL์ ํ๊ธฐ ์ธ์ฆ์๋ฅผ ๋ค ๋ฐ์์ ํ์ธํ๋ ๋ฐฉ๋ฒ,
- OCSP ์ client๊ฐ CA db์ ์ ์ํด ํ์ธํ๋ ๊ฒ
- OSCP Stapling ์ ์น์๋ฒ๊ฐ ์ธ์ฆ์๊ฐ ์ ํจํ๋ค๋ ์ฆ๋ช ์ ๋ฏธ๋ฆฌ ๋ฐ์๋์ด์ ์ ์์๋๋ฅผ ๋นจ๋ผ์ง๊ฒํจ ๊ทธ ์ค์ OCSP Stapling๋ฅผ ์ค์ ํ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ฑ๋ฅ์ ๋์ผ ์ ์๋ค.
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/chat-sellerlee.tk/chain.pem; #์ธ์ฆ์ ๋ฐ๊ธ์
ssl handshake๊ฐ ๋๊ณ ๋์ session์ ์ ์ฉ์์ผ ๊ณ์ ssl ์ ์ ์ง์์ผ์ค๋ค. session_tickets ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด session Id๋ฅผ ์ด์ฉํ๋๋ฐ session Id ๋๋น์ ์ ์ฅ๋์ด์ผํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ก์๋จน์ ์์๋ค
๋ถ์ฐํ๊ฒฝ์ ๊ฒฝ์ฐ ์ด๋ ค์์ด ์์ง๋ง ticket์ L4์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
ssl_session_cache shared:SSL:10m; # a cache shared between all worker processes.
ssl_session_timeout 10m;
ssl_session_tickets on;
- ์ฐธ๊ณ
ํค ๊ตํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ๋ dhparam ์๊ณ ๋ฆฌ์ฆ์ด๋ค. openSSL์ ์ด์ฉํด ํด๋น ํด๋๋ก ๋ค์ด๋ก๋ ํ์๋ค.
์ผ๋ฐ์ ์ผ๋ก SSL/TLS๋ง ์ ์ฉํด๋ ๋์ง๋ง ๋ณด์์ ๋์ฑ ๊ฐํํ๊ธฐ ์ํด์ ๋ณด์ํค ์์ค์ ๋์ธ๋ค.
nginx๋ openssl์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ DHE (Ephemeral Diffie-Hellman)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด๋ 1024๋นํธ์ ๊ธฐ๋ฐํ๋ค. ๊ทธ๋์ nginx ์์ฒด๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ๋ ๋์ ๋ณด์์ ๋ด๋ณดํ๋ ํค๋ฅผ ์์ฑํด ์ค๋๋ค.
ssl_ecdh_curve ๋ dhparam์ ์ฌ์ฉ๋ ํ์๊ณก์ ์ ๊ตฌ์ฒดํ ํ๋ค.
ssl_ecdh_curve auto;
ssl_dhparam /etc/letsencrypt/dhparam.pem;
ํด๋ฆญ์ฌํน ๋ฐฉ์ด๋ฅผ ์ํด ์ฌ์ฉํฉ๋๋ค. ํด๋ฆญ์ฌํน์ด๋ ๊ณต๊ฒฉ์๊ฐ ์ํ๋ ๊ฒ์ ํด๋ฆญํ๋๋ก ์์ด๋ ํดํน๊ธฐ๋ฒ์ด๋ค.
X-Frame-Options: sameorigin always;
option
- deny: ๋ชจ๋ ํ๋ ์์ ๋ฌดํจํ
- sameorigin: ๋๋ฉ์ธ ๊ธฐ์ค์ผ๋ก ๊ฐ์ origin(์๋ฒ) ์์๋ ๋ ๋๋ง์ ํ์ฉ
- allow-from https://example.com/์ ๋ถ๋ฌ์ฌ ์ ์๋ ์ฃผ์๋ฅผ ์ค์
์๋ชป๋ MINEํ์ ์ด ํฌํจ๋ ์๋ต์ด ์์ผ๋ฉด ๊ฑฐ๋ถํ๋ ์ต์ ์ด๋ค.
add_header X-Content-Type-Options nosniff;
XSS๋ฅผ ํตํ ์ธ์ ํ์ด์ ํน์ ๋ง๋๋กํ๋ ๋ช ๋ น์ผ๋ก ์๋ ๋ค๊ฐ์ง ์ต์ ์ด ์๋ค.
add_header "X-XSS-Protection" "1; mode=block";
ํฌ๋ก์ค์ฌ์ดํธ์คํฌ๋ฆฝํธ๋ฅผ ํ์งํ๋ฉด ์น ํ์ด์ง๋ฅผ ์ฌ์ฉ์์๊ฒ ์์ ๋ณด์ฌ์ฃผ์ง๋ ๋ง๋ผ๋ ์๋ฏธ์ด๋ค.
- X-XSS-Protection: 0
- XSS ํํฐ๋ง์ ๋นํ์ฑํ
- X-XSS-Protection: 1
- ํฌ๋ก์ค์ฌ์ดํธ์คํฌ๋ฆฝํธ ๊ณต๊ฒฉ๋ง ์ฐจ๋จํ๊ณ ์นํ์ด์ง๋ ์ ์์ ์ผ๋ก ์ถ๋ ฅ
- X-XSS-Protection: 1; mode=block
- ํฌ๋ก์ค์ฌ์ดํธ์คํฌ๋ฆฝํธ๋ฅผ ํ์งํ๋ฉด ์น ํ์ด์ง๋ฅผ ์ฌ์ฉ์์๊ฒ ์์ ๋ณด์ฌ์ฃผ์ง๋ ๋ง๋ผ๋ ์๋ฏธ
- X-XSS-Protection: 1; report=
-
ํฌ๋ก์ค์ฌ์ดํธ์คํฌ๋ฆฝํธ๋ฅผ ํ์งํ๋ฉด ํ์ด์ง ๋ ๋๋ง์ ์ฐจ๋จํ๊ณ ์๋ฐ ์ฌํญ์ ๋ณด๊ณ
์ด๊ฒ์ CSP report-uri ์ง์๋ฌธ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋ณด๊ณ ์๋ฅผ ๋ณด๋
-
Https๋ง์ ์ฌ์ฉํ์ฌ ํต์ ํด์ผ ํ๋ค๊ณ ๋ธ๋ผ์ฐ์ ์ ์๋ฆฌ๋ ๋ณด์๊ธฐ๋ฅ
add_header Strict-Transport-Security "max-age=63072000" always;
max-age ๋งํผ Https๋ก ์ ๊ทผํด์ผํ๋ค๊ณ ๊ธฐ์ต๋จ
CSP (Content Security Policy)๋ XSS๋ Data Injection, Click Jacking, ๋ฑ ์น ํ์ด์ง์ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ๋ ๊ณต๊ฒฉ๊ธฐ๋ฒ๋ค์ ๋ง๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
add_header Content-Security-Policy "default-src 'self'; ";
๋ชจ๋ ์ปจํ ์ธ ์ ์์ค๋ ์๊ธฐ ๋๋ฉ์ธ์์ ๊ฐ๊ณ ์ค๊ฒ ๋๋ค. ์๋ธ๋๋ฉ์ธ์ ์ ์ธ๋ค. ๋ผ๋ ์๋ฏธ
- ์ฐธ๊ณ
Referrer ๋ ์ด์ ๋ฐฉ๋ฌธ ํ์ด์ง๋ฅผ ๋งํ๋ค. ํด๋น ์ ์ฑ ์ referrer ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ์ปจํธ๋กคํ ๊ฑด์ง ์ ํ๋ ๊ฒ์ด๋ค.
Referrer-Policy: no-referrer
Referrer-Policy: no-referrer-when-downgrade
Referrer-Policy: origin
Referrer-Policy: origin-when-cross-origin
Referrer-Policy: same-origin
Referrer-Policy: strict-origin
Referrer-Policy: strict-origin-when-cross-origin
Referrer-Policy: unsafe-url
add_header Referrer-Policy "strict-origin-when-cross-origin";
-
๊ฐ์ํํ์ด์ง๋ ์ ์ฒด์ฃผ์ ๋ค๋ฅธ https๊ฐ๋๋ ๋๋ฉ์ธ์ฃผ์๋ง, http๋ก ๊ฐ๋๋ ์ ๊ฑฐ์ด๋ค.
-
์ฐธ๊ณ
- ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค.
- ์ฐธ๊ณ