HTTP #8 ํค๋ (์์ฒญํค๋, ์๋ตํค๋, ์ฟ ํค, ์บ์, ํ๋ก์)
by JiwonDevHTTP ํค๋์๋ StartLine ์ ๋ณด (HTTP ๋ฒ์ , URI, ์ํ์ฝ๋)๋ฅผ ์ ์ธํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ฃ๋๋ค.
Key-Value ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ฉฐ ํ๋์ Key์ ์ฌ๋ฌ๊ฐ์ ๊ฐ์ ํ ๋นํ ์ ์๋ค. ๋ฌผ๋ก ์ด๋ ๊ฒ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ง๋ง.
# 1999๋ - HTTP ํ์ค RFC2612
ํค๋์ ์ข ๋ฅ๋ฅผ ๊ตฌ๋ถํ๊ณ ์์๋๋ก ์์ฑํ์๋ค.
# 2014๋ - ํ์ค RFC7230~5
[Entityํค๋์ Body๋ฉ์์ง]๋ฅผ [Representationํค๋์ Payload๋ฉ์์ง]๋ก ๋ฐ๊พธ๊ณ HTTP ์คํ์ ํฌ๊ฒ ๊ฐ์ ํ์๋ค.
์ด์ Request, Response์ ๊ตฌ๋ถ์ด ์๋ค.
ํํ ํค๋๋ ์ ์ก ๋ฐ์ดํฐ๋ฅผ ํด์ํ ์ ์๋ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ฃผ๋ฉฐ [Request Response]์ ๋ ๋ค ์ฌ์ฉํ๋ค.
โก Contet-length์ฒ๋ผ ํด์ ์ ๋ณด๊ฐ ์๋๋ผ ๊ฐ ์์ฒด๊ฐ ์ ๋ณด์ธ ๊ฒฝ์ฐ๋ Payload ํค๋๋ผ๊ณ ๋งํ๋ค.
# ํํ ํค๋(Content Representation)
๋ฉ์์ง ๋ด์ฉ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ค.
- Content-Type: ํํ ๋ฐ์ดํฐ์ ํ์, [ text/html, application/json, image/png, multipart/...๋ฑ ๋ฐ์ดํฐ ํ์์ ๋ณด]
- Content-Encoding: ํํ ๋ฐ์ดํฐ์ ์์ถ ๋ฐฉ์, [gzip, defalte, identity(=์์ถ์ํ์) ๋ฑ ํ์ฌ ๋ฐ์ดํฐ์ ์์ถ๋ฐฉ์]
- Content-Language: ํํ ๋ฐ์ดํฐ์ ์์ฐ ์ธ์ด [ ko, jp, en, en-US ]
- Content-Length: ํํ ๋ฐ์ดํฐ์ ๊ธธ์ด [ ๋ฐ์ดํธ ๋จ์ Body ๊ธธ์ด ]
โก ์ฐธ๊ณ ๋ก Transfer-Encoding์ ์ฌ์ฉํ๋ฉด ๊ธธ์ด๊ฐ ํฌํจ๋์ด์์ด Content-Length๋ฅผ ๋ฐ๋ก ์ฐ๋ฉด ์๋๋ค.
# ํ์ ํค๋(Content Negotiation)
ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ด๋ ๋ฐ์ดํฐ์ ํ์, ํด๋ผ์ด์ธํธ๊ฐ ์ ํธํ๋ ๋ฐ์ดํฐ์ ํ์์ ์ ๋ ฅํ๋ค.
- ์ด๋ฅผ ํ์์ด๋ผ๊ณ ํํํ ์ด์ ๋, ์ํ๋ ์๋ต ํ์์ด ์๋ค๋ฉด ๋ค์ ์ฐ์ ์์๋ฅผ ์ง์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ง์ฝ ์ฐ์ ์์๊ฐ ๊ฐ๊ฑฐ๋ ํฌํจ๊ด๊ณ(text/*, text/html/..)๋ผ๋ฉด ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ๋จผ์ ์ฌ์ฉํ๋ค.
# ์ ์ก๋ฐฉ์ ํค๋ (Transfer-Encoding, Content-Range)
์ผ๋ฐ์ ์ก, ์์ถ์ ์ก, ๋ถํ ์ ์ก๋ฑ ๋ณด๋ด๋ ๋ฐฉ์์ ์๋ฏธํ๋ ํค๋์ด๋ค.
๋ถํ ์ ์ก(Transfer-Encoding)์ ๊ฒฝ์ฐ์๋ Content-Length๋ฅผ ์ ์ผ๋ฉด ์๋๋ค. (๋ถํ ํด์ ์ ์๊ฐ ์์ผ๋๊น)
Transfer-Encoding๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถํ ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ๋ ํฌ๊ธฐ๋ฅผ ํจ๊ป ๋ณด๋ธ๋ค.
- Range์ Content-Range๋ ์ผ๋ถ๋ง ๋ค์ ๋ฐ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.(๋ถํ ์ ์ก๋ฑ์ผ๋ก ์ด๋ฏธ ์ ๋ฐ์ ๋ฐ์ ๊ฒฝ์ฐ)
# ์ผ๋ฐ ์ ๋ณดํค๋
ํด๋ผ์ด์ธํธ ์ ๋ณด, ์๋ฒ ์ ๋ณด, ์์ฒญ๊ธฐ๊ธฐ, ๋ ์ง ๋ฑ ์ผ๋ฐ์ ๋ณด๋ฅผ ๋ด๋ ํค๋์ด๋ค.
- From : ์ ์ ์ ์ด๋ฉ์ผ ์ ๋ณด, ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋ ํค๋์ด๋ค. (ex ํฌ๋กค๋ง์ ํ ๋, ๋ด๊ฐ ๋๊ตฌ์ธ์ง ์๋ ค์ฃผ๋ ์ฐ๋ฝ์ฒ์ญํ )
- Referer : <์์ฒญ์ ์ฉ> ์ด์ ์น์ฌ์ดํธ์ URI ์ฃผ์์ด๋ค. ์ ์
๊ฒฝ๋ก๋ฅผ ํ์ธํ ์ ์์ผ๋ฉฐ ํ์
์์ ์ ๋ง ์์ฃผ ์ฌ์ฉํ๋ค.
โก ์ฐธ๊ณ ๋ก ์ด๋ Referrer๋ ์คํ์ธ๋ฐ ์ด๋ฏธ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ค ๋ง๋ค์ด๋ฒ๋ ค์ ๋ฐ๊ฟ ์๊ฐ ์๋ค๊ณ ํ๋ค..ใ ใ ; - User-Agent : <์๋ต์ ์ฉ> ์ ์ ์ ์์ด์ ํธ ์ ๋ณด, ์ฆ ์ฌ์ฉํ ๋ธ๋ผ์ฐ์ , ์ฌ์ฉํ ๊ธฐ๊ธฐ๋ฑ์ ํ์ธํ ์ ์๋ค.
- Server : <์๋ต์ ์ฉ>์์ฒญ์ ์ฒ๋ฆฌํ๋ ์๋ฒ(Origin ์๋ฒ)์ ์ํํธ์จ์ด ์ ๋ณด
- Date : <์๋ต์ ์ฉ> ๋ฉ์์ง๊ฐ ๋ฐ์ํ ๋ ์ง์ ์๊ฐ์ ์ ์ด๋ณด๋ธ๋ค. ์ต์ ์คํ์์๋ ์๋ต๋ง ์ฌ์ฉํ๋๋ก ๋ฐ๋์๋ค.
# ํน๋ณํ ์ ๋ณดํค๋
- Host : ์์ฒญํ ํธ์คํธ(๋๋ฉ์ธ) ์ ๋ณด. ์
๋ ฅ์ด ํ์์ธ ํค๋์ด๋ค.
Host ํค๋๊ฐ ํ์๊ฐ ๋ ์ด์ ๋, ํ๋์ IP์ ์ฌ๋ฌ ๋๋ฉ์ธ์ด ์ ์ฉ๋๋ ๊ฒฝ์ฐ(๊ฐ์ ํธ์คํธ)๊ฐ ๋ง์์ก๊ธฐ ๋๋ฌธ์ด๋ค.
- Location : ํ์ด์ง ๋ฆฌ๋ค์ด๋ ์ , ์๋ต์ Location๊ฐ์ด ์์ผ๋ฉด, ํด๋น ๊ฐ์ผ๋ก ๋ฆฌ๋ค์ด๋ ์ ์ํจ๋ค.
- Allow : ๋ณดํต [405 Method Not Allowed] ์๋ต์ ํฌํจํ๋ ํค๋์ด๋ฉฐ ํ์ฉ๊ฐ๋ฅํ HTTP ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
โก ๋ค๋ง ์๋ฒ์์ ์ด๋ฐ ์๋ฌ๊น์ง ๊ตฌ๋ถํด์ ๊ตฌํํ๋ ์ผ์ ๊ฑฐ์ ์๋ค. - Retry-After : [503 Service Unavailable]์ ์๋ต์ ์ฌ์ฉํ๋ ํค๋์ด๋ฉฐ, ์๋ฒ๊ฐ ๋ณต๊ตฌ๋๋ ์๊ฐ์ด๋ ๋ ์ง๋ฅผ ์ ๊ณตํ๋ค.
์ธ์ฆ ์์ฒญํค๋(Authorizaition)
์ธ์ฆํค๋๋ OAuth2๋ฑ์ ์ฐพ์๋ณด๋ฉด ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ฝ๊ฒ ์ ์ ์๋ค.
- Authorization : ์ธ์ฆ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์๋ค.
- WWW-Authenticate : [401 Unauthorized] ์๋ต์ ํจ๊ป ์ฌ์ฉํ๋ฉฐ, ํ์ํ ์ธ์ฆ์ ๋ณด๋ฅผ ํ์์ ์ ๊ณตํ๋ค.
# ์ฟ ํค (Cookie)
HTTP๋ ๋ฌด์ํ, ๋น์ฐ๊ฒฐ์ ์งํฅํ๋ ํ๋กํ ์ฝ์ด๋ค. ์ฌ๋ฌ ์ฐ๊ฒฐ์์ ์ํ๋ฅผ ์ ์งํ๋ ค๋ฉด ์ฟ ํค๋ ํ ํฐ์ ์ฌ์ฉํด์ผํ๋ค.
- ์์ฒญ์ ๋ณด๋ผ ๋ ์ฟ ํค๋ ๋ธ๋ผ์ฐ์ ์์ ์น ํค๋์ ๋ฃ์ด ๊ฐ์ด ๋ณด๋ธ๋ค. (HTTP ์คํ์ด ๊ทธ๋ ๊ฒ ๋ง๋ค์ด์ ธ์๋ค.)
โก ๊ทธ๋์ ์๋ฒ์ ๋ณด๋ด์ง์๊ณ , ๋ธ๋ผ์ฐ์ ์์๋ง ์ฌ์ฉํ ๋ฐ์ดํฐ๋ ์น์คํ ๋ฆฌ์ง(LocalStorage)๋ฅผ ์ฌ์ฉํ๋ค. - Set-Cookie๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ์ฟ ํค๋ฅผ ์ ๋ฌํ๊ณ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉํ ์ ์๋ค.
2021.08.29 - [Backend/Spring MVC] - Spring Login#1 ์ฟ ํค์ ์ธ์
@์ฟ ํค์ ์ ํจ๊ธฐ๊ฐ
์ฟ ํค๋ ์ ํจ๊ธฐ๊ฐ์ด ์๋ค๋ฉด [์ธ์ ์ฟ ํค, ๋ธ๋ผ์ฐ์ ์ข ๋ฃ๊น์ง๋ง ์ ์ง]๋๊ณ
๋ง๋ฃ ๊ธฐ๊ฐ์ด ์๋ค๋ฉด [์์ ์ฟ ํค]๋ก ๋ก์ปฌPC์ ์ ์ฅ๋๋ค. ์ฆ, ์ฟ ํค๋ ๋ณ์กฐํ๊ฑฐ๋ ํ์ทจํ๊ธฐ ์ฌ์ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ฃ์ผ๋ฉด ์๋๋ค.
@์ฟ ํค Path, Domain ์ง์
- ์ฟ ํค๊ฐ์ domain์ ์ง์ ํด์ฃผ๋ฉด, ๋ช ์ํ ๋๋ฉ์ธ(naver.com)๊ณผ ์๋ธ๋๋ฉ์ธ(blog.naver.com)๋ง ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
- ๋ง์ฐฌ๊ฐ์ง๋ก ์ฟ ํค๋ฅผ ์ฌ์ฉํ ๊ฒฝ๋ก๋ฅผ ์ง์ ํด์ค ์ ์๋ค. Domain ์ ํ๊ณผ ํจ๊ป ์ฌ์ฉํด์ผ ์๋ฏธ๊ฐ ์๊ธดํ๋ค.
@ ์ฟ ํค - ๋ณด์ (Seucre, HttpOnly, SameSite)
์ด๋ ๋ณด์๊ด๋ จ ๊ณต๋ถ๋ฅผ ํ ๋ ์์ฐ์ค๋ฝ๊ฒ ์๊ฒ๋๋ค. ์ฐธ๊ณ ๋ก SameSite๋ ์ต๊ทผ์ ๋์จ ์ฟ ํค ๋ณด์๊ธฐ๋ฅ์ด๋ค.
# ์กฐ๊ฑด๋ถ ์์ฒญ[304 Not Modified]
๋ฐ๋ ๋ฐ์ดํฐ๊ฐ ์๋๋ฐ, ๊ณ์ํด์ ๋ฐ๋ณต์์ฒญํ๋๊ฑด ๋คํธ์ํฌ ๋น์ฉ์ ์๋นํ ๋ง์ด์ก์๋จน๋๋ค.
- ๊ทธ๋์ ๋ธ๋ผ์ฐ์ ์์๋ ๊ฐ์ ์์ฒญ์ ๊ฒฝ์ฐ ์บ์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฌ์ฉํ๋ค.
- ์๋ฒ์์๋ HTTP ํค๋์ cahce-control๋ฑ์ผ๋ก ์บ์์ ๋ณด๊ด์ ์์ฒญํ ์ ์๋ค.
- ํด๋น ์บ์๋ max-age=60, ์ฆ 60์ด๋์๋ง ์บ์๋ก ํ์ฉํ๊ณ ๊ทธ ์ดํ์๋ ์๋ฒ์ ๋ค์ ์์ฒญ์ ํ๋ค.
โก ์ด ๊ฒฝ์ฐ ์๋ฒ์์ [304 Not Modified]๋ฅผ ์ด์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์บ์๋ฅผ ๋ค์ ์ฌ์ฉํ๋๋ก ๋ฆฌ๋ค์ด๋ ํธ ์ํฌ ์ ์๋ค. - ์๋ฒ์์๋ Last-Modified ๋ฑ์ ํค๋์ ๋ณด๋ก 304๋ฅผ ๋ณด๋ผ์ง, ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ค์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์๋ค.
โก ๊ทธ๋์ ์๋ต์ ๋ณด๋ผ ๋ Last-Modified๋ฅผ ์ ์ด์ ๋ณด๋ด๋ ์ด์ ๋ ์๋ค.
# ๊ฒ์ฆ ํค๋์ ์กฐ๊ฑด๋ถ์์ฒญ
ํ์ง๋ง Last-Modified์ If-Modified-Since๋ง ์ฌ์ฉํ๊ฒ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ด ์๋ค.
- A->B->A ๊ฐ์ด ์์ ์ ๋์์ง๋ง, ๋ด์ฉ์ด ๊ทธ๋๋ก์ธ ๊ฒฝ์ฐ์๋ ๋ถํ์ํ๊ฒ ๋ค์ ๋ค์ด๋ก๋ ํ๋ค.
- ์๊ฐ(๋ ์ง)๊ธฐ๋ฐ์ ํค๋๋ผ์ 1์ด ๋ฏธ๋ง๋จ์์ด๋ ์์ ๋ฐ์ดํฐ ๋ฒ์ ๊ธฐ๋ฐ์ผ๋ก ์ ๊ท์์ฒญ/์บ์์ฌ์ฉ ์กฐ์ ์ด ๋ถ๊ฐ๋ฅํ๋ค.
โก ETag( Entity Tag )๋ฅผ ์ด์ฉํด์ ์บ์๋ฐ์ดํฐ์ ๊ณ ์ ํ ์ด๋ฆ or ๋ฒ์ ์ ๋ช ์ํ ์ ์๋ค.
@ ETag์ If-None-Match
- If-None-Match ๋ฅผ ์ด์ฉํ์ฌ ETag๋ฅผ ์๋ฒ์์์ ์กฐ๊ฑด ์ปจ๋์
์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
โก ๋์์ ๋จ์ํ๋ค. If-None-Match์ ํฌํจํ ETag์ ๊ฐ์ด, ์๋ฒ์ ๋ค๋ฅธ๊ฒฝ์ฐ๋ง ์์ฒญ[200]์ ๋ณด๋ด๋ ๋ฐฉ์
# ์กฐ๊ฑด๋ถ ์์ฒญํค๋๋ฅผ ์ด์ฉํ ์บ์์ค์
๋๋ถ๋ถ Cache-Control ํค๋๋ฅผ ์ด์ฉํด์ ์ค์ ํ๊ณ , ์๋ HTTP์์๋ Pragma์ Expires๋ฅผ ์ฌ์ฉํ์๋ค.
- Cache-Control์ ๊ฐ์ 3๊ฐ์ง๊ฐ ์๋ค. no-cache ์ต์ ์ ์บ์๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ต์ ์์ ๊ธฐ์ตํ์.
HTTP 1.0 ์ดํ ๋ฒ์ ์์๋ ์ด๋ ๊ฒ ์ฌ์ฉํ์๋ค.
โก ์ฐธ๊ณ ๋ก Cache-Control์ ํจ๊ป ์ฌ์ฉํด์ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์๋ ํค๋๋ค์ ๋ฌด์๋๋ค.
- pragma: no-cache
- expires: Mon, 01 Jan 1990 00:00:00 GMT
# ํ๋ก์ ์บ์ ์๋ฒ (CDN ์๋ฒ, AWS_ํด๋ผ์ฐ๋ ํ๋ก ํธ)
์์ฒญ ์๋๋ฅผ ์ฌ๋ฆฌ๊ธฐ์ํด์, ์ค๊ฐ์ ๋์ฒด์(Proxy)์๋ฒ๋ฅผ ๋์ด ์บ์ํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
ํ๋ก์ ์บ์๋ ์๋์ ๊ฐ์ Cache-Control ๊ฐ์ ์ด์ฉํด ์ค์ ํ ์ ์๋ค.
# ์บ์ ๋ฌดํจํ
์ต๊ทผ์ ์น ๋ธ๋ผ์ฐ์ ๋ ๋ฐ๋ก ํค๋๋ฅผ ์กฐ์ํ์ง ์๋๋ผ๋ ์บ์๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ๋ค.
๊ทธ๋์ ์บ์๊ฐ ๋๋ฉด ์๋๋ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ Cache-Control์ ํตํด ์บ์๋ฅผ ๋ฌดํจํํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
โก ์ํ์ ํต์์๊ณ ๊ฐ ์บ์๋์ด์ ๊ณ์ ์ฌ์ฌ์ฉ๋๋ค๊ณ ์๊ฐํด๋ณด์. ํ์คํ๊ฒ ๋ฌดํจํ์ง์์ผ๋ฉด ํฐ์ผ๋ ์ ์๋ค.
์ด 4๊ฐ์ง๋ฅผ ์กฐํฉํ๋ฉด ์๋์ ๊ฐ์ด ๋์ํ๋ค. ์ฆ ๋ชจ๋ ์ํฉ์์ ํ์คํ๊ฒ ์บ์๋ฅผ ๋ฌดํจํ ์ํฌ ์ ์๋ค.
no-cache๋ก ํญ์ ์์ฒญํ๊ณ , no-store๋ก ์บ์์ ์ฅ์ ๋ฐฉ์งํ๋ฉด ์ถฉ๋ถํ ๊ฒ๊ฐ์๋ฐ must-revalidate๊น์ง ์ด๋ค.
๊ทธ ์ด์ ๋ ํ๋ก์ ์๋ฒ ๋๋ฌธ์ด๋ค.
- no-cache๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ ์๋ฒ(Origin)๊ฐ ์๋ต์ด ์์ด๋ ์์ฒญ์ ์ ์กํ๊ฒ ๋์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
- must-revalidate๋ ํ๋ก์๋ฅผ ๋ฌด์ํ๊ณ ๋ฌด์กฐ๊ฑด ์์๋ฒ์์ ์์ฒญ์ ๋ฐ์์จ๋ค.
'๐๊ธฐ๋ณธ ์ง์ > ์น ๊ธฐ๋ณธ์ง์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋คํธ์ํฌ OSI 7๊ณ์ธต, TCP/IP 4๊ณ์ธต (0) | 2021.09.08 |
---|---|
HTTP #9 ์ธ์ -์ฟ ํค, JWTํ ํฐ (0) | 2021.09.06 |
HTTP #7 ์ํ์ฝ๋ (200,300,400,500) (1) | 2021.09.06 |
HTTP #6 ๊ธฐ๋ณธ์ ์ธ API ์ค๊ณ (0) | 2021.09.06 |
HTTP #5 ์์ฒญ ๋ฉ์๋ (0) | 2021.09.06 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev