Web/HTTP

HTTP 헀더 - 일반 헀더

 

πŸ“’ Intro

πŸ“Œμš©λ„

• HTTP μ „솑에 ν•„μš”ν•œ λͺ¨λ“  λΆ€κ°€μ •보 <body>...</body> </html>
• μ˜ˆ) λ©”μ‹œμ§€ λ°”λ””μ˜ λ‚΄μš©, λ©”μ‹œμ§€ λ°”λ””μ˜ ν¬κΈ°, μ••μΆ•, μΈμ¦, μš”μ²­ ν΄λΌμ΄μ–ΈνŠΈ, μ„œλ²„ μ •보, μΊ μ‹œ κ΄€λ¦¬ μ •보...
• ν‘œμ€€ ν—€λ”κ°€ λ„ˆλ¬΄ λ§ŽμŒ 

https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
• ν•„μš”μ‹œ μž„μ˜μ˜ 헀더 μΆ”κ°€ κ°€λŠ₯

πŸ“Œ HTTP BODY

• λ©”μ‹œμ§€ λ³Έλ¬Έ(message body)을 ν†΅ν•΄ ν‘œν˜„ λ°μ΄ν„° μ „달 

• λ©”μ‹œμ§€ λ³Έλ¬Έ = νŽ˜μ΄λ‘œλ“œ(payload) 

• ν‘œν˜„은 μš”μ²­μ΄λ‚˜ μ‘λ‹΅μ—μ„œ μ „달할 μ‹€μ œ λ°μ΄ν„° 

• ν‘œν˜„ ν—€λ”λŠ” ν‘œν˜„ λ°μ΄ν„°λ₯Ό ν•΄μ„ν•  μˆ˜ μžˆλŠ” μ •보 μ œκ³΅ 

• λ°μ΄ν„° μœ ν˜•(html, json), λ°μ΄ν„° κΈΈμ΄, μ••μΆ• μ •보 λ“±λ“±
• μ°Έκ³ : ν‘œν˜„ ν—€λ”λŠ” ν‘œν˜„ λ©”타데이터와, νŽ˜μ΄λ‘œλ“œ λ©”μ‹œμ§€λ₯Ό κ΅¬λΆ„ν•΄μ•Ό ν•˜μ§€λ§Œ, μ—¬κΈ°μ„œλŠ” μƒλž΅

 

 

πŸ“’ ν‘œν˜„

νšŒμ›μ΄λΌλŠ” λ¦¬μ†ŒμŠ€λ₯Ό 'HTML'μ΄λΌλŠ” ν‘œν˜„μœΌλ‘œ 전달할거야, 'JSON'μ΄λΌλŠ” ν‘œν˜„μœΌλ‘œ 전달할거야.

• Content-Type: ν‘œν˜„ λ°μ΄ν„°μ˜ ν˜•식 

• Content-Encoding: ν‘œν˜„ λ°μ΄ν„°μ˜ μ••μΆ• λ°©μ‹ 

• Content-Language: ν‘œν˜„ λ°μ΄ν„°μ˜ μžμ—° μ–Έμ–΄ 

• Content-Length: ν‘œν˜„ λ°μ΄ν„°μ˜ κΈΈμ΄


• ν‘œν˜„ ν—€λ”λŠ” μ „솑, μ‘λ‹΅ λ‘˜λ‹€ μ‚¬μš©

 

πŸ“ Content-Type: ν‘œν˜„ λ°μ΄ν„°μ˜ ν˜•μ‹ μ„€λͺ…

예)

• text/html; charset=utf-8 

• application/json
• image/png

 

πŸ“ Content-Encoding: ν‘œν˜„ 데이터 인코딩

• ν‘œν˜„ λ°μ΄ν„°λ₯Ό μ••μΆ•ν•˜κΈ° μœ„ν•΄ μ‚¬μš© 

• λ°μ΄ν„°λ₯Ό μ „λ‹¬ν•˜λŠ” κ³³μ—μ„œ μ••μΆ• ν›„ μΈμ½”λ”© ν—€λ” μΆ”κ°€ 

• λ°μ΄ν„°λ₯Ό μ½λŠ” μͺ½μ—μ„œ μΈμ½”λ”© ν—€λ”μ˜ μ •λ³΄λ‘œ μ••μΆ• ν•΄μ œ 

• 예) gzip, deflate, identity

 

πŸ“ Content-Language: ν‘œν˜„ λ°μ΄ν„°μ˜ μžμ—° μ–Έμ–΄

• ν‘œν˜„ λ°μ΄ν„°μ˜ μžμ—° μ–Έμ–΄λ₯Ό ν‘œν˜„ 

• 예) ko, en, en-US

 

πŸ“ Content-Length: ν‘œν˜„ λ°μ΄ν„°μ˜ 길이

• byteλ‹¨μœ„ 

• Transfer-Encoding(전솑 μ½”λ”©)을 μ‚¬μš©ν•˜λ©΄ Content-Lengthλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆλ¨.

 

 

πŸ“’ ν˜‘μƒ(μ½˜ν…μΈ  λ„€κ³ μ‹œμ—μ΄μ…˜)
: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„ ν˜Έν•˜λŠ” ν‘œν˜„ μš”μ²­

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ›ν•˜λŠ” ν‘œν˜„λŒ€λ‘œ ν‘œν˜„ 데이터λ₯Ό μ€˜μ•Όν•΄~!

 

• Accept: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„ ν˜Έν•˜λŠ” λ―Έλ””μ–΄ νƒ€μž… μ „달 

• Accept-Charset: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„ ν˜Έν•˜λŠ” λ¬Έμž μΈμ½”λ”© 

• Accept-Encoding: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„ ν˜Έν•˜λŠ” μ••μΆ• μΈμ½”λ”© 

• Accept-Language: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„ ν˜Έν•˜λŠ” μžμ—° μ–Έμ–΄


• ν˜‘상 ν—€λ”λŠ” μš”μ²­μ‹œμ—λ§Œ μ‚¬μš©

πŸ“Œ ν˜‘μƒκ³Ό μš°μ„ μˆœμœ„ 

0. κ°’: Quality Values(q)

1. 0~1, 클수둝 높은 μš°μ„ μˆœμœ„ (μƒλž΅ν•˜λ©΄ 1)

2. ꡬ체적인 것이 μš°μ„ 

3. ꡬ체적인 것을 κΈ°μ€€μœΌλ‘œ λ―Έλ””μ–΄ νƒ€μž…μ„ 맞좀.

• μ˜ˆ) Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 

ko-KR;q=1 (qμƒλž΅) ko;q=0.9 
en-US;q=0.8 en:q=0.7

 

 

πŸ“’ 전솑 방식

• λ‹¨μˆœ 전솑: ν•œλ²ˆμ— μš”μ²­ν•˜κ³  ν•œλ²ˆμ— λ°›μŒ.

• μ••μΆ• 전솑: gzip 등을 μ‚¬μš©ν•΄ μ••μΆ•ν•΄μ„œ μ£Όκ³  λ°›μŒ. (Content-Encoding: gzip 포함 ν•„μˆ˜)

• λΆ„ν•  전솑: μž„μ˜μ˜ λ‹¨μœ„λŒ€λ‘œ μͺΌκ°œμ„œ μ£Όκ³  λ°›μŒ. (Content-Length λ„£μœΌλ©΄ μ•ˆλ¨.)
• λ²”μœ„ 전솑: 전체 쀑에 ν•„μš”ν•œ λ²”μœ„λ₯Ό μ§€μ •ν•΄μ„œ μ£Όκ³  λ°›μŒ.

 

 

πŸ“’ 일반 정보

πŸ“ From: μœ μ € μ—μ΄μ „νŠΈμ˜ μ΄λ©”일 μ •보

• μΌλ°˜μ μœΌλ‘œ μž˜ μ‚¬μš©λ˜μ§€ μ•ŠμŒ 

• κ²€μƒ‰ μ—”μ§„ κ°™μ€ κ³³μ—μ„œ, μ£Όλ‘œ μ‚¬μš©
• μš”μ²­μ—μ„œ μ‚¬μš©

 

πŸ“ Referer: μ΄μ „ μ›Ή νŽ˜μ΄μ§€ μ£Όμ†Œ

• ν˜„μž¬ μš”μ²­λœ νŽ˜μ΄μ§€μ˜ μ΄μ „ μ›Ή νŽ˜μ΄μ§€ μ£Όμ†Œ 

• A -> B둜 μ΄λ™ν•˜λŠ” κ²½μš° Bλ₯Ό μš”μ²­ν•  λ•Œ Referer: A λ₯Ό ν¬ν•¨ν•΄μ„œ μš”μ²­ 

• Refererλ₯Ό μ‚¬μš©ν•΄μ„œ μœ μž… κ²½λ‘œ λΆ„석 κ°€λŠ₯ 

• μš”μ²­μ—μ„œ μ‚¬μš©
• μ°Έκ³ : refererλŠ” λ‹¨μ–΄ referrer의 μ˜€νƒ€

 

πŸ“ User-Agent: μœ μ € μ—μ΄μ „νŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ •보

• user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
• ν΄λΌμ΄μ–ΈνŠΈμ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 정보(μ›Ή λΈŒλΌμš°μ € 정보, λ“±λ“±) 

• ν†΅κ³„ μ •보 

• μ–΄λ–€ μ’…λ₯˜μ˜ λΈŒλΌμš°μ €μ—μ„œ μž₯μ• κ°€ λ°œμƒν•˜λŠ”μ§€ νŒŒμ•… κ°€λŠ₯
• μš”μ²­μ—μ„œ μ‚¬μš©

 

πŸ“ Server: μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” ORIGIN μ„œλ²„μ˜ μ†Œν”„νŠΈμ›¨μ–΄ 정보

* ORIGIN μ„œλ²„: 쀑간에 μ—¬λŸ¬ 개의 ν”„λ‘μ‹œ μ„œλ²„λ₯Ό κ±°μΉ˜λŠ”λ°, μ§„μ§œ λ‚˜μ˜ μš”μ²­μ΄ 도착할 λ§ˆμ§€λ§‰ μ„œλ²„

• Server: Apache/2.2.22 (Debian) 

• server: nginx
• μ‘λ‹΅μ—μ„œ μ‚¬μš©

 

πŸ“ Date: λ©”μ‹œμ§€κ°€ μƒμ„±λœ λ‚ μ§œ

• Date: Tue, 15 Nov 1994 08:12:31 GMT 

• μ‘λ‹΅μ—μ„œ μ‚¬μš©

 

 

πŸ“’ νŠΉλ³„ν•œ 정보

πŸ“ Host: μš”μ²­ν•œ 호슀트 정보(도메인) -ν•„μˆ˜!!

 

* κ°€μƒν˜ΈμŠ€νŠΈλ₯Ό 톡해 μ—¬λŸ¬ 도메인을 ν•œλ²ˆμ— μ²˜λ¦¬ν•  수 μžˆλŠ” μ„œλ²„(μ‹€μ œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ—¬λŸ¬κ°œ ꡬ동될 수 있음.)μ—κ²Œ μš”μ²­μ„ 보내야 ν•œλ‹€λ©΄?

 

• ν•˜λ‚˜μ˜ μ„œλ²„κ°€ μ—¬λŸ¬ 도메인을 μ²˜λ¦¬ν•΄μ•Ό ν•  λ•Œ
• ν•˜λ‚˜μ˜ IP μ£Όμ†Œμ— μ—¬λŸ¬ λ„메인이 μ μš©λ˜μ–΄ μžˆμ„ λ•Œ

• μš”μ²­μ—μ„œ μ‚¬μš© 

 

πŸ“ Location: νŽ˜μ΄μ§€ λ¦¬λ‹€μ΄λ ‰μ…˜

• μ›Ή λΈŒλΌμš°μ €λŠ” 3xx μ‘λ‹΅μ˜ κ²°κ³Όμ— Location ν—€λ”κ°€ μžˆμœΌλ©΄, Location μœ„μΉ˜λ‘œ μžλ™ μ΄λ™ (λ¦¬λ‹€μ΄λ ‰νŠΈ)
• μ‘λ‹΅μ½”λ“œ 3xxμ—μ„œ μ„€λͺ… 

• 201 (Created): Location κ°’은 μš”청에 μ˜ν•΄ μƒμ„±λœ λ¦¬μ†ŒμŠ€ URI
• 3xx (Redirection): Location 값은 μš”μ²­μ„ μžλ™μœΌλ‘œ λ¦¬λ””λ ‰μ…˜ν•˜κΈ° μœ„ν•œ λŒ€μƒ λ¦¬μ†ŒμŠ€λ₯Ό 가리킴.

 

πŸ“ Allow: ν—ˆμš© κ°€λŠ₯ν•œ HTTP λ©”μ„œλ“œ

• 405 (Method Not Allowed) μ—μ„œ μ‘닡에 ν¬ν•¨ν•΄μ•Όν•¨ 

• Allow: GET, HEAD, PUT

 

πŸ“ Retry-After: μœ μ € μ—μ΄μ „νŠΈκ°€ λ‹€μŒ μš”청을 ν•˜κΈ°κΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜λŠ” μ‹œκ°„

• 503 (Service Unavailable): μ„œλΉ„μŠ€κ°€ μ–Έμ œκΉŒμ§€ λΆˆλŠ₯인지 μ•Œλ €μ€„ μˆ˜ μžˆμŒ 

• Retry-After: Fri, 31 Dec 1999 23:59:59 GMT (λ‚ μ§œ ν‘œκΈ°)
• Retry-After: 120 (μ΄ˆλ‹¨μœ„ ν‘œκΈ°)

 

 

πŸ“’ 인증

μΈμ¦ν•˜λŠ” λ‹€μ–‘ν•œ 방법듀이 μžˆλŠ”λ° (OAuth λ“±λ“±) λ°©λ²•λ“€λ§ˆλ‹€ ν•„μš”ν•œ 정보가 닀름.

 

πŸ“ Authorization: ν΄λΌμ΄μ–ΈνŠΈ 인증 정보λ₯Ό μ„œλ²„μ— 전달

• Authorization: Basic xxxxxxxxxxxxxxxx

 

πŸ“ WWW-Authenticate: λ¦¬μ†ŒμŠ€ μ ‘κ·Όμ‹œ ν•„μš”ν•œ μΈμ¦ λ°©λ²• μ •μ˜

• λ¦¬μ†ŒμŠ€ μ ‘κ·Όμ‹œ ν•„μš”ν•œ μΈμ¦ λ°©λ²• μ •μ˜ 

• 401 Unauthorized μ‘λ‹΅κ³Ό ν•¨κ»˜ μ‚¬μš©
• WWW-Authenticate: Newauth realm="apps", type=1,
title="Login to \"apps\"", Basic realm="simple"

 

 

πŸ“’ μΏ ν‚€ (Cookie)

πŸ“Œ ν•„μš”μ„±

μœ μ €κ°€ 둜그인 ν–ˆλŠ”λ°, λ‹€μ‹œ 둜그인 νŽ˜μ΄μ§€ μ ‘μ†ν–ˆλ”λ‹ˆ λ‘œκ·ΈμΈν•œκ±Έ λͺ°λΌ. 

μ—¬κΈ°μ„œ λ“±μž₯ν•˜λŠ” stateless.

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„κ°€ μš”μ²­κ³Ό 응닡을 μ£Όκ³  λ°›μœΌλ©΄ 연결이 λŠμ–΄μ§€κ³ , μ—°κ²° λŠμ–΄μ§€λ©΄ 이전 μš”μ²­μ„ κΈ°μ–΅ν•˜μ§€ λͺ»ν•¨.

