'x-www-form-urlencoded' ๋๋ 'form-data' ๐ต ? 2๋ถ๋ง์ ์ค๋ช .
6699 ๋จ์ด webdevjavascripthttphtml
TL; DR
ํ์ผ ์
๋ก๋๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฌ๊ธฐ์์ form-data
๊ฐ ์ ์ผํ ์ต์
์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๋ค์ ๊ฐ์ ์ผ์ ํฉ๋๋ค. form-data
๋ x-www-form-urlencoded
๋ณด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฉ์ง๊ฒ ์ธ์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ์
๋๋ค. x-www-form-urlencoded
๋ .txt
ํ์ผ๋ก, form-data
๋ .html
ํ์ผ๋ก ์๊ฐํ ์ ์์ต๋๋ค. ํ๋ฃจ๊ฐ ๋๋๋ฉด ๋ ๋ค ์ผ๋ถ http ํ์ด๋ก๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋์ ๐ getd.io ํ๋ ์ด๊ทธ๋ผ์ด๋ ๋งํฌ ๐๋ฅผ ์๋ํ์ฌ ํค๋์ ๋ณธ๋ฌธ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ํ์ธํ์ญ์์ค.
์ปจํ
์ธ ํ์
์ปจํ
์ธ ํ์
x-www-form-urlencodedapplication/x-www-form-urlencoded
์์ ๋ฐ์ดํฐmultipart/form-data; boundary={boundary string}
form-data
์ ๋ํ ๋น ๋ฅธ ์ฐธ๊ณ ์ฌํญ: ์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ ์์์ {boundary string}
, ์๋ฅผ ๋ค์ด ----WebKitFormBoundaryKGUmWkAsjo5nUBp2
๋ฅผ ์์ฑํ์ง๋ง ์ํ๋ ๊ฒฝ์ฐ ์ง์ ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ณด๋ ค๋ฉด ์๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
ํ์ด๋ก๋ ์์ฒญ
์๋ ํ๋๊ฐ ์๋ ๋ก๊ทธ์ธ ์์์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
ํ๋
๊ฐ์น
์ฌ์ฉ์ ์ด๋ฆ
ํ
ํฌ๋ณด์ค
๋น๋ฐ๋ฒํธ
Pa$$w0๋ฒ์งธ
์์์ ๊ฒ์ํ๋ฉด x-www-form-urlencoded
์ ๋ํ ํ์ด๋ก๋๋ ์๋์ ๊ฐ์ต๋๋ค. ๋ฌธ์์ด์ encodeURIComponent()
'd์
๋๋ค.
username=techbos&password=Pa%24%24w0rd
form-data
์ ๊ฒฝ์ฐ ๊ฐ (ํค, ๊ฐ) ์์ {boundary string}
๋ฅผ ๊ตฌ๋ถ ๊ธฐํธ๋ก ์ฌ์ฉํ์ฌ ์์ฒด ์น์
์ผ๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ํ์ผ ์
๋ก๋๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ง์ง๋ง์ ์ํ ์น์
๋ ํฌํจํ์ต๋๋ค.
--{boundary string}
Content-Disposition: form-data; name="username",
techbos
--{boundary string}
Content-Disposition: form-data; name="password",
Pa$$w0rd
--{boundary string}
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg,
--{boundary string}--
์ธ๋ผ์ธ ์ค๋ช
:
์์ฒญ์ ๋ณด๋ด๋ API
x-www-form-urlencoded
์์ ๋ฐ์ดํฐ
fetch()
body
as URLSearchParams
body
as FormData
request()
form
option
formData
option
axios()
data
as URLSearchParams
data
as FormData
์๋ต์ ์ฒ๋ฆฌํ๋ API
x-www-form-urlencoded
์ ๊ฒฝ์ฐ bodyParser ์ ์ฌ์ฉํ๋ฉด ํ์ด๋ก๋๋ฅผ req.body
์ ํ์์ผ๋ก { key, value }
๋ก ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค.
express.use(bodyParser.urlencoded({ extended: true }));
express.post('/my-form-endpoint', (req, res) => {
console.log(req.body.username); // print 'techbos'
});
Express v4.16.0+์๋ ๋์ผํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ต๋๋ค.
form-data
๊ตฌ๋ฌธ ๋ถ์์ ์ํด busboy ๋๋ formidable ๊ณผ ๊ฐ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐฉ๋ฒ์ ํด๋น ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์์ ์ ์ก/์ฒ๋ฆฌ์ ๊ฐ์ฅ ์ข์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฌด์์
๋๊น? ๊ฒฝํ์ ๊ณต์ ํ๋ ค๋ฉด ์๋์ ์๊ฒฌ์ ๋จ๊ฒจ์ฃผ์ธ์ โค๏ธโค๏ธโค๏ธ!
getd.io์ ํ์ธํ๊ณ ๋ค์์ ๋ณด๊ณ ์ถ์ ๊ธฐ๋ฅ์ ๋ํ ํผ๋๋ฐฑ์ ๋จ๊ฒจ์ฃผ์ธ์ โค๏ธโค๏ธโค๏ธ!
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ('x-www-form-urlencoded' ๋๋ 'form-data' ๐ต ? 2๋ถ๋ง์ ์ค๋ช
.), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค
https://dev.to/getd/x-www-form-urlencoded-or-form-data-explained-in-2-mins-5hk6
ํ
์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ
์ธ ๋ฐ๊ฒฌ์ ์ ๋
(Collection and Share based on the CC Protocol.)
์๋ ํ๋๊ฐ ์๋ ๋ก๊ทธ์ธ ์์์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
ํ๋
๊ฐ์น
์ฌ์ฉ์ ์ด๋ฆ
ํ ํฌ๋ณด์ค
๋น๋ฐ๋ฒํธ
Pa$$w0๋ฒ์งธ
์์์ ๊ฒ์ํ๋ฉด
x-www-form-urlencoded
์ ๋ํ ํ์ด๋ก๋๋ ์๋์ ๊ฐ์ต๋๋ค. ๋ฌธ์์ด์ encodeURIComponent()
'd์
๋๋ค.username=techbos&password=Pa%24%24w0rd
form-data
์ ๊ฒฝ์ฐ ๊ฐ (ํค, ๊ฐ) ์์ {boundary string}
๋ฅผ ๊ตฌ๋ถ ๊ธฐํธ๋ก ์ฌ์ฉํ์ฌ ์์ฒด ์น์
์ผ๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ํ์ผ ์
๋ก๋๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ง์ง๋ง์ ์ํ ์น์
๋ ํฌํจํ์ต๋๋ค.--{boundary string}
Content-Disposition: form-data; name="username",
techbos
--{boundary string}
Content-Disposition: form-data; name="password",
Pa$$w0rd
--{boundary string}
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg,
--{boundary string}--
์ธ๋ผ์ธ ์ค๋ช :
์์ฒญ์ ๋ณด๋ด๋ API
x-www-form-urlencoded
์์ ๋ฐ์ดํฐ
fetch()
body
as URLSearchParams
body
as FormData
request()
form
option
formData
option
axios()
data
as URLSearchParams
data
as FormData
์๋ต์ ์ฒ๋ฆฌํ๋ API
x-www-form-urlencoded
์ ๊ฒฝ์ฐ bodyParser ์ ์ฌ์ฉํ๋ฉด ํ์ด๋ก๋๋ฅผ req.body
์ ํ์์ผ๋ก { key, value }
๋ก ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค.
express.use(bodyParser.urlencoded({ extended: true }));
express.post('/my-form-endpoint', (req, res) => {
console.log(req.body.username); // print 'techbos'
});
Express v4.16.0+์๋ ๋์ผํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ต๋๋ค.
form-data
๊ตฌ๋ฌธ ๋ถ์์ ์ํด busboy ๋๋ formidable ๊ณผ ๊ฐ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐฉ๋ฒ์ ํด๋น ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์์ ์ ์ก/์ฒ๋ฆฌ์ ๊ฐ์ฅ ์ข์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฌด์์
๋๊น? ๊ฒฝํ์ ๊ณต์ ํ๋ ค๋ฉด ์๋์ ์๊ฒฌ์ ๋จ๊ฒจ์ฃผ์ธ์ โค๏ธโค๏ธโค๏ธ!
getd.io์ ํ์ธํ๊ณ ๋ค์์ ๋ณด๊ณ ์ถ์ ๊ธฐ๋ฅ์ ๋ํ ํผ๋๋ฐฑ์ ๋จ๊ฒจ์ฃผ์ธ์ โค๏ธโค๏ธโค๏ธ!
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ('x-www-form-urlencoded' ๋๋ 'form-data' ๐ต ? 2๋ถ๋ง์ ์ค๋ช
.), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค
https://dev.to/getd/x-www-form-urlencoded-or-form-data-explained-in-2-mins-5hk6
ํ
์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ
์ธ ๋ฐ๊ฒฌ์ ์ ๋
(Collection and Share based on the CC Protocol.)
x-www-form-urlencoded
์ ๊ฒฝ์ฐ bodyParser ์ ์ฌ์ฉํ๋ฉด ํ์ด๋ก๋๋ฅผ req.body
์ ํ์์ผ๋ก { key, value }
๋ก ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค.express.use(bodyParser.urlencoded({ extended: true }));
express.post('/my-form-endpoint', (req, res) => {
console.log(req.body.username); // print 'techbos'
});
Express v4.16.0+์๋ ๋์ผํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ต๋๋ค.
form-data
๊ตฌ๋ฌธ ๋ถ์์ ์ํด busboy ๋๋ formidable ๊ณผ ๊ฐ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐฉ๋ฒ์ ํด๋น ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.์์ ์ ์ก/์ฒ๋ฆฌ์ ๊ฐ์ฅ ์ข์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฌด์์ ๋๊น? ๊ฒฝํ์ ๊ณต์ ํ๋ ค๋ฉด ์๋์ ์๊ฒฌ์ ๋จ๊ฒจ์ฃผ์ธ์ โค๏ธโค๏ธโค๏ธ!
getd.io์ ํ์ธํ๊ณ ๋ค์์ ๋ณด๊ณ ์ถ์ ๊ธฐ๋ฅ์ ๋ํ ํผ๋๋ฐฑ์ ๋จ๊ฒจ์ฃผ์ธ์ โค๏ธโค๏ธโค๏ธ!
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ('x-www-form-urlencoded' ๋๋ 'form-data' ๐ต ? 2๋ถ๋ง์ ์ค๋ช .), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/getd/x-www-form-urlencoded-or-form-data-explained-in-2-mins-5hk6ํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค