HTTP (HyperText Transfer Protocol) โ
๐งฉ Reference
ํ๋กํ ์ฝ: ์ปดํจํฐ๋ผ๋ฆฌ ํต์ ํ ๋ ์ง์ผ์ผ ํ๋ ๊ท์น + ํ์
TLS Handshake: ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋น๋์นญํค(๊ณต๊ฐํค/๊ฐ์ธํค)๋ฅผ ์ด์ฉํด, ์ดํ ํต์ ์ ์ฌ์ฉํ ๋์นญํค(์ธ์ ํค)๋ฅผ ์์ ํ๊ฒ ํฉ์ํ๋ ๊ณผ์
๐งฉ ์๋ ์ ๋ฆฌ๋ฅผ ํ๊ณ ๊นจ๋ฌ์ ์ !
- ์ refreshToken์ ์ฟ ํค์ ๋ฃ๋์ง
โ JS๋ก ์ ๊ทผ ๋ชป ํ๋ httpOnly ์ฟ ํค๋ก ๊ด๋ฆฌํด์, ํ์ทจ ์ํ์ ์ค์ด๊ณ ์๋ ์ ์ก๋ง ๋งก๊ธฐ๋ ค๊ณ . - ์ accessToken์ Authorization ํค๋์ ๋ฃ๋์ง
โ ๋งค ์์ฒญ๋ง๋ค ๋ด๊ฐ ๋ช ์์ ์ผ๋ก ์ด๋ค ์ฌ์ฉ์ ๊ถํ์ธ์ง ์ ๋ฌํ๊ธฐ ์ํด, ํค๋์Bearer ํ ํฐํํ๋ก ๋ถ์ธ๋ค. - ์ httpOnly ์ฟ ํค๊ฐ ๋ณด์์ ์ผ๋ก ์์ ํ์ง
โ JS์์ ์ฝ์ ์ ์์ด์, XSS๋ก ์คํฌ๋ฆฝํธ๊ฐ ๋ ๋ ์ฟ ํค ๋ด์ฉ์ ํ์ณ๊ฐ ์ ์๊ธฐ ๋๋ฌธ. - ์ state๊ฐ ์๋ HTTP์์ ์ฐ๋ฆฌ๊ฐ ํ ํฐ์ ๊ณ์ ๋ณด๋ด์ผ ํ๋์ง
โ ์๋ฒ๋ ์ด์ ์์ฒญ์ ๊ธฐ์ตํ์ง ์์ผ๋, โ๋ ๋๊ตฌ์ธ์ง + ๋ด ๊ถํโ ์ ๋ณด๋ฅผ ํ ํฐ์ผ๋ก ๋งค๋ฒ ์ฆ๋ช ํด์ผ ํ๊ธฐ ๋๋ฌธ. - ์ HTTPS๊ฐ ์์ผ๋ฉด ํ ํฐ/์ฟ ํค๊ฐ ํธ๋ฆฌ๋์ง
โ ์ํธํ๊ฐ ์์ผ๋ฉด ๋คํธ์ํฌ ์ค๊ฐ์์ ํจํท์ ํ์ณ๋ณผ ์ ์์ด์, Authorization ํค๋/์ฟ ํค๊ฐ ๊ทธ๋๋ก ๋ ธ์ถ๋๊ธฐ ๋๋ฌธ.
HTTP๋? โ
HTTP๋ ํด๋ผ์ด์ธํธ๊ฐ ํญ์ ๋จผ์ ์์ฒญ์ ๋ณด๋ด๋ ์์ฒญ/์๋ต ๋ชจ๋ธ์ด๋ค.
์๋ฒ๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋จผ์ ๋ง์ ๊ฑธ ์ ์๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ๊ฐ ๋งค๋ฒ ์์ฒญ์ ๋ณด๋ด์ผ๋ง ์๋ต์ ๋ฐ์ ์ ์๋ค.
ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉํ๋ ํต์ ๊ท์ฝ(ํ๋กํ ์ฝ)์ด๋ฉฐ,
HTTP๋ ์ํ๊ฐ ์๋(stateless) ํ๋กํ ์ฝ์ด๋ค.
์ฆ ์๋ฒ๋ ์์ฒญ ๊ฐ์ ์ํ๋ฅผ ๊ธฐ์ตํ์ง ์๊ธฐ ๋๋ฌธ์, ์ธ์ฆ ์ ๋ณด(ํ ํฐ ๋ฑ)๋ฅผ ๋งค ์์ฒญ๋ง๋ค ํฌํจํด์ ๋ณด๋ด์ผ ํ๋ค.
Client โ (์์ฒญ) โ Server
Client โ (์๋ต) โ Server- ๋ธ๋ผ์ฐ์ ๋
์์ฒญ(Request)์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ๊ทธ์ ๋ํ์๋ต(Response)์ ๋๋ ค์ค๋ค.
๐ก HTTP๋ ์ Stateless์ผ๊น?
- HTTP๋
์์ฒญ 1๊ฐ = ์ฒ๋ฆฌ 1๋ฒํ์์ ๋จ์ํ ํต์ ๊ท์ฝ์ด๋ค. - ์๋ฒ๋ ์ด์ ์์ฒญ์ ์ํ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์ง ์๋๋ค.
- ์ฆ, ์๋ฒ๋ "๋ ๋๊ตฌ์์ง..?" ๊ธฐ์ตํ์ง ๋ชปํ๋ค.
๊ทธ๋์ ํด๋ผ์ด์ธํธ๋ ๋งค๋ฒ ์์ ์ ์ ์์ ์ฆ๋ช
ํด์ผ ํ๊ณ ,
์ด๋ฅผ ์ํด ์์ฒญ๋ง๋ค ์๋ ์ ๋ณด๊ฐ ๋ฐ๋ณตํด์ ํฌํจ๋๋ค:
Authorization: Bearer <accessToken>- ๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋์ผ๋ก ๋ณด๋ด๋
Cookie(refreshToken)
๐ก ๊ฒฐ๋ก
HTTP์ stateless ํน์ฑ ๋๋ฌธ์, ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ ๋งค ์์ฒญ๋ง๋ค ์ค์ค๋ก๋ฅผ ์ฆ๋ช
ํด์ผ ํ๋ค.
JWTยท์ฟ ํคยท์ธ์
๊ฐ๋
์ด ์ฌ๊ธฐ์์ ์์ฐ์ค๋ฝ๊ฒ ํ์ํด์ง๋ค!
HTTP/1.1 vs HTTP/2 โ
HTTP/1.1 โ

HTTP/1.1์์๋ ๋ณดํต
์์ฒญ 1 โ ์๋ต 1 โ ์ฐ๊ฒฐ ์ข ๋ฃ- ์ฌ๋ฌ ๋ฆฌ์์ค(HTML, JS, CSS, ์ด๋ฏธ์ง ๋ฑ)๋ฅผ ๋ฐ์์์ผ ํ ๋ ๊ฐ์ ์๋ฒ์ ๋ํด ์ฌ๋ฌ ์ฐ๊ฒฐ์ ์ด์ด์ผ ํด์ ๋ณ๋ชฉ์ด ๋ฐ์ํ ์ ์๋ค. โ ์ด๋ฏธ์ง/JS/CSS๊ฐ ๋ง์์๋ก ๋๋ ค์ง
์ด ๊ตฌ์กฐ๋ ์ ์ ์ธ ์น์๋ ์ถฉ๋ถํ์ง๋ง, ํ๋ ์น(์ฑํ
, ์๋ฆผ, ์ค์๊ฐ ๋ฐ์ดํฐ, ๋๋ ๋ฆฌ์์ค ๋ก๋ฉ)์๋ ํ๊ณ๊ฐ ์๋ค.
์ด๋ฐ ์ฑ๋ฅ ๋ฌธ์ ์ ํ๊ณ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด HTTP/2๊ฐ ๋ฑ์ฅํ๋ค.
HTTP/2 โ

HTTP/2๋ ์ค์๊ฐ ํต์ ๊ธฐ์ ์ด๋ผ๊ธฐ๋ณด๋ค๋,
๋์์ ๋ง์ ๋ฆฌ์์ค๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ๋ฐ์์ค๊ธฐ ์ํ ๋คํธ์ํฌ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ์ ์ด๋ค.
- ํ๋์ TCP ์ฐ๊ฒฐ ๋ด์์ ์ฌ๋ฌ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌ(๋ฉํฐํ๋ ์ฑ) โ ๋ธ๋ผ์ฐ์ ๋ก๋ฉ ์๋๊ฐ ํฌ๊ฒ ๋นจ๋ผ์ง
- ํ ๋ฒ์ TCP ์ฐ๊ฒฐ ์์์ ์ฌ๋ฌ ์์ฒญ์ ๋ณ๋ ฌ๋ก ๋ณด๋
- ๊ฐ ์์ฒญ์ ์คํธ๋ฆผ(stream)์ด๋ผ๋ ๋จ์๋ก ์ฒ๋ฆฌ๋จ
- ํค๋ ์์ถ ๋ฑ ์ถ๊ฐ์ ์ธ ์ต์ ํ ๊ธฐ๋ฒ ์ ๊ณต
๊ฒฐ๊ณผ์ ์ผ๋ก, ๊ฐ์ ํ์ด์ง๋ผ๋ ๋ ๋น ๋ฅด๊ฒ ๋ก๋ฉ๋๋ค.
HTTP ์ค์๊ฐ ํต์ ์ ์งํ โ
๊ธฐ๋ณธ HTTP๋ ์์ฒญ์ด ์์ด์ผ ์๋ตํ๋ 1ํ์ฑ ํต์ ์ด๋ผ ์ค์๊ฐ์ ์ฝํ๋ค.
์ด ํ๊ณ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋ฑ์ฅํ ํจํด๋ค์ด Polling โ Long Polling โ SSE โ WebSocket์ด๋ค.
Polling โ
ํด๋ผ์ด์ธํธ๊ฐ ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ๊ณ์ ์๋ฒ์ ๋ฌผ์ด๋ณด๋ ๋ฐฉ์์ด๋ค.
Client โ "์๋ฆผ ์์ด?" โ Server
Client โ "์๋ฆผ ์์ด?" โ Server
Client โ "์๋ฆผ ์์ด?" โ Server
...- ์ฅ์ : ๊ตฌํ์ด(setInterval + fetch ์ ๋๋ก ๊ฐ๋ฅ) ์ฝ๋ค.
- ๋จ์ :
- ์ค์๊ฐ์ด ์๋ (์์ฒญ ์ฃผ๊ธฐ๋งํผ ๋๋ ์ด)
- ๋งค๋ฒ ์์ฒญ์ผ๋ก ์ธํด ํธ๋ํฝ ๋ญ๋น
- ์๋ฒ ๋ถํ๊ฐ ์ปค์ง ("์์" ์๋ต๋ ๊ณ์ ๋ณด๋ด์ผ ํจ)
Long Polling โ
์ผ๋ฐ Polling์ ๊ฐ์ ํ ๋ฐฉ์์ผ๋ก, ์๋ฒ๊ฐ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์๊ธธ ๋๊น์ง ์๋ต์ ๋ฆ๊ฒ ์ฃผ๋ ๋ฐฉ์์ด๋ค.
Client โ ์์ฒญ ๋ณด๋
Server โ ์ ์ด๋ฒคํธ๊ฐ ์๊ธธ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
Server โ ์ด๋ฒคํธ ๋ฐ์! ์๋ต ์ ์ก
Client โ ๋ฐ๋ก ๋ค์ ์์ฒญ- ์ฅ์ :
- ์ผ๋ฐ ํด๋ง๋ณด๋ค ์ค์๊ฐ์ ๊ฐ๊น๋ค.
- ๊ฑฐ์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ /์๋ฒ ํ๊ฒฝ์์ ๋์ํ๋ค.
- ๋จ์ :
- ์ฐ๊ฒฐ์ ๊ณ์ ์ด์๋ค ๋ซ์๋ค ๋ฐ๋ณต
- ์๋ฒ ๋ถํ๊ฐ ์ฌ์ ํ ํฌ๊ณ
- ์ฑํ /๊ฒ์์ฒ๋ผ ์ด๋ฒคํธ๊ฐ ๋ง์ ์๋น์ค์๋ ๋นํจ์จ์ ์ด๋ค.
SSE (Server-Sent Events) โ
Polling์ด ์๋๋ผ, ์๋ฒ โ ํด๋ผ์ด์ธํธ ๋ฐฉํฅ์ผ๋ก ์ผ๋ฐฉ์ ์ผ๋ก ๊ณ์ ํธ์ ๊ฐ๋ฅํ ๋ฐฉ์์ด๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ํ ๋ฒ ์ฐ๊ฒฐ์ ์ด๋ฉด, ์๋ฒ๊ฐ ์คํธ๋ฆผ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณ์ push ํด์ค๋ค.
Client โ ์ฐ๊ฒฐ ์ด๊ธฐ (GET /streams)
Server โ "์๋ฆผ ๋ฐ์!"
Server โ "์ ๊ธ ๋ฑ๋ก!"
Server โ "์ฃผ์ ๊ฐ๊ฒฉ ๋ณ๊ฒฝ!"
...์ฅ์ :
- ์ง์ง ์ค์๊ฐ์ ๊ฐ๊น๋ค. (๋๋ ์ด ๊ฑฐ์ ์์)
- ์๋ฒ โ ํด๋ผ์ด์ธํธ ๋ฐฉํฅ push ๊ฐ๋ฅ
- ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ์ง์ (EventSource API)
- HTTP ๊ธฐ๋ฐ์ด๋ผ ๋ฐฉํ๋ฒฝ/ํ๋ก์ ํต๊ณผ๊ฐ ์์ํ๋ค.
๋จ์ :
- ๋จ๋ฐฉํฅ: ์๋ฒ โ ํด๋ผ์ด์ธํธ๋ง ๊ฐ๋ฅํ๊ณ ,
ํด๋ผ์ด์ธํธ โ ์๋ฒ๋ ์ฌ์ ํ fetch / AJAX / fetch API ํ์ํ๋ค. - ์๋ฐฉํฅ ์ฑํ ์๋ ๋ถ์ ํฉํ๋ค.
- ์ค๋๋ ๋ธ๋ผ์ฐ์ (IE)๋ ๋ฏธ์ง์
- ๋จ๋ฐฉํฅ: ์๋ฒ โ ํด๋ผ์ด์ธํธ๋ง ๊ฐ๋ฅํ๊ณ ,
WebSocket (์๋ฐฉํฅ ์ค์๊ฐ) โ
HTTP ํ๊ณ๋ฅผ ์์ ํ ๋์ด์, ์๋ฒ โ ํด๋ผ์ด์ธํธ ์๋ฐฉํฅ ์ค์๊ฐ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ์ ์ด๋ค.
์ด๊ธฐ์๋ HTTP ์์ฒญ์ผ๋ก ํธ๋์
ฐ์ดํฌ๋ฅผ ํ๊ณ , ์ดํ์๋ WebSocket ํ๋กํ ์ฝ๋ก ์
๊ทธ๋ ์ด๋๋์ด ๋์ํ๋ค.
Client โ Server
(์์ชฝ ๋ชจ๋ ๋จผ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์)์ฅ์ :
- ์๋ฒ โ ํด๋ผ์ด์ธํธ ์๋ฐฉํฅ ์ค์๊ฐ ํต์
- ์ฑํ , ๊ฒ์, ๊ณต๋ ๋ฌธ์ ํธ์ง ๋ฑ ์ค์๊ฐ์ฑ์ด ์ค์ํ ์๋น์ค์ ์ ํฉํ๋ค.
๋จ์ :
- SSE๋ณด๋ค ๊ตฌํ ๋์ด๋๊ฐ ๋๋ค.
- ์๋ฒ ์ธํ๋ผ์ ๋ํ ๊ณ ๋ ค๊ฐ ํ์ํ๋ค.
- ์ฐ๊ฒฐ์ ๊ณ์ ์ ์งํ๋ฏ๋ก, ์ ์์ ์๊ฐ ๋ง์ผ๋ฉด ์๋ฒ ๋ฆฌ์์ค ๊ด๋ฆฌ๊ฐ ์ค์ํด์ง๋ค.
์ฌ์ฉ ์์:
- ์นด์นด์คํก, ๋์ค์ฝ๋, ๊ฒ์, ํ์ ํด ๋ฑ ์ค์ ์ค์๊ฐ ์๋น์ค์์ ์ฌ์ฉ
HTTP ์์ฒญ(Request)์ ๊ตฌ์กฐ โ

| ๊ตฌ์ฑ ์์ | ์ค๋ช | ์์ |
|---|---|---|
| Request Line | ์ด๋ค ๋ฉ์๋๋ก ์ด๋ค URL๋ก ์์ฒญํ๋์ง | GET /users/1 HTTP/1.1 |
| Method | ์๋ฒ์๊ฒ ์ด๋ค ๋์์ ์์ฒญํ ์ง | GET, POST, PUT, DELETE |
| URL | ์์์ ์์น | https://api.example.com/users |
| Header | ์์ฒญ์ ๋ํ ์ถ๊ฐ ์ ๋ณด (ํ ํฐ, ํ์ ๋ฑ) | Authorization, Cookie, Content-Type |
| Body | ์ค์ ์ ์กํ๋ ๋ฐ์ดํฐ | JSON, FormData ๋ฑ |
Authorization Header โ
Bearer Token ๋ฐฉ์:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...๋ค๋ฅธ ์ธ์ฆ ๋ฐฉ์๋ค:
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l // Base64 ์ธ์ฝ๋ฉ
Authorization: Digest username="user", realm="example.com"
Authorization: API-Key your-api-key-here์ Bearer๋ฅผ ์ธ๊น?
- RFC 6750์์ ์ ์๋ ํ์ค
- ์ด ํ ํฐ์ ๊ฐ์ง ์ฌ๋(Bearer)์๊ฒ ๊ถํ ๋ถ์ฌ๋ผ๋ ์๋ฏธ
- OAuth 2.0์์ ํ์ค์ผ๋ก ์ฌ์ฉ
์์ฒญ ํค๋์์ ๋ฐ๋์ ์ดํดํด์ผ ํ๋ 3๋์ฅ โ
Authorization- accessToken์ ๋ด๋ ๊ณณ
httpAuthorization: Bearer eyJhbGciOiJIUzI1Ni...Cookie- refreshToken์ด ์๋์ผ๋ก ์ ์ฅ๋๊ณ ์๋์ผ๋ก ์ค๋ฆฌ๋ ๊ณณ
httpCookie: refresh_token=abcdefg12345;Content-Type- ์๋ฒ์๊ฒ Body ํด์ ๋ฐฉ๋ฒ์ ์๋ ค์ค
httpContent-Type: application/json
HTTP ์๋ต(Response)์ ๊ตฌ์กฐ โ

