[axios] Header, Content-Type, MIME, Authorization,
HTTP Message
HTTP Header : HTTP ์ ์ก ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ์๊ฒ ํ์ํ ๋ชจ๋ ๋ถ๊ฐ ์ ๋
ํค๋ ํ๋ ๋ช : ํ๋ ๊ฐ ๊ตฌ์กฐ. ์ฌ๋ฌ๊ฐ์ ํ๋ ๊ฐ์ด ์กด์ฌ ๊ฐ์ผํ๋ค.
๊ณผ๊ฑฐ RFC2516 ๋ถ๋ฅ : General Header, Request Header, Resaponse Header, Entity Header
Empty Line : ํค๋์ ๋ฉ์์ง ๋ฐ๋ ๊ตฌ๋ถ
HTTP Body : ์ ์ก๋์ด์ผ ํ๋ ๋ฐ์ดํฐ ์์ฒด. ํญ์ ์กด์ฌํ๋ ๊ฑด ์๋๋ค.
General Header
๋ฆฌํ์คํธ ๋ฉ์์ง์ ๋ฆฌ์คํฐ์ค ๋ฉ์์ง์ ์ ์ฉ๋๋ ๊ธฐ๋ณธ์ ์ธ ์ ๋ณด
Data: ๋ฉ์์ง๊ฐ ์์ฑ๋ ๋ ์ง
Transfer-Encoding : ๋ถํ ์ ์ก, ๋ฉ์์ง ๋ฐ๋์ ์ ์ก ์ฝ๋ฉ ํ์์ ์ง์ ํ๋ค.
Request Header
์์ฒญ ์ ๋ณด. ๋ฆฌํ์คํธ ๋ฉ์์ง์ ์ฌ์ฉ๋๋ ํค๋๋ก Request Line, Request Header, General Header, Entity Header๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- Accept : ์ฝํ ์ธ ๊ฐ ์ ํธํ๋ ๋ฏธ๋์ด ํ์
- Accept-Chareset : ํด๋ผ์ด์ธํธ๊ฐ ์ ํธํ๋ ๋ฌธ์ ์ธ์ฝ๋ฉ
- Accept-Encoding : ํด๋ผ์ด์ธํธ๊ฐ ์ ํธํ๋ ๋ฌธ์ ์ธ์ฝ๋ฉ
- Accept-Charset: ํด๋ผ์ด์ธํธ๊ฐ ์ ํธํ๋ ๋ฌธ์ ์ธ์ฝ๋ฉ
- Accept-Encoding: ํด๋ผ์ด์ธํธ๊ฐ ์ ํธํ๋ ์์ถ ์ธ์ฝ๋ฉ ๋ฐฉ์
- Accept-Language: ์์ฐ ์ธ์ด ์ฐ์ ์์
- Host: ์์ฒญํ ํธ์คํธ ์ ๋ณด(๋๋ฉ์ธ). ํ๋์ IP ์ฃผ์์ ์ฌ๋ฌ ๋๋ฉ์ธ์ด ์ ์ฉ๋์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌ๋ถํ๋ฉฐ ํ์ ํค๋๋ค.
- User-Agent: ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ช ์นญ ๋ฐ ๋ฒ์ ์ ๋ณด. ์ด๋ค ์ข ๋ฅ์ ๋ธ๋ผ์ฐ์ ์์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋์ง ํ์ ์ด ๊ฐ๋ฅํ๋ฉฐ ํต๊ณ์ ๋ง์ด ์ฌ์ฉ๋๋ค.
- Referer: ์ง์ ์นํ์ด์ง ์ฃผ์. ์ ์ ๊ฒฝ๋ก ๋ถ์์ด ๊ฐ๋ฅํ๋ฉฐ referrer์ ์คํ๋ค.
Response Header
์๋ต ์ ๋ณด. ํน์ ์ ํ์ ๋ฆฌ์คํฐ์ค ๋ฉ์์ง์ ์ฌ์ฉ๋๋ ํค๋๋ก Status Line, Response Header, General Header, Entity Header๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
Server: ์์ฒญ์ ์ฒ๋ฆฌํ๋ origin ์๋ฒ์ ์ํํธ์จ์ด ์ ๋ณด
Location: ํ์ด์ง ๋ฆฌ๋ค์ด๋ ์
. 3xx ์๋ต์ ๊ฒฐ๊ณผ์ Location ํค๋๊ฐ ์๋ค๋ฉด Location ์์น๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ค.
Retry-After: ์ ์ ์์ด์ ํธ๊ฐ ๋ค์ ์์ฒญ์ ํ๊ธฐ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ ์๊ฐ(๋ ์ง ๋๋ ์ด๋จ์)
Entity Header (Representation)
ํํ. ๋ฆฌํ์คํธ ๋ฉ์์ง์ ๋ฆฌ์คํฐ์ค ๋ฉ์์ง์ ์ฌ์ฉ๋๋ ํํ ๋ฐ์ดํฐ๋ฅผ ํด์ํ๋๋ฐ ์ฌ์ฉํ๋ค.
- Content - Type : ํํ ๋ฐ์ดํฐ์ ๋ฏธ๋์ด ํ์ ํ์ (text/html;charset=utf-8, application/json, image/png)
- Content-Encoding: ํํ ๋ฐ์ดํฐ์ ์์ถ ๋ฐฉ์. ๋ฐ์ดํฐ ๋ณด๋ผ ๋ ๋ฉ์์ง ๋ฐ๋๋ฅผ ์์ถ ํ ์ธ์ฝ๋ฉ ํค๋๋ฅผ ์ถ๊ฐํ๊ณ , ์ฝ๋ ์ชฝ์์ ํด๋น ์ ๋ณด๋ก ์์ถ์ ํด์ ํ๋ค. (gzip, deflate, identity)
- Content-Language: ํํ ๋ฐ์ดํฐ์ ์์ฐ ์ธ์ด (ko, en, en-US)
- Content-Length: ํํ ๋ฐ์ดํฐ์ ๊ธธ์ด. ํ๋ฒ์ ์์ฒญํ๊ณ ํ๋ฒ์ ๋ฐ๋๋ค. Transfer-Encoding ๋๋ ์ฌ์ฉํ์ง ๋ชปํ๋ค.
Contet-Type ?
์์ ๊ทธ๋ฆผ์์ Message Body ์ ๋ค์ด๊ฐ๋ ํ์ ์ http header์ ๋ช ์ํด ์ค ์ ์๋๋ฐ ์ด๋ ๋ช ์ํด ์ค ์ ์๋๋ก ํด์ฃผ๋ ํ๋๊ฐ ๋ฐ๋ก Content Type์ด๋ค.
HTTP ํต์ ์์ ์ ์ก๋๋ ๋ฐ์ดํฐ ํ์ ์ ๋ํ๋ด๋ header์ ๋ณด ์ค ํ๋
Content-Type ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ์ธก์์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ์ง ํ๋จํ๋ค.
์ฌ๊ธฐ์ "๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ์ธก"์ Request(๋ํ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ) ๋๋ Response(๋ํ์ ์ผ๋ก ์น์๋ฒ) ๋๋ค ํฌํจ ๋๋ค.
๊ทธ์ค์ Textํ์
์ผ๋ก๋ text/css, text/javascript, text/html, text/plain ๋ฑ์ด ์๋ค.
๋ file์ ์ค์ด๋ณด๋ด๊ธฐ ์ํด์๋ multipart/form-data๊ฐ ์๊ณ Application ํ์
์ผ๋ก๋ application/json, application/x-www-urlencoded๊ฐ ์๋ค.
HTTP GET, POST ๋ฉ์๋์์ Content-Type
HTTP ๋ฉ์๋์์ GET ๋ฐฉ์์ value=text ํ์์ผ๋ก ๋ณด๋ด์ง๊ธฐ ๋๋ฌธ์ Content-Type ์ ํ์ ์๋ค.
HTTP ๋ฉ์๋์ POST, PUT์ฒ๋ผ Body์ data๋ฅผ ๋ณด๋ผ ๋ Content-Type์ด ํ์ํ๋ค.
MIME
Content-Type์ ์ข ๋ฅ๋ฅผ ์๊ธฐ ์ , MIME์ ๋ํ ์ง์์ด ํ์ํ๋ค!
MIME๋, Multipurpose Internet Mail Extensions์ ์ฝ์ง
์ ์ ์ฐํธ์ ์ํ ์ธํฐ๋ท ํ์ค ํฌ๋งท์ด๋ค. ์ ์์ฐํธ์ 7๋นํธ ASCII ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ก๋๊ธฐ ๋๋ฌธ์, 8๋นํธ ์ด์์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์๋ ์ด์ง ํ์ผ๋ค์ MIME ํฌ๋งท์ผ๋ก ๋ณํ๋์ด SMTP๋ก ์ ์ก๋๋ค. ์ค์ง์ ์ผ๋ก SMTP๋ก ์ ์ก๋๋ ๋๋ถ๋ถ์ ์ ์ ์ฐํธ์ MIME ํ์์ด๋ค. MIME ํ์ค์ ์ ์๋ content types์ HTTP์ ๊ฐ์ ํต์ ํ๋กํ ์ฝ์์ ์ฌ์ฉ๋๋ฉฐ, ์ ์ฐจ ๊ทธ ์ค์์ฑ์ด ์ปค์ง๊ณ ์๋ค.
- ์ํค๋ฐฑ๊ณผ -
์ค์ํ ์ ์ httpํต์ ์์ Content-Type์ mimeํ์ค์ ์ ์๋ ๊ฒ์ ์ฌ์ฉํ๋ค๋ ์ ์ด๋ค.
ํด๋น MIME์ ์ข ๋ฅ๋ ๋๋ฌด ๋ง์ผ๋,
https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
MIME ํ์ ์ ์ ์ฒด ๋ชฉ๋ก - HTTP | MDN
๋ค์์ ์ผ๋ฐ์ ์ธ ํ์ฅ์๋ก ์ ๋ ฌ๋, ๋ฌธ์ ํ์ ๊ณผ ๊ด๋ จ๋ MIME ํ์ ์ ํฌ๊ด์ ์ธ ๋ชฉ๋ก์ ๋๋ค.
developer.mozilla.org
์์์ ํ์ธ!
application/json๊ณผ application/x-www-form-urlencoded
์์ฆ์ ๋๋ถ๋ถ์ request ์ ๋ํ Content-Type์ application/jsonํ์ ์ด๋ค.
application/json์ RestFul API๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉฐ request๋ฅผ ๋ ๋ฆด ๋ ๋๋ถ๋ถ json์ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋จ์ ๋ฐ๋ผ ์์ฐ์ค๋ฝ๊ฒ ์ฌ์ฉ์ด ๋ง์ด ๋๊ฒ ๋์๋ค.
application/x-www-form-urlencoded๋ html์ form์ ๊ธฐ๋ณธ Content-Type์ผ๋ก ์์ฆ์ ์์ฃผ ์ฌ์ฉํ์ง ์์ง๋ง ์ฌ์ ํ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์กด์ฌํ๋ค.
์ฐจ์ด์ ์ application/json์ {key: value}์ ํํ๋ก ์ ์ก๋์ง๋ง application/x-www-form-urlencoded๋ key=value&key=value์ ํํ๋ก ์ ๋ฌ๋๋ค๋ ์ ์ด๋ค.
์ฆ application/x-www-form-urlencoded๋ ๋ณด๋ด๋ ๋ฐ์ดํฐ๋ฅผ URL์ธ์ฝ๋ฉ ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉ ํ์ ์น์๋ฒ๋ก ๋ณด๋ด๋ ๋ฐฉ์์ ์๋ฏธํ๋ค. (๋ฐ๋ผ์ ์ฌ์ฉํ๋ library๋ framework์์ x-www-form-urlencoded๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ body ์ธ์ฝ๋ฉ์ด ์ง์ํ๋์ง ๊ผญ ํ์ธํด๋ด์ผ ํ๋ค.)
์์ ์ฝ๋ (application/json)
let data = {
id: id,
pw: pw
}
axios.post(url, JSON.stringify(data), { // json์ jsonํ์
์ text๋ก ๋ณํ
headers: {
"Content-Type": `application/json`, // application/json ํ์
์ ์ธ
},
})
.then((res) => {
console.log(res);
});
์์ ์ฝ๋ (application/x-www-form-urlencoded)
import qs from 'qs';
const data = { 'bar': 123 };
axios.post(
'/foo',
qs.stringify(data), // json์ queryString ํ์
์ text๋ก ๋ณํ
headers: {
"Content-Type": `application/x-www-form-urlencoded`, // x-www-form-urlencoded ํ์
์ ์ธ
},
})
.then((res) => {
console.log(res);
});
mutipart/form-data
ํ์ผ ์
๋ก๋๋ฅผ ๊ตฌํํ ๋ ํด๋ผ์ด์ธํธ๊ฐ web ๋ธ๋ผ์ฐ์ ๋ผ๋ฉด ํผ์ ํตํด์ ํ์ผ์ ์ ์กํ๋ค.
์น ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด๋ด๋ HTTP ๋ฉ์์ง๋ Content-Type ์์ฑ์ด multipart/form-data๋ก ์ง์ ๋๊ณ ์ ํด์ง ํ์์ ๋ฐ๋ผ ๋ฉ์์ง๋ฅผ ์ธ์ฝ๋ฉํ์ฌ ์ ์กํ๋ค.
์ฐธ๊ณ ๋ก multipart๋ MIME(Multipurpose Internet Mail Extensions) ํ์
์ค์ ํ๋์ด๋ค.
๋ณธ๋ก ์ผ๋ก ๋์์์ multipart/form-data๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๋ฒ๋ ๋ฉํฐํํธ ๋ฉ์์ง์ ๋ํด์ ๊ฐ ํํธ๋ณ๋ก ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ณ ํ์ผ์ ์ ๋ณด๋ฅผ ์ป๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ ์ด๋ฏธ์ง ํ์ผ์ ์ ์กํ๋ค๊ณ ํด์ png๋ jpg ํ์ผ์ ์ ์กํ๋ ๊ฒ์ด ์๋๋ผ๋ ๊ฒ์ด๋ค.
์ด๋ฏธ์ง ํ์ผ๋ ๋ฌธ์๋ก ์ด๋ฃจ์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ์ง ํ์ผ์ ๋ฌธ์๋ก ์์ฑํ์ฌ HTTP request body์ ๋ด์ ์๋ฒ๋ก ์ ์กํ๋ ๊ฒ์ด๋ค.
Authorization
์ธ์ฆ ํ ํฐ(jwt) ๋ฅผ ์๋ฒ๋ก ๋ณด๋ผ ๋ ์ฌ์ฉํ๋ ํค๋
๋ณดํต Basic ์ด๋ Bearer๊ฐ์ ํ ํฐ์ ์ข ๋ฅ๋ฅผ ๋จผ์ ์๋ฆฌ๊ณ ๊ทธ ๋ค์์ ์ค์ ํ ํฐ ๋ฌธ์๋ฅผ ์ ์ด ๋ณด๋ธ๋ค.
Authorization: Bearer XXXXXXXXXXXXX
HTTP Authorization ์์ฒญ ํค๋๋ ์๋ฒ์์ ์ฌ์ฉ์ ์์ด์ ํธ๋ฅผ ์ธ์ฆํ๋ ์๊ฒฉ์ฆ๋ช ์ ์ ๊ณตํ์ฌ ๋ณดํธ๋ ๋ฆฌ์์ค์ ๋ํ ์ก์ธ์ค๋ฅผ ํ์ฉํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๋ค.
headers Authorization
๋ฌด๋ถ๋ณํ ๋ฐ์ดํฐ ์ ๊ทผ์ ๋ง๊ธฐ ์ํด headers์ ํ ํฐ์ ์ถ๊ฐํ์ฌ token๊ฐ์ด ์์ด์ผ๋ง ๋ฐ์ดํฐ์ ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ
headers: {
Authorization: `Token ${token}`
}
header ๋ฃ๊ธฐ
1. post, put
axios.post('api',
{
name: name
},
{
headers: {Authorization: token,},
}
)
2. get
axios.get('api',
{
params: {name: name},
headers: {Authorization: token,},
}
)
3. delete
axios.delete('api',
{
headers: {Authorization: token,},
data: {name: name},
}
)