2. Fetch API & CORS
keyword
Fetch API๋?
Promise
ReableStream
Unicode
CORS๋?
Fetch API๋?
๊ณผ๊ฑฐ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ํ์ด์ง์ ์๋ก๊ณ ์นจ ์์ด(์๋ก๊ณ ์นจ์ผ๋ก ์ธํ ํ์ดํธ ์คํฌ๋ฆฐ ์ต์ ) ์๋ฒ๋ก ๋น๋๊ธฐ ์์ฒญ์ ๋ณด๋์์ง๋ง, Fetch API๋ฅผ ํตํด ๋ณด๋ค ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋ฐ์ดํฐ ํต์ ์ ์ ๊ณตํ๋ค. Promise ๊ธฐ๋ฐ์ ๋น๋๊ธฐ ์ฝ๋ ์์ฑ์ ํตํด ๋ ๊น๋ํ๊ณ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
Promise
Event Loop
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ฐ๋ ๋ ๊ธฐ๋ฐ ์ธ์ด๋ก ๋จ์ผ ์ฝ์คํ์ ๊ฐ์ง๊ณ ์์ด ํ ๋ฒ์ ํ๋์ ์์ ๋ง์ ์ฒ๋ฆฌํ ์ ์๋ค. ๊ทธ๋ผ์๋ ๋์์ ์ฌ๋ฌ๊ฐ์ง ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ ์ด์ ๋ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํตํด ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์์ ์ ๋์์ฑ์ ๋ณด์ฅํ๋ฉฐ ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์์ธ ๋ธ๋ผ์ฐ์ ๋๋ Node.js๊ฐ ๋ด๋นํ๋ค. ์ด๋ฌํ ๋น๋๊ธฐ ์์ ์ callback ํจ์๋ฅผ ํตํด Node.js๋ Web API์ ์ ๋ฌํ๋๋ฐ ์์ ์ด ๋๋ ์์๋๋ก callback ํจ์๋ฅผ ํ์คํฌ ํ์ ์ ๋ฌํ๋ฉฐ ์ด๋ฒคํธ ๋ฃจํ๋ ์ฝ ์คํ์ด ๋น์์ ธ์๋ค๋ฉด ํ์คํฌ ํ์ ์ฒซ๋ฒ์งธ ํจ์๋ฅผ ๊บผ๋ด ์ฝ ์คํ์ ์ถ๊ฐํ๋ค.
Callback Hell
Callback์ ์ด์ฉํ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌ ์์๋ฅผ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๊ธฐ์ ์ธ ์ํ์ ์ํด์ Callback์ ์ค์ฒฉํด์ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ ์ด๋ ํ๋ก๊ทธ๋จ์ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ์ ์ง๋ณด์๋ฅผ ์ด๋ ต๊ฒ ํ๋ค.
Promsie
Promise๋ Javascript์์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฐ์ฒด๋ก ๋๊ธฐ์ ์ํ์ ํ๊ธฐ ์ํด ์ค์ฒฉ๋ ์ฝ๋ฐฑ ์ง์ฅ์
.then()
์ฒด์ด๋์ ํตํด ํด๊ฒฐํ ์ ์๋ค. Promise๋ฅผ ์ฌ์ฉํ๋ ๋น๋๊ธฐ ํจ์๋ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
Promise ๊ฐ์ฒด๋ (resolve, reject)๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ํ๋ Callback ํจ์๋ก ์์ฑํ๋ค.
pending, fulfilled, rejected 3๊ฐ์ง ์ํ๋ฅผ ๊ฐ์ง๋ค.
Promise ๊ฐ์ฒด์ ์ด๊ธฐ ์ํ๋ pending
resolve ํธ์ถ -> fulfilled
reject ํธ์ถ -> rejected
Promise.then() ํจ์๋ก fulfilled, rejected ์ํ์ ๋ํ callback์ ๋ฑ๋กํ๊ณ ์ฌ์ฉํ ์ ์๋ค.
Promise.catch() ํจ์๋ก rejected ์ํ์ ๋ํ callback์ ๋ฑ๋กํ๊ณ ์ฌ์ฉํ ์ ์๋ค.
๋์์ด ์ํ(fulfilled)๋๋ฉด resolve ํจ์๋ฅผ, ์ทจ์(rejected)๋๋ฉด rejectํจ์๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const data = { message: "Data fetched successfully" };
resolve(data);
}, 1000);
});
}
fetchData()
.then(result => {
// result = { message: "Data fetched successfully" }
console.log("First .then() result:", result);
return "Additional data";
})
.then(data => {
// data = Additional data
console.log("Second .then() data:", data);
return 42;
})
.then(value => {
// value = 42
console.log("Third .then() value:", value);
});
๊ฐ
.then()
.catch()
ํจ์๋ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ํจ์ ์ฒด์ด๋์ด ๊ฐ๋ฅํ๋ค.
ReadableStream
fetct API์ response ๊ฐ์ฒด์ body ์์ฑ์ ReadableStream์ ๊ตฌ์ฒด์ ์ธ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๋ค.
์ ๋ฆฌํ์๋ฉด ReadableStream์ ์น ํ๋ซํผ์์ ์ฌ์ฉ๋๋ Streams API๋ก ๋์ฉ๋์ ๋ฐ์ดํฐ๋ฅผ ์์ ์กฐ๊ฐ(chunk)๋ก ๋๋์ด ์ ์กํ๋ค. ๊ทธ๋์ ํ์ํ๋งํผ ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฝ์ ์ ์์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค. ์คํธ๋ฆฌ๋ฐ์ด๋ ๋จ์ด๋ฅผ ๋ณด๋ UDP๊ฐ ๋ ์ค๋ฅด๋๋ฐ ๋น ๋ฅด๊ณ ๊ฐ๋ณ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ์ ์ก ๊ณ์ธต ํ๋กํ ์ฝ์ด ๋ ์ค๋ฅธ๋ค. ๊ฐ๋ณ๋ค๋ผ๋ ์ ์ฌ์ฑ์ด ๋ณด์ด๊ธด ํ์ง๋ง, ๋ ๊ฐ๋ ์ ์ง์ ์ ์ธ ์ฐ๊ด์ฑ์ ๋ฑํ ์์ด๋ณด์ธ๋ค.
stream
์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ฅผ ์์ ์กฐ๊ฐ(chunk)์ผ๋ก ๋๋์ด ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋งํ๋ค.
Unicode
๋ฌธ์ ์ธ์ฝ๋ฉ
์ปดํจํฐ๋ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง Binary(์ด์ง) ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ฏ๋ก, ๋ฌธ์๋ฅผ ์ปดํจํฐ๊ฐ ์ด์ฉํ ์ ์๋ ๋ฐ์ด๋๋ฆฌ ์ ํธ๋ก ๋ณํํ์ฌ ์ ์ฅํ๊ณ ์ ์กํ๋ค. ์ด ์ ํธ๋ฅผ ์ ๋ ฅํ๋ ์ธ์ฝ๋ฉ๊ณผ ๋ฌธ์๋ฅผ ํด๋ ํ๋ ๋์ฝ๋ฉ์ ํ๊ธฐ ์ํด์ ๋ฏธ๋ฆฌ ์ ํด์ง ๊ธฐ์ค์ ๋ฐํ์ผ๋ก ์ํ๋์ด์ผ ํ๋๋ฐ, ์ด๋ฅผ ๋ฌธ์์ด ์ธํธ, ๋ฌธ์์ ์ด๋ผ๊ณ ํ๋ค.
ASCII(์์คํค) ์ฝ๋
์์คํค ์ฝ๋๋ ์ด๊ธฐ ๋ณด๊ธํ ์ปดํจํฐ์ ๋ฌธ์์ด ์ธํธ๋ก ์์คํค ์ฝ๋๋ 7bit๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, 0๋ถํฐ 127๊น์ง ์ด 128๊ฐ์ ๋ฌธ์(์ํ๋ฒณ, ์ซ์, ํน์ ๋ฌธ์ ๋ฑ)๋ฅผ ๋ํ๋ด๋ ๋ฌธ์ ์ธ์ฝ๋ฉ์ด๋ค.
Unicode
์์คํค ์ฝ๋๋ ์ํ๋ฒณ๊ณผ ์ซ์๋ง์ ๋ค๋ฃฐ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค์ํ ์ธ์ด์ ๋ฌธ์ ์ฒด๊ณ๋ฅผ ํํํ๊ธฐ์ ํ๊ณ๊ฐ ์์ด ํ์ค ๋ฌธ์์ ์ด ํ์ํด์ก๊ณ , ์ดํ ์ ์ธ๊ณ์ ๋ชจ๋ ๋ฌธ์์ ๊ธฐํธ๋ฅผ ํํํ๊ธฐ ์ํ ๊ตญ์ ํ์ค ๋ฌธ์ ์ธ์ฝ๋ ๋ฐฉ์์ธ ์ ๋์ฝ๋๊ฐ ๊ฐ๋ฐ๋์๋ค.
UTF-8
UTF-8์ ์ ๋์ฝ๋ ๋ฌธ์์ด ์ธํธ๋ฅผ ๊ฐ์ง๊ณ ์ธ์ฝ๋ฉ ํ๋ ๋ฐฉ์ ์ค ํ๋๋ก ์์คํค ๋ฌธ์๋ 1๋ฐ์ดํธ๋ก, ๋ค๊ตญ์ด ๋ฌธ์๋ 2๋ฐ์ดํธ๋ก ํํ๋๋ค.
URL Encoding
URL์ ์์คํค ์ฝ๋์ ๋ฌธ์ ์งํฉ๋ง ์ฌ์ฉํ ์ ์์ด, ํ๊ธ๊ณผ ๊ฐ์ ๋ฌธ์์ด์ URL์ ์ฝ์ ํ ๊ฒฝ์ฐ URL Encoding์ผ๋ก ์ ์กํ ์ ์๋ ํํ๋ก ๋ณํํ๋ค. ์ด ๋ ๋ณํํ๋ ๊ท์น์ UTF-8์ ๋ฐ๋ฅด๋ฉฐ, ํ๊ธ ๋ฌธ์ 1๊ฐ๋ 3๋ฐ์ดํธ๋ก ์ธ์ฝ๋ฉ ๋๋ค.
CORS๋?
๋ธ๋ผ์ฐ์ ๋ ์น ๋ณด์ ์ ์ฑ SOP์ ์ํด ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค ์ ๊ทผ์ ์ ํํ๋ค. ๋๋ฌธ์ ์๋ก ๋ค๋ฅธ ์ถ์ฒ๊ฐ์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ํ์ฉํ๊ธฐ ์ํด์ CORS ๋ฉ์ปค๋์ฆ์ ํตํด ๋ฆฌ์์ค ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํ๋ค. ์ฌ๊ธฐ์ ๋งํ๋ ์ถ์ฒ๋ ์ถ์ฒ(origin) = Protocol(schema) + Host(domain) + Port ์ด๊ฒ๋ค์ ํฉ์น URL์ ์๋ฏธํ๋ค.
์์ฒญ ๋ฐฉ์์ ๋ฐ๋ฅธ CORS ๋ฐ์
<img>, <video>, <script>, <link>
ํ๊ทธ๋ก ๋ค๋ฅธ ์ฌ์ดํธ ๋ฆฌ์์ค ์ ๊ทผXMLHttpRequest, Fetch API ์๋ฒ ๋น๋๊ธฐ ํต์
CORS Error ํด๊ฒฐํ๊ธฐ
์๋ฒ์์ cors ๋ฏธ๋ค์จ์ด ์ฌ์ฉ ๋๋ response Headers์ โAccess-Control-Allow-Originโ ์์ฑ์ ์ถ๊ฐํ๋ฉด ๋๋ค.
const express = require('express');
const cors = require('cors');
const app = express();
// ๋ชจ๋ ์ถ์ฒ์ ๋ํด CORS ํ์ฉ ์ค์
app.use(cors());
// ...
SOP (๋์ผ ์ถ์ฒ ์ ์ฑ
)
๋์ผ ์ถ์ฒ์ ๋ํด์๋ง ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ํ์ฉํ๋ค๋ ์น ๋ณด์ ์ ์ฑ , ์๋ก ๋ค๋ฅธ ์ถ์ฒ๊ฐ์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ์ ํํ๋ค.
SOP์ ํ์์ฑ
ํด์ปค์ CSRF(์์ฒญ ์์กฐ), XSS(์คํฌ๋ฆฝํธ ์ฝ์ ) ๊ณต๊ฒฉ ์ฐจ๋จ
์ถ๊ฐ ํค์๋
CORS์ ๋ฐ๋ฅธ ์์ฒญ๋ฐฉ์ 3๊ฐ์ง(Simple, Preflight, Credentialed request)
Last updated