| ๊ตฌ์ฑ ์์ | ์ค๋ช |
|---|---|
| Status Line | ์ฑ๊ณต/์คํจ ์ฝ๋ (200, 400, 401, 500 ๋ฑ) |
| Headers | ์๋ฒ๊ฐ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ ๋ฌํ๋ ์ ๋ณด |
| Body | ์ค์ ์๋ต ๋ฐ์ดํฐ |
Representation Headers๋? โ
Representation Headers๋ ์๋ต Body(์ฝํ
์ธ ) ์์ฒด์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
(Content-Type, Content-Length, Last-Modified, ETag ๋ฑ)
์ฆ, โ์ด Body๋ ์ด๋ค ํ์์ ๋ฐ์ดํฐ์ธ์ง, ์ธ์ ๋ง๋ค์ด์ก๊ณ , ์ผ๋ง๋ ํฌ๊ณ , ์บ์ฑ์ ์ด๋ป๊ฒ ํด์ผ ํ๋์งโ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
์๋ต ํค๋์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ: Set-Cookie โ
Set-Cookie: refresh_token=abcd1234; HttpOnly; Secure; SameSite=Strict- ๋ธ๋ผ์ฐ์ ๋
Set-Cookieํค๋๋ฅผ ๋ฐ๋ ์๊ฐ ์๋์ผ๋ก ์ฟ ํค๋ฅผ ์ ์ฅํ๊ณ ,
๊ฐ์ ๋๋ฉ์ธ/๊ฒฝ๋ก ๊ท์น์ ๋ง๋ ์์ฒญ์ ๋ณด๋ผ ๋Cookieํค๋์ ์๋์ผ๋ก ์ค์ด ๋ณด๋ธ๋ค. - ํ๋ก ํธ ์ฝ๋์์ ๋ฐ๋ก ์ ์ฅ ๋ก์ง์ ์์ฑํ ํ์๊ฐ ์๋ค.
ํ๋ก ํธ์์ ๋ฐ๋ก ์ ์ฅ ๋ก์ง์ ์์ฑํด์ผํ๋ ๊ฒฝ์ฐ๋?
accessToken์ localStorage์ ์ ์ฅํ๊ณ ์ถ์ ๋
โ JS ์ฝ๋๋กlocalStorage.setItem()ํด์ผ ํ๋ค. (Zustand persist๊ฐ ์ด ๊ณผ์ ์ ์๋ํํด ์ฃผ๋ ๊ฒ๋ฟ์ด๋ค.)๋ธ๋ผ์ฐ์ ์์ ์ ๊ทผ ๊ฐ๋ฅํ ์ฟ ํค(non-httpOnly)๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ
โdocument.cookie = "key=value"๋ก ์ ์ฅ ๊ฐ๋ฅ
(ํ์ง๋ง ๋ณด์ ๋ฌธ์ ๋๋ฌธ์ ์ค์ ์๋น์ค์์๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋๋ค.)์๋ฒ๊ฐ ์ฟ ํค๋ฅผ ์ฃผ์ง ์๊ณ , ํ๋ก ํธ๊ฐ ์ง์ ์ํ๋ฅผ ์ ์ฅํด์ผ ํ ๋
(์: ๋ก๊ทธ์ธ ๋์ด ์์ ํ๋๊ทธ๋ฅผ ๋จ์ํ localStorage์ ๋ฃ๋ ๊ฒฝ์ฐ ๋ฑ)
๐ก ๊ฒฐ๋ก :
- refreshToken์ ์๋ฒ๊ฐ httpOnly ์ฟ ํค๋ก ๋ด๋ ค์ฃผ๊ณ , ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ๊ด๋ฆฌํ๋ค.
- ํ๋ก ํธ๋ refreshToken์ localStorage์ ์ง์ ์ ์ฅํ์ง ์๋๋ค.
- accessToken์ JS ์ฝ๋(๋๋ Zustand persist ๋ฑ)๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ/์คํ ๋ฆฌ์ง์ ์ ์ฅํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
Set-Cookie๊ฐ ์๋ ์ ์ฅ๋๋ ์กฐ๊ฑด โ
์๋ฒ๊ฐ
Set-Cookieํค๋๋ก ์ฟ ํค๋ฅผ ๋ด๋ ค์ค ๊ฒhttpSet-Cookie: refresh_token=abc123; HttpOnly; Secure๋๋ฉ์ธ/๊ฒฝ๋ก ๊ท์น์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ด ์์ ๊ฒ
httpSet-Cookie: refresh_token=abc; Domain=example.com; Path=/์ถ๊ฐ ์์ฑ๋ค
- Secure: HTTPS ์ฐ๊ฒฐ์์๋ง ์ฟ ํค๋ฅผ ์ ์ก
- SameSite: ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ ์ ์ฟ ํค ์ ์ก์ ์ผ๋ง๋ ์ ํํ ์ง ์ ์ด
์ด ์กฐ๊ฑด๋ค์ ๋ง์กฑํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์ฟ ํค๋ฅผ ์๋์ผ๋ก ์ ์ฅํ๊ณ ,
ํด๋น ๋๋ฉ์ธ/๊ฒฝ๋ก๋ก ์์ฒญ์ ๋ณด๋ผ ๋ ์๋์ผ๋ก Cookie ํค๋์ ์ค์ด์ ๋ณด๋ธ๋ค.
์์ฃผ ์ฐ๋ HTTP ๋ฉ์๋ โ
| ๋ฉ์๋ | ์ค๋ช | ์ฌ์ฉ ์์ |
|---|---|---|
| GET | ๋ฐ์ดํฐ ์กฐํ | ๊ฒ์๊ธ ๋ชฉ๋ก ๋ณด๊ธฐ |
| POST | ๋ฐ์ดํฐ ์์ฑ | ์ ๊ธ ์์ฑ |
| PUT | ์ ์ฒด ์์ | ํ๋กํ ์ ์ฒด ์์ |
| PATCH | ์ผ๋ถ ์์ | ๋๋ค์๋ง ์์ |
| DELETE | ๋ฐ์ดํฐ ์ญ์ | ๊ธ ์ญ์ |
HTTP Status Code โ
์ธ์ฆ/์ธ๊ฐ ๊ด๋ จํด์ ์์ฃผ ๋ง๋๋ ์ํ ์ฝ๋๋ค:
| ์ฝ๋ | ์๋ฏธ | ์ธ์ฆ ์ํฉ์์ |
|---|---|---|
| 200 | ์ฑ๊ณต | ๋ก๊ทธ์ธ ์ฑ๊ณต, API ์์ฒญ ์ฑ๊ณต |
| 401 | Unauthorized | AccessToken ๋ง๋ฃ/์์ โ ํ ํฐ ์ฌ๋ฐ๊ธ ํ์ |
| 403 | Forbidden | ๊ถํ ์์ โ ๋ค๋ฅธ ์ฌ์ฉ์ ๋ฐ์ดํฐ ์ ๊ทผ ์๋ |
| 422 | Unprocessable Entity | ๋ก๊ทธ์ธ ์ ๋ณด ํ๋ฆผ (์ด๋ฉ์ผ/๋น๋ฐ๋ฒํธ ์ค๋ฅ) |
| 500 | Server Error | ์๋ฒ ์ค๋ฅ |
401 vs 403 ์ฐจ์ด์ โ
- 401: ๋๊ตฌ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ด โ ์ธ์ฆ ํ์
- 403: ๋๊ตฐ์ง๋ ์๊ฒ ๋๋ฐ ๊ถํ ์์ด โ ์ ๊ทผ ๊ธ์ง