μ„œλ²„λŠ” λ‘œκ·ΈμΈν•œ μ‚¬μš©μž 정보λ₯Ό μ•Œκ³  μžˆμ–΄μ•Ό 함.

그럼 λͺ¨λ“  μš”μ²­μ— 링크와 μ‚¬μš©μž 정보λ₯Ό ν¬ν•¨μ‹œμΌœ? λ μš©μ΄μ§€ 개발 κ΄€μ μ—μ„œλ„ νž˜λ“€κ³ .

 

πŸ“Œ Set-Cookie: μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μΏ ν‚€ 전달(응닡)

1. μ›Ή λΈŒλΌμš°μ €κ°€ μš”μ²­μ„ 보내면,

2. μ„œλ²„κ°€ Set-Cookie둜 μΏ ν‚€λ₯Ό λ§Œλ“€μ–΄μ„œ 이런 응닡을 보냄.

HTTP/1.1 200 OK
Set-Cookie: user=홍길동

3. μ›Ή λΈŒλΌμš°μ €λŠ” μΏ ν‚€ μ €μž₯μ†Œλ₯Ό κ°–κ³  μžˆλŠ”λ°, 이 μ €μž₯μ†Œμ— μ„œλ²„λ‘œλΆ€ν„° 받은 κ·Έ μΏ ν‚€λ₯Ό μ €μž₯ν•΄λ‘ .

둜그인 μ΄ν›„μ—λŠ”?

4. μ›Ή λΈŒλΌμš°μ €λŠ” κ·Έ μ§€μ •λœ μ„œλ²„μ— HTTP μš”μ²­μ„ λ³΄λ‚Όλ•Œλ§ˆλ‹€ 무쑰건 μžλ™μœΌλ‘œ μΏ ν‚€ μ €μž₯μ†Œλ₯Ό λ’€μ Έμ„œ κ·Έ μΏ ν‚€λ‘œ μ„œλ²„λ‘œ 전달.

 

• 예) set-cookie: sessionId=abcde1234; expires=Sat, 26-Dec-2020 00:00:00 GMT; path=/; domain=.google.com; Secure

 

πŸ“Œ νŠΉμ§•

•  μ£Ό μ‚¬μš©μ²˜: μ‚¬μš©μž 둜그인 μ„Έμ…˜ 관리, κ΄‘κ³  정보 νŠΈλž˜ν‚Ή

•  μΏ ν‚€ μ •λ³΄λŠ” 항상 μ„œλ²„μ— 전솑됨.

• λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½ μΆ”κ°€ μœ λ°œ 

• μ΅œμ†Œν•œμ˜ μ •λ³΄λ§Œ μ‚¬μš©(μ„Έμ…˜ id, OAuth-인증 토큰) 

• μ„œλ²„μ— μ „μ†‘ν•˜μ§€ μ•Šκ³ , μ›Ή λΈŒλΌμš°μ € 내뢀에 데이터λ₯Ό μ €μž₯ν•˜κ³  μ‹ΆμœΌλ©΄ μ›Ή μŠ€ν† λ¦¬μ§€ (localStorage, sessionStorage)

(*  μ›Ή μŠ€ν† λ¦¬μ§€: μš”μ²­ν• λ•Œλ§ˆλ‹€ μ„œλ²„μ— λ³΄λ‚΄λŠ”κ²Œ μ•„λ‹ˆλΌ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ κ°–κ³  μžˆλ‹€κ°€, ν•„μš”ν•œ λ‘œμ§μ—μ„œ κΊΌλ‚΄ μ“Έ 수 μžˆλŠ” μ €μž₯곡간)

• 주의! λ³΄μ•ˆμ— λ―Όκ°ν•œ λ°μ΄ν„°λŠ” μ €μž₯ν•˜λ©΄ μ•ˆλ¨. (주민번호, μ‹ μš©μΉ΄λ“œ 번호 λ“±)

 

 

