HTTPS & ์น ๋ธ๋ผ์ฐ์ ์์์ CORS
์น ๋ณด์์์ ์ค์ํ ๋ ๊ฐ์ง ๊ฐ๋ ์ HTTPS์ CORS์ด๋ค. CORS๋ ์น ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ํ ๋ฒ์ฏค์ ๋ณด๊ฒ๋๋ค๋ ์๋ฌ๋ฉ์ธ์ง๋ผ๊ณ ํ๋ค. ์น ๊ฐ๋ฐ์์ ์ ๊ณ ์์ด๋ผ๊ณ ๋ ํ๋ CORS๊ฐ ๋ฌด์์ธ์ง, ์ด ์๋ฌ๋ฅผ ์ฌ์ ์ ์ด๋ป๊ฒ ๋ฐฉ์งํ ์ ์๋์ง๋ฅผ ์์์ผ ๋ ํจ์จ์ ์ด๊ณ ์์ ํ๊ฒ ์น ๊ฐ๋ฐ์ ํ ์ ์๊ธฐ๋๋ฌธ์ ์์๋ณด๊ณ ์ ํ๋ค.
HTTPS๋ ์น ํต์ ์ ๋ณด์์ ๊ฐํํ๊ธฐ ์ํ ํ๋กํ ์ฝ์ด๋ฉฐ, CORS๋ ์น ๋ธ๋ผ์ฐ์ ์์์ ๋ฐ์ํ ์ ์๋ ์ ์์ , ์ ์ ๋น์๋ ์์ฒญ(CSRF)์ผ๋ก๋ถํฐ ๋ถ๋ถ์ ์ผ๋ก ๋ณดํธํ๋ ์ ์ฑ ์ด๋ค.
โป '๋ถ๋ถ์ ': ์๋ฒฝํ๊ฒ๋ CSRF๋ฅผ ๋ฐฉ์ดํ์ง ๋ชปํ๋ค๋ ์๋ฏธ์ด๋ค. "์น"์๋ง ์๋ ๋ฐฉ์ด ์ ์ฑ ์ผ๋ก ์ฑ์๋ ์๊ณ Form ์์ฒญ๋ ๋ฐฉ์ด ํ ์ ์๋ค.
HTTPS (HTTP Secured, TLS)
HTTPS๋ SSL(Secure Sockets Layer) ๋๋ TLS(Transport Layer Security) ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ HTTP ์์ฒญ ๋ฐ ์๋ต์ ์ํธํํ๋ค. ์ด๋ฅผ ํตํด ๋ ์ฃผ์ฒด(ํด๋ผ์ด์ธํธ์ ์๋ฒ, End-to-End)๋ง ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
- MITM(Man-In-The-Middle) ๊ณต๊ฒฉ๋ฐฉ์ง
HTTPS ๋ณด์ ์ ์ฉ ๋ฐฉ์
HTTPS๋ ๋์นญํค ์ํธํ์ ๋น๋์นญํค ์ํธํ ๋ฐฉ์์ ์ฅ์ ๋ง์ ์ฌ์ฉํ์ฌ ๋ณด์์ ๊ฐํํ๋ค.
- ๋น๋์นญํค ์ํธํ: ์๋ฒ์ ๊ณต๊ฐํค(Public Key)์ ๋น๊ณต๊ฐํค(Private Key)๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํ ํต์ . ๊ณต๊ฐํค๋ ๋ ธ์ถ๋์ด๋ ์์ ํ์ง๋ง ์ฐ์ฐ์๋๊ฐ ๋๋ฆฌ๋ค.
- ๋์นญํค ์ํธํ: ์ดํ ํต์ ์์๋ ๋์นญํค(์ธ์ ํค)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํธํ ํ๋ค. ๋์นญํค๋ ์ฐ์ฐ ์๋๊ฐ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ๋งค๋ฒ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์์ฒญ/์๋ต์ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฑ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋น๋์นญํค ์ค ๊ณต๊ฐํค(Public)๋ฅผ ๊ทธ๋ฅ ์ ๋ฌํ์ง ์๊ณ CA ์ธ์ฆ๊ธฐ๊ด์ ์ธ์ฆ์ ๊ฑฐ์น ํ ์ ๋ฌํ๋ค.
- CA: SSL ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๋ ๊ธฐ๊ด, ์ ๋ขฐํ ์ ์๋ ๊ธฐ๊ด
HTTPS ๋์ ์๋ฆฌ
HTTPS๋ 2๊ฐ์ ๋น๋์นญํค์ 1๊ฐ์ ๋์นญํค๋ฅผ ์ฌ์ฉํ๋ค.
- 2๊ฐ์ ๋น๋์นญํค Pair (๊ฐ์ ๊ด๊ณ): ์๋ฒ๋ ์์ ์ ๊ณต๊ฐํค์ ๋น๊ณต๊ฐํค๋ฅผ ๋ณด์ ํ๋ฉฐ, ๊ณต๊ฐํค๋ CA(์ธ์ฆ๊ธฐ๊ด)์์ ์ธ์ฆ๋ ํ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ๋๋ค.
- ์๋ฒ์ ๊ณต๊ฐํค + ์๋ฒ์ ๋น๊ณต๊ฐํค: HTTPS ์ ์ฉํ๋ ค๋ ์น ์๋ฒ๊ฐ ๊ฐ + HTTPS ํต์ ํ๋ ค๋ ํด๋ผ์ด์ธํธ๊ฐ ์
- CA์ ๊ณต๊ฐํค + CA์ ๋น๊ณต๊ฐ ํค: ์ธ์ฆ์ ํด์ฃผ๋ ์ฃผ์ฒด์ธ CA๊ฐ ๊ฐ + ์ธ์ฆ๋ฐ์์ผํ๋ ๋ง์ ์น ์๋ฒ๊ฐ ์
- 1๊ฐ์ ๋์นญํค: ๊ฐ์ฅ ๋ง์ง๋ง์ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ํธ/๋ณตํธํ ์ฑ๋ฅ์ด ์ข์(๋น ๋ฅธ) ํค
- ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ ๋น๋์นญํค๋ฅผ ์ฌ์ฉํด ์ธ์ ํค๋ฅผ ์์ฑํ๊ณ , ์ด ์ธ์ ํค๋ก ์ํธํ๋ ํต์ ์ ์ํ.
CORS: CSRF "๋ถ๋ถ"๋ฐฉ์ง๋ฅผ ์ํ ์น ๋ธ๋ผ์ฐ์ ์ ์ฑ
CSRF(Cross-Site Request Forgery)
CSRF๋ ์ฌ์ฉ์๊ฐ ์๋ํ์ง ์์ ์ํ์์ ์ ์์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ํ ์ฌ์ดํธ์ ์์ฒญ์ด ์ ์ก๋๋ ๊ณต๊ฒฉ์ด๋ค.
์น ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฌํ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด SOP (Same-Origin Policy) ์ CORS (Cross-Origin Resource Sharing) ์ ์ฑ ์ ๋ง๋ จํ๋ค.
CORS์ ์ญํ
CORS๋ ์น ๋ธ๋ผ์ฐ์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ AJAX(Asynchronous JavaScript and XML) ์์ฒญ์ ํตํด ๋ฐ์ํ ์ ์๋ CSRF๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํ ์ ์ฑ ์ด๋ค. ํ์ง๋ง CORS๋ ๋ถ๋ถ์ ์ธ ๋ฐฉ์ด๋ง ์ ๊ณตํ๋ฉฐ ๋ชจ๋ CSRF ๊ณต๊ฒฉ์ ์๋ฒฝํ๊ฒ ๋ฐฉ์ดํ์ง๋ ๋ชปํ๋ค. ์๋ฅผ ๋ค์ด ๋ค์ดํฐ๋ธ ์ดํ๋ฆฌ์ผ์ด์ ์์์ ์์ฒญ์ด๋ ์น ๋ธ๋ผ์ฐ์ ์ FORM ์์ฒญ์ CORS์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
W3C๋ ๊ฐ์ฅ ๋จผ์ SOP๋ผ๋ ์ ์ฑ ํ์ค์ ๋์ ํ๋ค. ์ด๋ ํ๋ก ํธ์๋์ ๊ณจ๋จธ๋ฆฌ๋ฅผ ์ฉ๊ฒํ๋ ์๋ฐ์ ์ด ๋์๋ค.
๊ทธ๋์ CORS๋ SOP(Same-Origin Policy) ์ ์ฑ ์ ๋ณด์ํ์ฌ, API ํธ์ถ์ ํ์ฉํ๊ธฐ ์ํด ํน์ ์กฐ๊ฑด์์๋ง Cross-Origin ์์ฒญ์ ํ์ฉํ๋ค. ์ด๋ฅผ ํตํด ์น ๋ธ๋ผ์ฐ์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํด ํ ์ฌ์ดํธ์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๊ฒ์ ์ ํํ๊ณ , ํ์ํ ๊ฒฝ์ฐ์๋ง ์์ธ๋ฅผ ๋์ด ํ์ฉํ ์ ์๊ฒ๋๋ค.
CSRF์ CORS๊ฐ ํท๊ฐ๋ฆด ์ ์๋ค.
CS__(Cross-Site)์ CO__(Cross-Origin)ํน์ Same-Site, Same-Origin ์ฐจ์ด๋ ๋ฌด์์ผ๊น?
- Origin๊ณผ Site์ ์ฐจ์ด
- Origin: Scheme + Host Name(Domain Name) + Port
- EX) https://api.sanghyun.com:8080
- Origin: Scheme + Host Name(Domain Name) + Port
- Site: Domain Name ์ค SLD(Second-Level Domain) + TLD(Top-Level-Domain)
- EX) api.sanghyun.com / admin.sanghyun.com (api ํน์ admin์ Sub Domain)
- ๋ค๋ฅธ ๋ง๋ก ์ ์ํ์๋ฉด TLD +1 ํน์ eTLD + 1 ์์ญ์ ๊ฐ๋ฅดํด.
- Domain, Origin๊ณผ Site ์ฐจ์ด ์ ๋ฆฌ
- Domain: sanghyun.com
- Origin: https// + sanghyun.com + :8080
- Site: api.sanghyun.com or admin.sanghyun.com
CORS ์๋ฒ ์ธก ์ ์ฉ ๋ฐฉ๋ฒ
์น ์๋ฒ๋ CORS ์ ์ฑ ์ ์ ์ฉํ์ฌ ์น ๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ์ด๋ค ์์ฒญ์ ํ์ฉํ ์ง ๊ฒฐ์ฅํ ์ ์๋ค. ์ด๋ฅผ ์ํด ์ธ ๊ฐ์ง ์ฃผ์ ํค๋๋ฅผ ์ค์ ํ๋ค.
1. ํ์ฉ๋ Origin ์ค์
- Origin(๋ธ๋ผ์ฐ์ ): ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญ์ ๋ณด๋ผ ๋ ํฌํจํ๋ ํค๋, ์์ฒญ์ด ๋ฐ์ํ ์ถ์ฒ๋ฅผ ๋ํ๋ธ๋ค.
- Access-Control-Allow-Origin(์๋ฒ): ์๋ฒ๊ฐ ์๋ต ์ ๋ณด๋ด๋ ํค๋, ํ์ฉ๋ ์ถ์ฒ๋ฅผ ๋ช ์ํ๋ค.
- ์ ํจ์ฑ ๊ฒ์ฌ: ๋ธ๋ผ์ฐ์ ๋ ์์ ์ด ๋ณด๋ธ Origin ํค๋์ ์๋ฒ๊ฐ ์๋ตํ Access-Control-Allow-Origin ํค๋๋ฅผ ๋น๊ตํ์ฌ ์์ฒญ์ด ํ์ฉ๋ ์ถ์ฒ์์ ์๋์ง ํ์ธํ๋ค.
OPTIONS /some-resource HTTP/1.1
Host: example.com
Origin: https://sanghyun.com
์๋ฒ๋ 'Access-Control-Allow-Origin' ํค๋๋ฅผ ํตํด https://sanghyun.com ์์์ ์์ฒญ๋ง์ ํ์ฉํ ์ ์๋ค.
2. ํ์ฉ๋ Method ์ค์
- Access-Control-Request-Method(๋ธ๋ผ์ฐ์ ): ๋ธ๋ผ์ฐ์ ๊ฐ Preflight Request(์ฌ์ ์์ฒญ)๋ฅผ ํตํด ์๋ฒ์ ์ฌ์ฉํ๊ณ ์ ํ๋ HTTP ๋ฉ์๋(GET, POST, PUT ๋ฑ)๋ฅผ ์๋ฆฐ๋ค.
- Access-Control-Allow-Methods(์๋ฒ): ์๋ฒ๊ฐ ์๋ต ์ ํ์ฉ๋ HTTP ๋ฉ์๋๋ฅผ ๋ช ์ํ๋ค.
- ์ ํจ์ฑ ๊ฒ์ฌ: ๋ธ๋ผ์ฐ์ ๋ ์์ ์ด ๋ณด๋ด๋ ค๋ ๋ฉ์๋๊ฐ ์๋ฒ์์ ํ์ฉ๋ ๋ฉ์๋์ธ์ง ํ์ธํ๋ค.
OPTIONS /some-resource HTTP/1.1
Host: example.com
Origin: https://sanghyun.com
Access-Control-Request-Method: PUT
์๋ฒ๋ 'Access-Control-Allow-Methods' ํค๋๋ฅผ ํตํด 'PUT' ๋ฉ์๋๊ฐ ํ์ฉ๋๋์ง ์๋ตํ๋ค.
3. ํ์ฉ๋ Header ์ค์
- Access-Control-Request-Headers(๋ธ๋ผ์ฐ์ ): ๋ธ๋ผ์ฐ์ ๊ฐ Preflight Request์์ ์๋ฒ์ ์ ์กํ๋ ค๋ ํค๋ ๋ชฉ๋ก์ ํฌํจํ๋ค.
- Access-Control-Allow-Headers(์๋ฒ): ์๋ฒ๊ฐ ์๋ต ์ ํ์ฉ๋ ํค๋ ๋ชฉ๋ก์ ๋ช ์ํ๋ค.
- ์ ํจ์ฑ ๊ฒ์ฌ: ๋ธ๋ผ์ฐ์ ๋ ์์ ์ด ๋ณด๋ด๋ ค๋ ํค๋๊ฐ ์๋ฒ์์ ํ์ฉ๋ ํค๋์ธ์ง ํ์ธํ๋ค.
OPTIONS /some-resource HTTP/1.1
Host: example.com
Origin: https://sanghyun.com
Access-Control-Request-Headers: X-Custom-Header
์๋ฒ๋ 'Access-Control-Allow-Headers'ํค๋๋ฅผ ํตํด 'X-Custom-Header'๊ฐ ํ์ฉ๋๋์ง๋ฅผ ์๋ตํ๋ค.
์๊ฒฉ์ฆ๋ช Header ํ์ฉ
- ์๊ฒฉ์ฆ๋ช : Cookie, Authorization Headers ๋๋ TLS Client ์ธ์ฆ ์ ๋ณด ๋ฑ
- ๋ธ๋ผ์ฐ์ ์ธก ์ค์ : credentials: "include" (์ต์ ์๋ฐ์คํฌ๋ฆฝํธ fetch API) ๋๋ allowCredentials=true (XMLHttpsRequest)์ต์ ์ ํตํด ์๊ฒฉ์ฆ๋ช ์ ๋ณด๋ฅผ ํฌํจํ๋๋ก ์์ฒญํ ์ ์๋ค.
- ์๋ฒ ์ธก ์ค์ : Access-Control-Allow-Credentials = true๋ก ์ค์ ํ์ฌ, ์๋ฒ๊ฐ ์๊ฒฉ์ฆ๋ช ์ด ํฌํจ๋ ์์ฒญ์ ํ์ฉํ๋ค. ์ด ๊ฒฝ์ฐ Access-Control-Allow-Origin ํค๋์์ ์์ผ๋์นด๋ '*' ๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ฝ์ด ์๋ค.
CORS ๊ฒ์ฆ์ ์ํ ์์ฒญ ์ ํ
1. Simple Request: ์๋ฒ ์ํ ์กฐํ
- Methods: GET, HEAD์ ๊ฐ์ ์๋ฒ ์ํ๋ฅผ ์กฐํํ๋ ์์ฒญ์ ์ฌ์ฉ๋๋ค.
- ์ ์ฐจ:
- ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์๊ฒ ์ ์์ฒญ์ ๋ณด๋ธ๋ค.
- ์๋ฒ๋ ์๋ต๊ณผ ํจ๊ป CORS ํค๋๋ฅผ ์ ์กํ๋ค.
- ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์ CORS ํค๋๋ฅผ ๊ฒํ ํ์ฌ ์์ฒญ์ด ํ์ฉ๋ ์ถ์ฒ์์ ์จ ๊ฒ์ธ์ง ํ์ธํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ต์ ํ๊ธฐํ๋ค.
GET /some-resource HTTP/1.1
Host: example.com
Origin: https://sanghyun.com
์๋ฒ๋ Access-Control-Allow-Origin: https://sanghyun.com ํค๋๋ฅผ ํฌํจํ ์๋ต์ ๋ฐํํ๋ค
2. Preflight Request: ์๋ฒ ์ํ ๋ณ๊ฒฝ
- Methods: POST, PATCH, PUT๊ณผ ๊ฐ์ ์๋ฒ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์์ฒญ ๋๋ GET, HEAD์ ์ปค์คํ ํค๋๊ฐ ํฌํจ๋ ์์ฒญ์ ์ฌ์ฉ๋๋ค.
- ์ ์ฐจ:
- ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์๊ฒ ์ฌ์ ์์ฒญ(OPTIONS)์ ๋ณด๋ด, ์๋ฒ๊ฐ ํ์ฉํ๋ Origin, Method, Header๋ฅผ ํ์ธํ๋ค.
- ์๋ฒ๋ CORS ํค๋๋ง ํฌํจ๋ ์๋ต์ ๋ณด๋ธ๋ค.
- ๋ธ๋ผ์ฐ์ ๋ ์๋ต๋ CORS ํค๋๋ฅผ ๊ฒํ ํ์ฌ ์์ฒญ์ด ํ์ฉ๋ ๊ฒฝ์ฐ์๋ง ์ค์ ์ ์์ฒญ์ ์ ์กํ๋ค.
OPTIONS /some-resource HTTP/1.1
Host: example.com
Origin: https://sanghyun.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type
์๋ฒ๋ Access-Control-Allow-Mothods: POST ์ Access-Control-Allow-Headers: Content-Type ํค๋๋ฅผ ํฌํจํ ์๋ต์ ๋ฐํํ๋ค.
โน๏ธ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
'๐ปDEV-STUDY > HTTP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ๋ ์ค ์ & ๋ช ๋ น์ด (0) | 2024.08.30 |
---|---|
4. Session (4) | 2024.08.24 |
3. Web Storage (0) | 2024.08.24 |
2. HTTP Cookie (4) | 2024.08.23 |
1. ์ฟ ํค(Cookie) & ์ธ์ (Session) + JWT (0) | 2024.08.23 |