HTTPS (Hyper-Text Transfer Protocol Secure) โ
HTTPS๊ฐ ํ์ํ ์ด์ โ
๋ด๊ฐ ์ฌ์ดํธ์ ๋ณด๋ด๋ ๋ชจ๋ ๋ฐ์ดํฐ(ํ ํฐ, ์ฟ ํค, ๋น๋ฐ๋ฒํธ ๋ฑ)๊ฐ ์ํธํ๋๋ค.
๋์นญํค ์ํธํ+๋น๋์นญํค ์ํธํ๋ฅผ ์กฐํฉํด์ ์ฌ์ฉํ๋ค.- ์ค๊ฐ์์ ํจํท์ ํ์ณ๋ณด๋๋ผ๋ ๋ด์ฉ์ ์์๋ณผ ์ ์๋ค.
์ ์ํ ์๋ฒ๊ฐ ์ง์ง ์๋ฒ์ธ์ง ์ธ์ฆ๋๋ค. (MITM ๊ณต๊ฒฉ ๋ฐฉ์ง)
- CA(๊ณต์ธ ์ธ์ฆ๊ธฐ๊ด)๊ฐ ๋ฐ๊ธํ ์ธ์ฆ์๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ์ ์์ ๊ฒ์ฆํ๋ค.
- ์ฌ์ฉ์๊ฐ ์ ์ํ ๊ณณ์ด โ์ง์ง ์ฐ๋ฆฌ ์๋ฒ์ธ์งโ ํ์ธํ ์ ์๋ค.
- ๊ฐ์ง ์๋ฒ๋ก ํ ํฐ/์ฟ ํค๊ฐ ํธ๋ฆฌ๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
๋ ๋ณด์ ๊ธฐ๋ฅ์ด ๋์ํ๋ ์๋ฆฌ โ
๋์นญํค ์ํธํ
- ์ํธํ/๋ณตํธํ์ ๊ฐ์ ํค๋ฅผ ์ฌ์ฉ
- ์๋๊ฐ ๋น ๋ฅด์ง๋ง, ํค๊ฐ ํธ๋ฆฌ๋ฉด ๋!
๋น๋์นญํค ์ํธํ (๊ณต๊ฐํค/๊ฐ์ธํค)
- ๋น๋์นญํค๋ก ์์ ํ ํต์ ์ฑ๋์ ๋ง๋ค๊ณ ์ดํ ๋์นญํค๋ก ๋น ๋ฅด๊ฒ ์ํธํํ๋ฉฐ ํต์ ํ๋ค.
(๊ณต๊ฐํค๋ก ์ํธํ โ ๊ฐ์ธํค๋ก๋ง ๋ณตํธํ ๊ฐ๋ฅ) - ํค ๊ตํ/์ธ์ฆ์ ๊ฐํ๋ค.
- ๋น๋์นญํค๋ก ์์ ํ ํต์ ์ฑ๋์ ๋ง๋ค๊ณ ์ดํ ๋์นญํค๋ก ๋น ๋ฅด๊ฒ ์ํธํํ๋ฉฐ ํต์ ํ๋ค.
์ค์ HTTPS์์๋ ์ฒ์ ์ฐ๊ฒฐํ ๋ TLS Handshake ๊ณผ์ ์์ ๋น๋์นญํค(๊ณต๊ฐํค/๊ฐ์ธํค)๋ฅผ ์ฌ์ฉํด ์์ ํ๊ฒ ์ธ์
ํค(๋์นญํค)๋ฅผ ๊ตํํ๊ณ , ์ดํ ๋ชจ๋ ์ค์ ๋ฐ์ดํฐ๋ ์ด ๋์นญํค๋ก ๋น ๋ฅด๊ณ ์์ ํ๊ฒ ์ํธํํด์ ํต์ ํ๋ค.
์ ๋ฆฌ โ
๐ก
- HTTP๋ ์์ฒญ์ด ์์ด์ผ ์๋ตํ๋ stateless ๋ชจ๋ธ์ด๋ค.
- ์ธ์ฆ ์ ๋ณด(ํ ํฐ)๋ ๋งค ์์ฒญ๋ง๋ค ํฌํจํด์ ๋ณด๋ด์ผ ํ๋ค.
- refreshToken์ ๋ณดํต httpOnly ์ฟ ํค๋ก ๊ด๋ฆฌ๋๊ณ ,
accessToken์๋ฉ๋ชจ๋ฆฌ ๋๋ ์คํ ๋ฆฌ์ง(localStorage ๋ฑ)์ ์ ์ฅํดAuthorization ํค๋๋ก ๋ณด๋ธ๋ค. Set-Cookie๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ์ ์ฅ + ์๋ ์ ์กํ๋ฉฐ,
๋๋ฉ์ธ/๊ฒฝ๋ก/๋ณด์ ์์ฑ(Secure, SameSite ๋ฑ)์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง๋ค.- HTTP/1.1์ ํ๊ณ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด HTTP/2, SSE/ WebSocket ๊ฐ์ ๊ธฐ์ ๋ค์ด ๋ฑ์ฅํ๋ค.
- HTTPS๋ ์ํธํ + ์๋ฒ ์ธ์ฆ์ ์ ๊ณตํด ํ ํฐ/์ฟ ํค/๋น๋ฐ๋ฒํธ๋ฅผ ์์ ํ๊ฒ ์ง์ผ์ค๋ค.
์ด์ HTTP๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํดํ์ผ๋,
์ธ์ฆ์ ํ์ํ ์ฟ ํค, ์คํ ๋ฆฌ์ง, ์ธ์
์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด๋ณด์!