πŸ“Œ 생λͺ…μ£ΌκΈ° (Expires, max-age)

• Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT  -> 만료일이 되면 μΏ ν‚€ μ‚­μ œ
• Set-Cookie: max-age=3600 (3600초) -> 0μ΄λ‚˜ 음수λ₯Ό μ§€μ •ν•˜λ©΄ μΏ ν‚€ μ‚­μ œ
• μ„Έμ…˜ μΏ ν‚€: λ§Œλ£Œ λ‚ μ§œλ₯Ό μƒλž΅ν•˜λ©΄ λΈŒλΌμš°μ € μ’…λ£Œμ‹œ κΉŒμ§€λ§Œ μœ μ§€
• μ˜μ† μΏ ν‚€: λ§Œλ£Œ λ‚ μ§œλ₯Ό μž…λ ₯ν•˜λ©΄ ν•΄λ‹Ή λ‚ μ§œκΉŒμ§€ μœ μ§€

 

πŸ“Œ λ„메인 (Domain)

• μΏ ν‚€λŠ” 도메인을 μ§€μ •ν•  수 있음. 

• λͺ…μ‹œ: λͺ…μ‹œν•œ λ¬Έμ„œ κΈ°μ€€ λ„메인 + μ„œλΈŒ λ„메인 ν¬ν•¨

• μƒλž΅: ν˜„μž¬ λ¬Έμ„œ κΈ°μ€€ λ„λ©”μΈλ§Œ μ μš© 

 

예) domain=example.org 

<λͺ…μ‹œ>

• domain=example.orgλ₯Ό μ§€μ •ν•΄μ„œ μΏ ν‚€ 생성

• example.orgλŠ” λ¬Όλ‘  dev.example.org도 μΏ ν‚€ μ ‘κ·Ό

<μƒλž΅>

• example.org μ—μ„œ μΏ ν‚€λ₯Ό μƒμ„±ν•˜κ³  domain μ§€μ •을 μƒλž΅ 

• example.org μ—μ„œλ§Œ μΏ ν‚€ μ ‘κ·Ό, dev.example.orgλŠ” μΏ ν‚€ λ―Έμ ‘κ·Ό

 

πŸ“Œ κ²½λ‘œ

• μ΄ κ²½λ‘œλ₯Ό ν¬ν•¨ν•œ ν•˜μœ„ κ²½λ‘œ νŽ˜μ΄μ§€λ§Œ μΏ ν‚€ μ ‘κ·Ό 

• μΌλ°˜μ μœΌλ‘œ path=/ λ£¨νŠΈλ‘œ μ§€μ •

 

πŸ“Œ λ³΄μ•ˆ (Secure, HttpOnly, SameSite)

πŸ“ Secure 

• μΏ ν‚€λŠ” http, httpsλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•Šκ³  μ „솑 

• Secureλ₯Ό μ μš©ν•˜λ©΄ https인 κ²½μš°μ—λ§Œ 전솑

 

πŸ“ HttpOnly 

• XSS κ³΅κ²© λ°©μ§€ 

• μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ ‘κ·Ό λΆˆκ°€(document.cookie) 

• HTTP μ „μ†‘μ—λ§Œ μ‚¬μš©


πŸ“ SameSite 

• XSRF κ³΅κ²© λ°©μ§€
• μš”μ²­ λ„메인과 μΏ ν‚€μ— μ„€μ •λœ λ„메인이 κ°™μ€ κ²½μš°λ§Œ μΏ ν‚€ μ „솑

'Web > HTTP' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

검증 헀더와 쑰건뢀 μš”μ²­  (0) 2022.01.12
μΊμ‹œ  (0) 2022.01.12
HTTP μƒνƒœ μ½”λ“œ  (0) 2022.01.11
HTTP API 섀계 μ˜ˆμ‹œ  (0) 2022.01.11
HTTP λ©”μ„œλ“œμ™€ ν™œμš©  (0) 2022.01.10