STUDYπŸ„

[HTTP] 7. HTTP 헀더1 - 일반 헀더πŸͺ

쏴리쏭 2025. 3. 9. 17:52

μ•ˆλ…•ν•˜μ„Έμš”!

벌써 μ„Ήμ…˜7이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€!!

그럼 μ‹œμž‘ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

κ³ κ³ !!


1. HTTP 헀더 κ°œμš”

1-1. HTTP 헀더

HTTP ν—€λ”λŠ” header-field = field-name ":" OWS field-value OWS (OWS: 띄어쓰기 ν—ˆμš©) 이런 ν˜•μ‹μ„ κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, field-name은 λŒ€μ†Œλ¬Έμž ꡬ문이 μ—†μŠ΅λ‹ˆλ‹€.

HTTP ν—€λ”μ˜ νŠΉμ§•μ— κ΄€ν•˜μ—¬ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

HTTP ν—€λ”λŠ” μ‹œμž‘λΌμΈ μ œμ™Έν•˜κ³  HTTP 전솑에 ν•„μš”ν•œ λͺ¨λ“  λΆ€κ°€ 정보λ₯Ό λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, λ©”μ‹œμ§€ λ°”λ””μ˜ λ‚΄μš©, λ©”μ‹œμ§€ λ°”λ””μ˜ 크기, μ••μΆ•, 인증, μš”μ²­ ν΄λΌμ΄μ–ΈνŠΈ, μ„œλ²„ 정보, μΊμ‹œ 관리 정보 λ“±λ“± 말이죠.

λ˜ν•œ, HTTP ν—€λ”λŠ” ν‘œμ€€ 헀더가 ꡉμž₯히 λ§ŽμŠ΅λ‹ˆλ‹€.

ν•„μš” μ‹œ μž„μ˜μ˜ 헀더λ₯Ό μΆ”κ°€ν•  μˆ˜λ„ μžˆκ΅¬μš”.

 

그럼 과거의 HTTP ν—€λ”λŠ” μ–΄λ• μ„κΉŒμš”?

λ°‘μ—μ„œ μ„€λͺ…ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

1-2. RFC2616 (과거의 HTTP 헀더와 HTTP BODY)

μš°μ„ , 과거의 HTTP 헀더λ₯Ό λΆ„λ₯˜ν•΄λ³΄λ„둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

RFC2616 HTTP 헀더

  • General 헀더: λ©”μ‹œμ§€ 전체에 μ μš©λ˜λŠ” 정보
    • ex) Connection: close
  • Request 헀더: μš”μ²­ 정보
    • ex) User-Agent: Mozilla/5.0 (Macintosh; ..)
  • Response 헀더: 응닡 정보
    • ex) Server: Apache
  • Entity 헀더: μ—”ν‹°ν‹° λ°”λ”” 정보
    • ex) Content-Type: text/html, Content-Length: 3423

 

과거의 HTTP BODYλŠ” μ–΄λ• μ„κΉŒμš”?

λ©”μ‹œμ§€ λ³Έλ¬Έ(message body)은 μ—”ν‹°ν‹° λ³Έλ¬Έ(entity body)을 μ „λ‹¬ν•˜λŠ”λ° μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ—”ν‹°ν‹° 본문은 μš”μ²­μ΄λ‚˜ μ‘λ‹΅μ—μ„œ 전달할 μ‹€μ œ 데이터가 λ“€μ–΄μžˆμŠ΅λ‹ˆλ‹€.

 

μ—”ν‹°ν‹° ν—€λ”λŠ” μ—”ν‹°ν‹° 본문의 데이터λ₯Ό 해석할 수 μžˆλŠ” 정보λ₯Ό μ œκ³΅ν–ˆμŠ΅λ‹ˆλ‹€.

μ–΄λ–€ 정보λ₯Ό μ œκ³΅ν–ˆλƒλ©΄...

데이터 μœ ν˜•(html, json), 데이터 길이, μ••μΆ• 정보 λ“±λ“±μ΄μš”!

 

그럼 이름이 μ™œ μ—”ν‹°ν‹° ν—€λ”μΌκΉŒμš”?

말 κ·ΈλŒ€λ‘œ 엔티티와 관련이 μžˆμ–΄μ„œ μ—”ν‹°ν‹° ν—€λ”μ—μš”~

 

그런데 HTTP ν‘œμ€€ μŠ€νŽ™μ΄ λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€!!

1999λ…„μ˜ RFC2616은 폐기가 되고, 2014년에 RFC7230~7235κ°€ λ“±μž₯ν–ˆμŠ΅λ‹ˆλ‹€.

 

 

1-3. RFC723x λ³€ν™” (ν˜„μž¬μ˜ HTTP 헀더와 HTTP BODY)

ν—€λ”μ—μ„œ μ•€ν‹°ν‹°λΌλŠ” 말은 사라지고 ν‘œν˜„(Representation)μ΄λΌλŠ” 말둜 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ ν‘œν˜„μ€ ν‘œν˜„ 메타데이터(Representation Metadata)와 ν‘œν˜„ 데이터(Representation Data)κ°€ 합쳐진 κ²ƒμž…λ‹ˆλ‹€.

 

μ΅œμ‹  λ²„μ „μ˜ HTTP BODYλ₯Ό ν•œ 번 λ΄λ³ΌκΉŒμš”?

νŽ˜μ΄λ‘œλ“œ(λ©”μ‹œμ§€ λ³Έλ¬Έ)을 톡해 ν‘œν˜„ 데이터λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.

ν‘œν˜„μ€ μš”μ²­μ΄λ‚˜ μ‘λ‹΅μ—μ„œ 전달할 μ‹€μ œ λ°μ΄ν„°μ΄κ΅¬μš”.

ν‘œν˜„ ν—€λ”λŠ” ν‘œν˜„ 데이터λ₯Ό 해석할 수 μžˆλŠ” 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μ—”ν‹°ν‹° ν—€λ”μ²˜λŸΌμš”!

μ–΄λ–€ 정보λ₯Ό μ œκ³΅ν–ˆλƒλ©΄...

데이터 μœ ν˜•(html, json), 데이터 길이, μ••μΆ• 정보 λ“±λ“±μ΄μš”!

 

그럼 ν‘œν˜„μ— κ΄€ν•΄μ„œ μžμ„Ένžˆ μ‚΄νŽ΄λ³ΌκΉŒμš”?


2. ν‘œν˜„

  • Content-Type: ν‘œν˜„ λ°μ΄ν„°μ˜ ν˜•μ‹ (html둜 κ°€λŠ”μ§€ json으둜 κ°€λŠ”μ§€... μ•Œμ•„μ•Ό ν•΄μ„œ)
  • Content-Encoding: ν‘œν˜„ λ°μ΄ν„°μ˜ μ••μΆ• 방식
  • Content-Language: ν‘œν˜„ λ°μ΄ν„°μ˜ μžμ—° μ–Έμ–΄ (ν•œκ΅­μ–΄μΈμ§€ μ˜μ–΄μΈμ§€...)
  • Content-Length: ν‘œν˜„ λ°μ΄ν„°μ˜ 길이

ν‘œν˜„ ν—€λ”λŠ” 전솑과 응닡 λ‘˜ λ‹€ μ‚¬μš©ν•©λ‹ˆλ‹€!

 

 

2-1. Content-Type

ν‘œν˜„ λ°μ΄ν„°μ˜ ν˜•μ‹ μ„€λͺ…
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3423

<html>
     <body>...</body>
</html>

 

HTTP/1.1 200 OK
Content-Type: application/json  (기본으둜 UTF-8)
Content-Length: 16

{"data":"hello"}

λ―Έλ””μ–΄ νƒ€μž…κ³Ό 문자 인코딩 λ“± λ“€μ–΄μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄...

  • text/html  charset=utf-8
    • html이면...
  • application/json
    • json이면...
  • image/png

 

 

2-2. Content-Encoding

ν‘œν˜„ 데이터 인코딩
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Encoding: gzip

Content-Length: 521

wejflkewfjlwjflkwdjflkwjflksdjflknc,mvns,mnc23ur0892uroiwjflksndco2u8fujweklnclkwho3rujwlkewkmcl

ν‘œν˜„ 데이터λ₯Ό μ••μΆ•ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€.

데이터λ₯Ό μ „λ‹¬ν•˜λŠ” κ³³μ—μ„œ μ••μΆ• ν›„ 인코딩 헀더λ₯Ό μΆ”κ°€ν•˜κ³  (λ©”μ‹œμ§€ λ°”λ”” μžˆλŠ” λΆ€λΆ„), 

데이터λ₯Ό μ½λŠ” μͺ½μ—μ„œ 인코딩 ν—€λ”μ˜ μ •λ³΄λ‘œ 압좕을 ν•΄μ œν•©λ‹ˆλ‹€.

 

예λ₯Ό λ“€λ©΄ gzip, deflate, identity(μ••μΆ• μ•ˆν•˜κ³  λ˜‘κ°™μ΄)κ°€ μžˆμŠ΅λ‹ˆλ‹€.

 

 

2-3. Content-Language

ν‘œν˜„ λ°μ΄ν„°μ˜ μžμ—° μ–Έμ–΄
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Language: ko
Content-Length: 521

<html>
μ•ˆλ…•ν•˜μ„Έμš”.
</html>

 

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Language: en
Content-Length: 521

<html>
hello
</html>

ν‘œν˜„ λ°μ΄ν„°μ˜ μžμ—° μ–Έμ–΄λ₯Ό ν‘œν˜„ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€λ©΄ ko, en, en-US λ“± μžˆμŠ΅λ‹ˆλ‹€.

 

 

2-4. Content-Length

ν‘œν˜„ λ°μ΄ν„°μ˜ 길이
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 5

hello

λ°”μ΄νŠΈ(byte) λ‹¨μœ„μž…λ‹ˆλ‹€.

μ€‘μš”ν•œ 점이 μžˆλŠ”λ° Transfer-Encoding(전솑 μ½”λ”©)을 μ‚¬μš©ν•˜λ©΄ Content-Lengthλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆ λ©λ‹ˆλ‹€.

μ΄μœ λŠ” μ € λ°‘μ—μ„œ μ„€λͺ…ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.


3. ν˜‘μƒ (Contents Negotiation)

3-1. ν˜‘μƒμ΄λž€...

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„ ν˜Έν•˜λŠ” ν‘œν˜„ μš”μ²­

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„ν•œν…Œ μ›ν•˜λŠ” ν‘œν˜„μ„ 해달라고 μš”μ²­ν•©λ‹ˆλ‹€.

그럼 μ„œλ²„κ°€ μ΅œλŒ€ν•œ λ§žμΆ°μ€λ‹ˆλ‹€. (μ„œλ²„κ°€ λͺ» λ§žμΆ°μ€„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.)

이 과정을 ν˜‘μƒ(Contents Negotiation)이라고 ν•©λ‹ˆλ‹€.

 

  • Accept: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„ ν˜Έν•˜λŠ” λ―Έλ””μ–΄ νƒ€μž… 전달
  • Accept-Charset: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„ ν˜Έν•˜λŠ” 문자 인코딩
  • Accept-Encoding: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„ ν˜Έν•˜λŠ” μ••μΆ• 인코딩
  • Accept-Language: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„ ν˜Έν•˜λŠ” μžμ—° μ–Έμ–΄

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

ν˜‘μƒμ„ μ‹œμž‘ν•˜μ§€

 

 

<Accept-Language 적용 μ „ (μ˜ˆμ‹œ)>

예λ₯Ό λ“€μ–΄, λ‚˜λŠ” ν•œκ΅­μ–΄ λΈŒλΌμš°μ €λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

μ–΄λ–€ μ™Έκ΅­μ–΄ 이벀트 νŽ˜μ΄μ§€λ₯Ό 보고 듀어가보고 μ‹Άλ‹€κ³  μƒκ°ν•΄μ„œ λ“€μ–΄κ°‘λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€λŠ” 닀쀑 μ–Έμ–΄λ₯Ό μ§€μ›ν•˜λŠ” μ„œλ²„λ„€μš”? 1μˆœμœ„λŠ” μ˜μ–΄μ΄κ³ , ν•œκ΅­μ–΄λ„ μ§€μ›ν•œλ‹€κ³  ν•©λ‹ˆλ‹€.

 

근데, ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•œκ΅­μ–΄λ₯Ό μ›ν•˜λŠ”μ§€ μ˜μ–΄λ₯Ό μ›ν•˜λŠ”μ§€ μ„œλ²„ν•œν… 정보가 μ—†μŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ, μ„œλ²„λŠ” 기본값인 μ˜μ–΄λ‘œ ν΄λΌμ΄μ–ΈνŠΈν•œν…Œ 응닡을 ν•©λ‹ˆλ‹€.

 

그럼 ν΄λΌμ΄μ–ΈνŠΈλŠ” μ˜μ–΄κ°€ λ‚˜μ˜€λ‹ˆκΉŒ λ‹Ήν™©ν•˜κ³  쉽지 μ•Šμ•„ν•©λ‹ˆλ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ν˜‘μƒ (Contents Negotiation)을 ν•©λ‹ˆλ‹€.

 

 

<Accept-Language 적용 ν›„ (μ˜ˆμ‹œ)>

λ‚΄κ°€ μ–΄λ–€ μ™Έκ΅­μ–΄ 이벀트 νŽ˜μ΄μ§€λ₯Ό λ“€μ–΄κ°„ 것과 κ·Έ νŽ˜μ΄μ§€κ°€ 닀쀑 μ–Έμ–΄(κΈ°λ³Έ μ˜μ–΄, ν•œκ΅­μ–΄λ„ 지원)λ₯Ό μ§€μ›ν•˜λŠ” κ²ƒκΉŒμ§€λŠ” λ˜‘κ°™μŠ΅λ‹ˆλ‹€.

μ΄λ²ˆμ—” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„ν•œν…Œ 보낼 λ•Œ 본인이 μ„ ν˜Έν•˜λŠ” μ–Έμ–΄λŠ” ν•œκ΅­μ–΄λΌκ³  λ³΄λƒ…λ‹ˆλ‹€.

μ„œλ²„λŠ” μ›λž˜ κΈ°λ³Έ μ–Έμ–΄κ°€ μ˜μ–΄μ΄μ§€λ§Œ, ν•œκ΅­μ–΄λ„ μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— Content-Languageλ₯Ό ν•œκ΅­μ–΄λ‘œ ν•˜κ³ , ν•œκ΅­μ–΄ λ©”μ‹œμ§€λ‘œ 응닡을 ν•©λ‹ˆλ‹€.

 

μ΄λ ‡κ²Œ κΉ”λ”ν•˜κ²Œ 해결이 λ˜λŠ” κ²½μš°κ°€ μžˆμ§€λ§Œ,

사싀 ν˜„μ‹€μ€ 녹둝 μ•Šμ£ ~

λ°‘μ—λŠ” κΉ”λ”ν•˜κ²Œ 떨어지지 μ•Šμ€ λ³΅μž‘ν•œ μ˜ˆμ‹œμž…λ‹ˆλ‹€.

 

 

<Accept-Language λ³΅μž‘ν•œ μ˜ˆμ‹œ>

 

과정은 λ‹€ λ˜‘κ°™κ³  μ•„κΉŒμ²˜λŸΌ ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•œκ΅­μ–΄λ₯Ό μ„ ν˜Έν•œλ‹€κ³  μ„œλ²„ν•œν…Œ μ „μ†‘ν•©λ‹ˆλ‹€.

근데 이 μ„œλ²„λŠ” 닀쀑 μ–Έμ–΄ 지원 μ„œλ²„μ΄μ§€λ§Œ, κΈ°λ³Έ μ–Έμ–΄λŠ” 독일어이고 μ˜μ–΄λ₯Ό μ§€μ›ν•œλ‹€κ³  ν•˜λ„€μš”?

 

κ·Έλ ‡κ²Œ 되면 μ„œλ²„λŠ” ν•œκ΅­μ–΄λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν΄λΌμ΄μ–ΈνŠΈν•œν…Œ λ…μΌμ–΄λ‘œ λ³΄λƒ…λ‹ˆλ‹€.

근데 μ†”μ§νžˆ λ…μΌμ–΄λ‘œ 였면 λˆ„κ΅¬λ“  λ‹Ήν™©ν•˜μ§€ μ•Šμ„κΉŒμš”? κ·Έλ‚˜λ§ˆ μ˜μ–΄κ°€ λ‚˜μ€λ° μ™œ 독일어냐거!!

λ‚œ 독일어 λͺ½λΌ~

 

κ·Έλž˜μ„œ μš°μ„ μˆœμœ„λ₯Ό λ‘‘λ‹ˆλ‹€.

μš°μ„ μˆœμœ„μ— κ΄€ν•΄μ„œλŠ” λ°‘μ—μ„œ μ„€λͺ…ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

3-2. ν˜‘μƒκ³Ό μš°μ„ μˆœμœ„1 - μš°μ„ μˆœμœ„μ— κ΄€ν•˜μ—¬

Quality Values(q) κ°’ μ‚¬μš©

0μ—μ„œ 1κΉŒμ§€ 있으며, μˆ«μžκ°€ 클 수둝 높은 μš°μ„ μˆœμœ„λ₯Ό λœ»ν•©λ‹ˆλ‹€.

μƒλž΅ν•˜λ©΄ μš°μ„ μˆœμœ„λŠ” 1 μž…λ‹ˆλ‹€.

GET /event
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

예λ₯Ό λ“€μ–΄μ„œ Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7κ°€ μžˆμŠ΅λ‹ˆλ‹€.

여기에선 μš°μ„ μˆœμœ„κ°€ μ–΄λ–»κ²Œ λ κΉŒμš”?

 

1μˆœμœ„λŠ” qλ₯Ό μƒλž΅ν•œ ko-KR이 λ˜κ΅¬μš”.

2μˆœμœ„λŠ” κ·Έ λ‹€μŒ μˆ«μžκ°€ 높은 ko;q=0.9 μž…λ‹ˆλ‹€.

3μˆœμœ„λŠ” en-US;q=0.8이고, λ§ˆμ§€λ§‰μœΌλ‘œ 4μˆœμœ„λŠ” en;q=0.7 μž…λ‹ˆλ‹€.

 

λ°‘μ—μ„œ μ˜ˆμ‹œλ₯Ό μžμ„Ένžˆ 봐보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

<Accept-Language λ³΅μž‘ν•œ μ˜ˆμ‹œ>

μ•„κΉŒμ™€ 같은 μƒν™©μ—μ„œ μ΄λ²ˆμ—” ν΄λΌμ΄μ–ΈνŠΈκ°€ μš°μ„ μˆœμœ„λ₯Ό λ§€κ²¨μ„œ μ„œλ²„ν•œν…Œ μš”μ²­ν–ˆμŠ΅λ‹ˆλ‹€.

그러면 μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 보낸 μš°μ„ μˆœμœ„λ₯Ό ν™•μΈν•˜κ³  본인이 μ§€μ›ν•˜λŠ” μ–Έμ–΄ μ€‘μ—μ„œ 제일 μš°μ„ μˆœμœ„κ°€ 높은 μ–Έμ–΄λ‘œ 응닡을 ν•©λ‹ˆλ‹€.

(μ„œλ²„: μ•„~ 독일어보닀 μ˜μ–΄λ₯Ό 더 μ„ ν˜Έν•˜λŠ”κ΅¬λ‚˜!)

 

 

3-3. ν˜‘μƒκ³Ό μš°μ„ μˆœμœ„2 - ꡬ체적인 것이 μš°μ„ 

ꡬ체적일수둝 μš°μ„ μˆœμœ„κ°€ λ†’μŠ΅λ‹ˆλ‹€.

즉, 많이 λ””ν…ŒμΌν• μˆ˜λ‘ μš°μ„ μˆœμœ„κ°€ λ†’μŠ΅λ‹ˆλ‹€.

GET /event
 Accept: text/*, text/plain, text/plain;format=flowed, */*

예λ₯Ό λ“€μ–΄μ„œ Accept: text/*, text/plain, text/plain;format=flowed, */*κ°€ μžˆμŠ΅λ‹ˆλ‹€.

1μˆœμœ„λŠ” 제일 λ””ν…ŒμΌν•œ  text/plain;format=flowed이고, 

2μˆœμœ„λŠ” κ·Έ λ‹€μŒμœΌλ‘œ λ””ν…ŒμΌν•œ text/plain μž…λ‹ˆλ‹€.

3μˆœμœ„λŠ” text/*이고, 4μˆœμœ„λŠ” 제일 κ°„λ‹¨ν•œ  */* μž…λ‹ˆλ‹€.

 

 

3-4. ν˜‘μƒκ³Ό μš°μ„ μˆœμœ„3 - λ―Έλ””μ–΄ νƒ€μž… λ§žμΆ”κΈ°

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

 

Accept: text/*;q=0.3, text/plain;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5

μš°μ„ μˆœμœ„ κ°’->본인이 맞좀

 


4. 전솑 방식

전솑 방식은 총 4가지가 μžˆμŠ΅λ‹ˆλ‹€.

  • λ‹¨μˆœ 전솑
  • μ••μΆ• 전솑
  • λΆ„ν•  전솑 (μͺΌκ°œμ„œ 전솑)
  • λ²”μœ„ 전솑 (μ›ν•˜λŠ” λ²”μœ„λ₯Ό μ§€μ •ν•΄μ„œ 전솑)

 

4-1. λ‹¨μˆœ 전솑

Content-Length

Content 길이λ₯Ό μ•Œ 수 μžˆμ„ λ•Œ μ”λ‹ˆλ‹€.

κ·Έλƒ₯ ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•œ λ²ˆμ— μš”μ²­ν•˜λ©΄ μ„œλ²„κ°€ λ‹¨μˆœν•˜κ²Œ μ‘λ‹΅ν•˜λŠ” ν˜•μ‹μž…λ‹ˆλ‹€.

 

 

4-2. μ••μΆ• 전솑

Content-Encoding

ν΄λΌμ΄μ–ΈνŠΈκ°€ λ­”κ°€λ₯Ό μš”μ²­ν•˜λ©΄ μ„œλ²„μ—μ„œ μš©λŸ‰μ„ μ••μΆ•ν•΄μ„œ ν΄λΌμ΄μ–ΈνŠΈν•œν…Œ μ „μ†‘ν•©λ‹ˆλ‹€.

무쑰건 Content-Encoding을 λ„£μ–΄μ•Ό ν•©λ‹ˆλ‹€.

 

 

4-3. λΆ„ν•  전솑

Transfer-Encoding

ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ­”κ°€λ₯Ό 보내면 μ„œλ²„μ—μ„œ λΆ„ν• ν•΄μ„œ μ „μ†‘ν•©λ‹ˆλ‹€.

즉, μ„œλ²„μ—μ„œ 5 byteλ₯Ό λ¨Όμ € 보내면 ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ κ·Έ 5 byteλ₯Ό λ¨Όμ € 보고, λ‹€μŒκ±° 5 byteλ₯Ό 보내면 ν΄λΌμ΄μ–ΈνŠΈκ°€ κ·Έ λ‹€μŒκ±° 5 byteλ₯Ό 보고 그런 ν˜•μ‹μž…λ‹ˆλ‹€.

주둜 μš©λŸ‰μ΄ 클 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

μ•„κΉŒ μœ„μ—μ„œλ„ μ–˜κΈ°ν–ˆλŠ”λ° λΆ„ν•  전솑(Transfer-Encoding)μ—λŠ” Content-Lengthλ₯Ό λ„£μœΌλ©΄ μ•ˆ λ©λ‹ˆλ‹€.

μ™œλƒν•˜λ©΄, Content-Lengthκ°€ μ²˜μŒμ—λŠ” μ˜ˆμƒμ΄ μ•ˆ 되기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

λ˜ν•œ, chunkedλ§ˆλ‹€ 길이가 λ‹€ μ“°μ—¬μ Έ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

 

4-4. λ²”μœ„ 전솑

Range, Content-Range

ν΄λΌμ΄μ–ΈνŠΈκ°€ λ²”μœ„λ₯Ό μ •ν•΄μ„œ μ„œλ²„ν•œν…Œ 보내면 μ„œλ²„κ°€ λ²”μœ„μ— 맞게 μ°Ύμ•„μ„œ μ „μ†‘ν•©λ‹ˆλ‹€.

 


5. 일반 정보

일반 μ •λ³΄λŠ” 5κ°€μ§€λ‘œ λΆ„λ₯˜ν–ˆμŠ΅λ‹ˆλ‹€.

  • From: μœ μ € μ—μ΄μ „νŠΈμ˜ 이메일 정보
  • Referer: 이전 μ›Ή νŽ˜μ΄μ§€ μ£Όμ†Œ
  • User-Agent: μœ μ € μ—μ΄μ „νŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 정보
  • Server: μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” Origin μ„œλ²„μ˜ μ†Œν”„νŠΈμ›¨μ–΄ 정보
  • Date: λ©”μ‹œμ§€κ°€ μƒμ„±λœ λ‚ μ§œ

 

5-1. From

μœ μ € μ—μ΄μ „νŠΈμ˜ 이메일 정보

From은 일반적으둜 잘 μ‚¬μš©λ˜μ§€λŠ” μ•Šκ³ , μ‚¬μš©ν•œλ‹€λ©΄ 주둜 검색 엔진 같은 κ³³μ—μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.

μš”μ²­μ—μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

 

5-2. Referer

이전 μ›Ή νŽ˜μ΄μ§€ μ£Όμ†Œ

ν˜„μž¬ μš”μ²­λœ νŽ˜μ΄μ§€μ˜ 이전 μ›Ή νŽ˜μ΄μ§€ μ£Όμ†Œλ‘œ, ν˜„μž¬ 많이 μ‚¬μš©λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

A->B둜 μ΄λ™ν•˜λŠ” 경우, Bλ₯Ό μš”μ²­ν•  λ•Œ Referer: Aλ₯Ό ν¬ν•¨ν•΄μ„œ μš”μ²­μ„ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ˜ν•œ, Refererλ₯Ό μ‚¬μš©ν•΄μ„œ μœ μž… 경둜 뢄석이 κ°€λŠ₯ν•˜λ©°, 데이터 뢄석할 λ•Œ 특히 많이 μ‚¬μš©ν•©λ‹ˆλ‹€.

From처럼 μš”μ²­μ—μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.

  • μ°Έκ³ !! μ›λž˜ μ˜μ–΄ λ‹¨μ–΄λ‘œ 따지면 referrer이 λ§žμŠ΅λ‹ˆλ‹€. 근데 μ˜›λ‚ μ— μ˜€νƒ€λ‘œ μ“°λ©΄μ„œ μ΄λ ‡κ²Œ 계속 μ“°λ‹€λ³΄λ‹ˆ λ°”κΎΈλŠ”κ²Œ 더 νž˜λ“€μ–΄μ Έμ„œ μ΄λ ‡κ²Œ referer μ˜€νƒ€λ‘œ μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. (참고만 ν•˜κ³  μ•Œ ν•„μš”λŠ” X)
<μ˜ˆμ‹œ>

1. κ΅¬κΈ€μ—μ„œ hello 검색

2. κ·Έλƒ₯ 아무 νŽ˜μ΄μ§€ 듀어감 (예λ₯Ό λ“€μ–΄ 지식백과에 듀어감)
3. λ“€μ–΄κ°€μ„œ 였λ₯Έμͺ½ ν΄λ¦­ν•΄μ„œ 쫘라락 μžμ„Ένžˆ λ‚˜μ™€μžˆλŠ” 것 보닀 보면 referer이 ꡬ글인 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.
=> 이전 νŽ˜μ΄μ§€κ°€ κ΅¬κΈ€μ΄μ—ˆλ‹€λŠ” 것을 λœ»ν•©λ‹ˆλ‹€.

 

 

5-3. User-Agent

μœ μ € μ—μ΄μ „νŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 정보

ν΄λΌμ΄μ–ΈνŠΈμ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 정보 κ²Έ μ›Ή λΈŒλΌμš°μ € μ •λ³΄μž…λ‹ˆλ‹€.

μ‚¬μš©μžλ“€μ΄ μ–΄λ–€ λΈŒλΌμš°μ €μ— 많이 λ“€μ–΄μ˜€λŠ”κ±΄μ§€ νŒŒμ•… κ°€λŠ₯ν•œ 톡계 μ •λ³΄λ‘œ 쓰이기도 ν•©λ‹ˆλ‹€.

λ˜ν•œ, 둜그λ₯Ό 피싱해보면 μ–΄λ–€ μ’…λ₯˜μ˜ λΈŒλΌμš°μ €μ—μ„œ μž₯μ• κ°€ λ°œμƒν•˜λŠ”μ§€ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Fromκ³Ό Referer처럼 μš”μ²­μ—μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

<μ˜ˆμ‹œ>
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

 

 

5-4. Server

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

ORIGIN μ„œλ²„λž€...

μ›λž˜ http μš”μ²­μ„ 보내면 쀑간에 μ—¬λŸ¬ ν”„λ‘μ‹œ μ„œλ²„λ“€μ„ 거치게 λ©λ‹ˆλ‹€.

κ·Έλž˜μ„œ μ‹€μ œ λ‚˜μ˜ μš”μ²­μ΄ λ„μ°©ν•΄μ„œ http 응닡을 ν•΄μ£ΌλŠ” μ§„μ§œ μ„œλ²„μ΄μž λ§ˆμ§€λ§‰ μ„œλ²„μž…λ‹ˆλ‹€.

μ•„κΉŒμ™€ 달리 μ‘λ‹΅μ—μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

<μ˜ˆμ‹œ>

  • Server: Apache/2.2.22 (Debian)
  • server: nginx

 

 

5-5. Date

λ©”μ‹œμ§€κ°€ λ°œμƒν•œ λ‚ μ§œμ™€ μ‹œκ°„
  • <μ˜ˆμ‹œ> Date: Mon, 21 May 2001 04:01:10 GMT
  • μ‘λ‹΅μ—μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€. (κ³Όκ±°μ—” μš”μ²­μ—λ„ μ‚¬μš©)


6. νŠΉλ³„ν•œ 정보

νŠΉλ³„ν•œ 정보도 4κ°€μ§€λ‘œ λΆ„λ₯˜ν•΄λ΄€μŠ΅λ‹ˆλ‹€.

  • Host: μš”μ²­ν•œ 호슀트 정보(도메인)
  • Location: νŽ˜μ΄μ§€ λ¦¬λ‹€μ΄λ ‰μ…˜
  • Allow: ν—ˆμš© κ°€λŠ₯ν•œ HTTP λ©”μ„œλ“œ
  • Retry-After: μœ μ € μ—μ΄μ „νŠΈκ°€ λ‹€μŒ μš”μ²­μ„ ν•˜κΈ°κΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜λŠ” μ‹œκ°„

6-1. Host

μš”μ²­ν•œ 호슀트 정보(도메인)
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com

μš”μ²­μ—μ„œ μ‚¬μš©ν•˜λ©°, ν•„μˆ˜κ°’μž…λ‹ˆλ‹€. μ§„μ§œ μ€‘μš”!!

ν•˜λ‚˜μ˜ μ„œλ²„κ°€ μ—¬λŸ¬ 도메인을 μ²˜λ¦¬ν•΄μ•Ό ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

즉, ν•˜λ‚˜μ˜ IP μ£Όμ†Œμ— μ—¬λŸ¬ 도메인이 μ μš©λ˜μ–΄ μžˆμ„ λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

이게 무슨 말인지에 κ΄€ν•΄μ„œλŠ” 밑에 그림을 톡해 μ„€λͺ…ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

이 μ„œλ²„ μ•ˆμ— μ—¬λŸ¬ 개의 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€μ œ λ‹€λ₯Έ λ„λ©”μΈμœΌλ‘œ ꡬ동될 수 μžˆμŠ΅λ‹ˆλ‹€.

 

그런데 λ§Œμ•½μ— Hostκ°€ μ—†μœΌλ©΄ 무슨 λ¬Έμ œκ°€ μƒκΈΈκΉŒμš”?

λ¨Όμ € ν΄λΌμ΄μ–ΈνŠΈκ°€ /hello라고 μš”μ²­μ„ λ³΄λƒ…λ‹ˆλ‹€.

μ„œλ²„ μž…μž₯μ—μ„œλŠ” /helloκ°€ aaa.comκ³Ό κ΄€λ ¨λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 듀어가야할지 bbb.com에 κ΄€λ ¨λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 듀어가야할지 ccc.com에 κ΄€λ ¨λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 듀어가야할지 λͺ¨λ¦…λ‹ˆλ‹€ (ꡬ뢄 방법X).

μ™œλƒν•˜λ©΄ IP둜만 ν†΅μ‹ ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

μ΄ˆμ°½κΈ°μ—” 이런 λ¬Έμ œκ°€ λ§Žμ•„μ„œ λ‚˜μ€‘μ—λŠ” HostλŠ” 무쑰건 넣어야돼!! κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μœ„μ˜ 그림을 λ΄λ³ΌκΉŒμš”?

μ΄λ²ˆμ—” Hostλ₯Ό λ„£μ—ˆμŠ΅λ‹ˆλ‹€.

ν΄λΌμ΄μ–ΈνŠΈκ°€ Host 헀더 ν•„λ“œλ₯Ό λ„£μ–΄μ„œ μ„œλ²„ν•œν…Œ μ „λ‹¬ν•˜λ©΄ μ„œλ²„κ°€ "μ•„! 이건 aaa.com으둜 λ“€μ–΄κ°€λŠ”κ΅¬λ‚˜!"ν•˜κ³  μ•Œμ•„μ±•λ‹ˆλ‹€.

μ€‘μš”!

 

6-2. Location

νŽ˜μ΄μ§€ λ¦¬λ‹€μ΄λ ‰μ…˜

μ›Ή λΈŒλΌμš°μ €λŠ” 3xx μ‘λ‹΅μ˜ 결과에 Location 헀더가 있으면, Location μœ„μΉ˜λ‘œ μžλ™ μ΄λ™ν•©λ‹ˆλ‹€.

이걸 λ¦¬λ‹€μ΄λ ‰νŠΈλΌκ³  ν•˜κ³ , μ „ μ„Ήμ…˜ μ‘λ‹΅μ½”λ“œ 3xx λΆ€λΆ„μ—μ„œ μ„€λͺ…ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

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

μ–΄λ””λ‘œλ“  λ¬Έ!

 

6-3. Allow

ν—ˆμš© κ°€λŠ₯ν•œ HTTP λ©”μ„œλ“œ
  • 405 (Method Not Allowed)μ—μ„œ 응닡에 포함해야 ν•©λ‹ˆλ‹€.

λ§Œμ•½μ— URL κ²½λ‘œλŠ” μžˆλŠ”λ° POSTλ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ©΄ 405λ₯Ό 톡해 μ•Œλ €μ€˜μ•Όν•©λ‹ˆλ‹€.

"μš°λ¦¬λŠ” GET, HEAD, PUT만 ν—ˆμš© κ°€λŠ₯ν•΄!"

 

그런데 이건 μ‹€μ œλ‘œ μ„œλ²„μ—μ„œ 많이 κ΅¬ν˜„ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

 

 

6-4. Retry-After

μœ μ € μ—μ΄μ „νŠΈκ°€ λ‹€μŒ μš”μ²­μ„ ν•˜κΈ°κΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜λŠ” μ‹œκ°„
  • 503 (Service Unavailable): μ„œλΉ„μŠ€κ°€ μ–Έμ œκΉŒμ§€ 뢈λŠ₯인지 μ•Œλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • Retry-After: Fri, 31 Dec 1999 23:59:59 GMT (λ‚ μ§œ ν‘œκΈ°)
  • Retry-After: 120 (μ΄ˆλ‹¨μœ„ ν‘œκΈ°)

μ‚¬μš©ν•˜κΈ°μ— 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€.

 


7. 인증 (Authorization)

  • Authorization 헀더: ν΄λΌμ΄μ–ΈνŠΈ 인증 정보λ₯Ό μ„œλ²„μ— μ „λ‹¬ν•©λ‹ˆλ‹€.
    • Authorization: Basic xxxxxxxxxxxxxxxxxxxx (인증과 κ΄€λ ¨λœ κ°’)
  • WWW-Authenticate: λ¦¬μ†ŒμŠ€ μ ‘κ·Ό μ‹œ ν•„μš”ν•œ 인증 방법을 μ •μ˜ν•©λ‹ˆλ‹€.
    • 401 Unauthorized 응닡과 ν•¨κ»˜ μ‚¬μš©ν•©λ‹ˆλ‹€. (401 였λ₯˜ λ‚˜λ©΄ 이거 λ„£μ–΄μ€˜μ•Ό 함)
    • WWW-Authenticate: Newauth realm="apps", type=1, title="Login to \"apps\"", Basic realm="simple"

 


8. μΏ ν‚€πŸͺ

μΏ ν‚€λŠ” μ΄λ ‡κ²Œ 2개의 헀더λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • Set-Cookie: μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μΏ ν‚€ 전달(응닡)ν•©λ‹ˆλ‹€.
  • Cookie: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—μ„œ 받은 μΏ ν‚€λ₯Ό μ €μž₯ν•˜κ³ , HTTP μš”μ²­ μ‹œ μ„œλ²„λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.

8-1. μΏ ν‚€ λ―Έμ‚¬μš© ν›„ 둜그인 κ³Όμ •πŸͺ

1. 처음 welcome νŽ˜μ΄μ§€μ— μ ‘κ·Ό (둜그인X)

둜그인 X

μ‚¬μš©μžκ°€ /welcome νŽ˜μ΄μ§€μ— μ ‘κ·Όν•©λ‹ˆλ‹€.

그러면 μ„œλ²„μ—μ„œ "μ•ˆλ…•ν•˜μ„Έμš”. μ†λ‹˜"이라고 응닡을 ν•©λ‹ˆλ‹€.

 

2. 둜그인

둜그인 O

μ‚¬μš©μžκ°€ POST둜 μœ μ € 정보λ₯Ό λ³΄λ‚΄μ„œ λ‘œκ·ΈμΈμ„ ν•©λ‹ˆλ‹€.

μ„œλ²„μ—μ„œ "μ­μ‘€λ‹˜μ΄ λ‘œκ·ΈμΈν–ˆμŠ΅λ‹ˆλ‹€."둜 응닡을 ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ 되면 둜그인이 된 html 화면이 λ‚˜μ˜΅λ‹ˆλ‹€.

 

3. 둜그인 이후 welcome νŽ˜μ΄μ§€μ— μ ‘κ·Ό

둜그인 이후

μ‚¬μš©μžλŠ” μ­μ‘€λΌλŠ” μ΄λ¦„μœΌλ‘œ λ‘œκ·ΈμΈμ„ ν•˜κ³  λ‹€μ‹œ /welcome νŽ˜μ΄μ§€μ— μ ‘κ·Όν•©λ‹ˆλ‹€.

그런데, μ„œλ²„μ—μ„œ λ‘œκ·ΈμΈν•œ μ‚¬μš©μžμΈμ§€ μ•„λ‹Œμ§€ ꡬ뢄을 λͺ»ν•˜λ„€μš”..?

멍청이..

"μ•ˆλ…•ν•˜μ„Έμš”. 쏭쑀"κ°€ μ•„λ‹Œ "μ•ˆλ…•ν•˜μ„Έμš”. μ†λ‹˜"으둜 응닡을 ν•©λ‹ˆλ‹€.

 

μœ„μ˜ μ˜ˆμ œμ— λŒ€ν•œ μ΄μœ κ°€ λ­˜κΉŒμš”?

그전에 λ°°μ› λ˜ λ¬΄μƒνƒœ ν”„λ‘œν† μ½œ Stateless κΈ°μ–΅λ‚˜μ‹œλ‚˜μš”?

λ¬΄μƒνƒœ ν”„λ‘œν† μ½œ νŠΉμ§•

httpλŠ” λ¬΄μƒνƒœ ν”„λ‘œν† μ½œ μž…λ‹ˆλ‹€.

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

이 이유 λ•Œλ¬Έμ— μ„œλ²„κ°€ μ­μ‘€λΌλŠ” 이름을 κΈ°μ–΅ν•˜μ§€ λͺ»ν•˜κ³  "μ•ˆλ…•ν•˜μ„Έμš”. μ†λ‹˜"이라고 응닡을 ν•œ κ²ƒμž…λ‹ˆλ‹€.

 

 

8-1(1). λŒ€μ•ˆπŸͺ

μœ„μ˜ μ˜ˆμ œμ— λŒ€ν•œ λŒ€μ•ˆμ΄ 있긴 ν•©λ‹ˆλ‹€.

λͺ¨λ“  μš”μ²­μ— μ‚¬μš©μž 정보λ₯Ό ν¬ν•¨ν•˜λŠ” κ²ƒμΈλ°μš”.

밑에 그림처럼 말이죠.

λŒ€μ•ˆ: λͺ¨λ“  μš”μ²­μ— μ‚¬μš©μž 정보 포함

그런데 이 λŒ€μ•ˆμ€ μ‹¬κ°ν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

 

λͺ¨λ“  μš”μ²­κ³Ό 링크에 μ‚¬μš©μž 정보λ₯Ό λ‹€ 포함..?

λŒ€μ•ˆ: λͺ¨λ“  μš”μ²­κ³Ό 링크에 μ‚¬μš©μž 정보 λ‹€ 포함?

μ΄λ ‡κ²Œ λͺ¨λ“  μš”μ²­κ³Ό 링크에 μ‚¬μš©μž 정보λ₯Ό λ‹€ 포함할 경우

λ³΄μ•ˆμ—λ„ λ¬Έμ œκ°€ 생기고 κ°œλ°œλ„ νž˜λ“€μ–΄μ§‘λ‹ˆλ‹€.

κ°œλ°œμžκ°€ λͺ¨λ“  μš”μ²­μ— μ‚¬μš©μž 정보λ₯Ό 일일이 λ‹€ λ„£μ–΄μ•Ό ν•˜λ‹ˆκΉŒμ£ ~ κ°œκ³ μƒμž…λ‹ˆλ‹€.

개발자: κ°œκ³ μƒ

 

λΈŒλΌμš°μ €λ₯Ό μ™„μ „νžˆ μ’…λ£Œν•˜κ³  λ‹€μ‹œ μ—΄λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”?

μš”μ¦˜μ€ μ›Ή μŠ€ν† λ¦¬μ§€κ°€ μžˆμ–΄μ„œ 거기에 μ €μž₯을 ν•˜λ©΄ 되긴 ν•˜μ§€λ§Œ...

κ°œλ°œμžκ°€ 이걸 μ–Έμ œ λ‹€ κ°œλ°œν•˜κ³  μ €μž₯ν•˜κ³  일일이 λ‹€ ν• κΉŒμš”..?

 

μ˜›λ‚ λΆ€ν„° 이런 λ¬Έμ œκ°€ μžˆμ–΄μ„œ 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μΏ ν‚€πŸͺλΌλŠ” κ°œλ…μ„ λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€.

μΏ ν‚€ λ“±μž₯!

 

8-2. μΏ ν‚€ μ‚¬μš© ν›„ 둜그인 κ³Όμ •πŸͺ

1. 둜그인

μΏ ν‚€ μ‚¬μš© ν›„ 둜그인

μ‚¬μš©μžκ°€ μ­μ‘€λΌλŠ” μ΄λ¦„μœΌλ‘œ POST λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ λ‘œκ·ΈμΈμ„ ν•©λ‹ˆλ‹€.

μ„œλ²„λŠ” μ­μ‘€λΌλŠ” μ‚¬μš©μžμ˜ 정보λ₯Ό 쿠킀에 λ„£μŠ΅λ‹ˆλ‹€. (μΏ ν‚€ 헀더λ₯Ό λ§Œλ“€μ–΄μ„œ μ‘λ‹΅ν•©λ‹ˆλ‹€.)

그러면 μ›Ή λΈŒλΌμš°μ € 내뢀에 μΏ ν‚€ μ €μž₯μ†Œκ°€ μžˆμ–΄μ„œ κ·Έ μ €μž₯μ†Œμ— μ­μ‘€λΌλŠ” μ‚¬μš©μžμ˜ 값을 μ €μž₯ν•©λ‹ˆλ‹€.

 

2. 둜그인 이후 welcome νŽ˜μ΄μ§€ μ ‘κ·Ό

둜그인 이후 welcome νŽ˜μ΄μ§€ μ ‘κ·Ό

μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈμ„ ν•˜κ³  /welcome νŽ˜μ΄μ§€μ— μ ‘κ·Όν•©λ‹ˆλ‹€.

μ›Ή λΈŒλΌμš°μ €λŠ” μ‚¬μš©μžκ°€ μ„œλ²„ν•œν…Œ μš”μ²­μ„ 보낼 λ•Œλ§ˆλ‹€ μžλ™μœΌλ‘œ μΏ ν‚€λ₯Ό λ’€μ Έμ„œ 쿠킀값을 무쑰건 κΊΌλ‚΄κ³  "Cookie: ~~" 헀더λ₯Ό λ§Œλ“€μ–΄μ„œ μ„œλ²„ν•œν…Œ λ³΄λƒ…λ‹ˆλ‹€.

그러면 μ„œλ²„λŠ” μΏ ν‚€λ₯Ό μ—΄μ–΄μ„œ μ‚¬μš©μžμ˜ 정보λ₯Ό νŒŒμ•…ν•  수 있게 λ©λ‹ˆλ‹€.

 

<λͺ¨λ“  μš”μ²­μ— μΏ ν‚€ 정보 μžλ™ 포함>

λͺ¨λ“  μš”μ²­μ— μΏ ν‚€ 정보 μžλ™ 포함

μ§€μ •ν•œ μ„œλ²„μ— λŒ€ν•΄μ„œλŠ” μ›Ή λΈŒλΌμš°μ €κ°€ μΏ ν‚€λ₯Ό μžλ™μœΌλ‘œ λ½‘μ•„λ‚΄μ„œ λ‹€ λ³΄λ‚΄μ€λ‹ˆλ‹€.

μΏ ν‚€ λ§€μ»€λ‹ˆμ¦˜μœΌλ‘œ λ‹€ 해결이 λœλ‹€λŠ” 것이죠.

그런데 μ΄λŸ°μ‹μœΌλ‘œ μ‚¬μš©μž 정보λ₯Ό λ‹€ 보내면 λ³΄μ•ˆμ— λ¬Έμ œκ°€ μƒκΉλ‹ˆλ‹€.

κ·Έλž˜μ„œ 이것을 μ œμ•½ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€.

 

 

8-3. μΏ ν‚€ μ œμ•½ν•˜λŠ” 방법πŸͺ

  • μΏ ν‚€λ₯Ό μ„œλ²„μ—μ„œ μ„ΈνŒ…ν•  λ•Œ
    • ex) set-cookie: sessionId=abcde1234; expires=Sat, 26-Dec-2020 00:00:00 GMT; path=/; domain=.google.com; Secure
  • μ‚¬μš©μ²˜
    • μ‚¬μš©μž 둜그인 μ„Έμ…˜ 관리 (μ‚¬μš©μž 정보λ₯Ό κ·ΈλŒ€λ‘œ μΏ ν‚€λ‘œ μ €μž₯ν•˜λŠ” 것은 μœ„ν—˜ -> μ„œλ²„μ—μ„œ μ„Έμ…˜ IDλ₯Ό λ§Œλ“€μ–΄ 관리)
    • κ΄‘κ³  정보 νŠΈλž˜ν‚Ή (이 μ›Ή λΈŒλΌμš°μ € μ“°λŠ” μ‚¬λžŒμ΄ 이런 κ΄‘κ³ λ₯Ό λ³΄λŠ”κ΅¬λ‚˜.. ν•˜κ³  νŠΈλž˜ν‚Ή ν•  λ•Œ μ‚¬μš©)
  • μΏ ν‚€ μ •λ³΄λŠ” 항상 μ„œλ²„μ— μ „μ†‘λ©λ‹ˆλ‹€.
    • 단점: λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½ μΆ”κ°€ 유발 (정보듀을 계속 μ „μ†‘ν•΄μ„œ)
    • κ·Έλž˜μ„œ.. μ΅œμ†Œν•œμ˜ μ •λ³΄λ§Œ μ‚¬μš©ν•©λ‹ˆλ‹€. (μ„Έμ…˜ id, 인증 토큰 정도)
    • λ˜ν•œ, μ„œλ²„μ— μ „μ†‘ν•˜μ§€ μ•Šκ³  μ›Ή λΈŒλΌμš°μ € 내뢀에 데이터λ₯Ό μ €μž₯ν•˜κ³  μ‹ΆμœΌλ©΄ μ›Ή μŠ€ν† λ¦¬μ§€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
      (μΏ ν‚€λŠ” μ„ΈνŒ…ν•˜λ©΄ λͺ‡ κ°œκ°€ λ˜λ“  계속 μžλ™μœΌλ‘œ 전솑이 되기 λ•Œλ¬Έμ— μ›Ή μŠ€ν† λ¦¬μ§€λ„ μ΄μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.)
      (μ•ˆ 그러면 λ„€νŠΈμ›Œν¬ λΆ€ν•˜κ°€ μ‹¬ν•΄μ§ˆ μˆ˜λ„..?γ„·γ„·)
  • μ£Όμ˜ν•  점⚠️
    • λ³΄μ•ˆμ— λ―Όκ°ν•œ λ°μ΄ν„°λŠ” μ €μž₯ν•˜λ©΄ μ•ˆ λ©λ‹ˆλ‹€. (주민번호, μ‹ μš©μΉ΄λ“œ 번호 λ“±)

 

 

8-4. μΏ ν‚€ - 생λͺ… μ£ΌκΈ°πŸͺ

Expires, max-age

μœ„μ— μ œμ•½ν•˜λŠ” λ°©λ²•μ—μ„œ 맨 첫 쀄에 μ˜ˆμ‹œλ‘œ 적은거 λ³΄μ΄μ‹œλ‚˜μš”?

κ±°κΈ°μ—μ„œ expires에 ν•΄λ‹Ήν•˜λŠ” 뢀뢄에 κ΄€ν•œ μ„€λͺ…μž…λ‹ˆλ‹€.

μΏ ν‚€λ₯Ό λ¬΄κΈ°ν•œμœΌλ‘œ 보관할 μˆ˜λŠ” μ—†κΈ° λ•Œλ¬Έμ— μžˆμŠ΅λ‹ˆλ‹€.

 

  • Set-Cookie: expires=Sat, 26 Dec-2020 04:39:21 GMT (λ‚ μ§œ λ‹¨μœ„)
    • 만료일이 되면 μΏ ν‚€ μ‚­μ œ
  • Set-Cookie: max-age=3600 (3600초, μ΄ˆλ‹¨μœ„)
    • 0μ΄λ‚˜ 음수λ₯Ό μ§€μ •ν•˜λ©΄ μΏ ν‚€ μ‚­μ œ
  • μ„Έμ…˜ μΏ ν‚€: 만료 λ‚ μ§œλ₯Ό μƒλž΅ν•˜λ©΄ λΈŒλΌμš°μ € μ’…λ£Œμ‹œ κΉŒμ§€λ§Œ μœ μ§€ν•©λ‹ˆλ‹€.
    • 전원을 껐닀가 ν‚€λ©΄ λ‘œκ·ΈμΈμ„ λ‹€μ‹œ ν•΄μ•Όν•˜λŠ” 것..?
  • μ˜μ† μΏ ν‚€: 만료 λ‚ μ§œλ₯Ό μž…λ ₯ν•˜λ©΄ ν•΄λ‹Ή λ‚ μ§œκΉŒμ§€ μœ μ§€ν•©λ‹ˆλ‹€.

 

 

8-5. μΏ ν‚€ - 도메인πŸͺ

Domain

μΏ ν‚€κ°€ 아무 μ‚¬μ΄νŠΈ λ“€μ–΄κ°ˆ λ•Œλ§ˆλ‹€ 생기면 큰일이 λ‚©λ‹ˆλ‹€. -> 도메인 지정 κ°€λŠ₯

  • ex) domain=example.org
  • λͺ…μ‹œ: λͺ…μ‹œν•œ λ¬Έμ„œ κΈ°μ€€ 도메인 + μ„œλΈŒ 도메인 포함 λ‹€ μ „μ†‘ν•©λ‹ˆλ‹€.
    • ex) domain=example.orgλ₯Ό μ§€μ •ν•΄μ„œ μΏ ν‚€ 생성
      • example.orgλŠ” λͺ°λ‘ μ΄κ³ , dev.example.org도 μΏ ν‚€ μ ‘κ·Ό
  • μƒλž΅: ν˜„μž¬ λ¬Έμ„œ κΈ°μ€€ λ„λ©”μΈλ§Œ μ μš©ν•©λ‹ˆλ‹€.
    • example.orgμ—μ„œ μΏ ν‚€λ₯Ό μƒμ„±ν•˜κ³  domain 지정을 μƒλž΅ν•©λ‹ˆλ‹€.
      • example.orgμ—μ„œλ§Œ μΏ ν‚€κ°€ μ ‘κ·Όν•˜κ³ , dev.example.orgλŠ” μΏ ν‚€κ°€ μ ‘κ·Όν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
      • 즉, ν•˜μœ„ λ„λ©”μΈμ—μ„œλŠ” μ ‘κ·Όν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

 

8-6. μΏ ν‚€ - 경둜πŸͺ

path

μš°μ„  도메인을 ν•„ν„°λ§ν•˜κ³ , κ·Έ λ‹€μŒμ— 경둜둜 ν•„ν„°λ§ν•©λ‹ˆλ‹€.

  • ex) path=/home
  • 이 경둜λ₯Ό ν¬ν•¨ν•œ ν•˜μœ„ 경둜 νŽ˜μ΄μ§€λ§Œ μΏ ν‚€κ°€ μ ‘κ·Όν•©λ‹ˆλ‹€.
  • 일반적으둜 path=/루트둜 μ§€μ •ν•©λ‹ˆλ‹€.
  • ex) path=/home 지정할 경우
    • /home -> κ°€λŠ₯
    • /home/level1 -> κ°€λŠ₯
    • /home/level1/level2 -> κ°€λŠ₯
    • /hello -> λΆˆκ°€λŠ₯ (레벨이 λ§žμ§€ μ•Šμ•„μ„œ μΏ ν‚€κ°€ μ „λ‹¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)

 

 

8-7. μΏ ν‚€ - λ³΄μ•ˆπŸͺ

Secure, HttpOnly, SameSite
  • Secure
    • μΏ ν‚€λŠ” http, httpsλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•Šκ³  μ „μ†‘ν•©λ‹ˆλ‹€.
    • Secureλ₯Ό μ μš©ν•˜λ©΄ https인 κ²½μš°μ—λ§Œ μ „μ†‘ν•©λ‹ˆλ‹€.
  • HttpOnly
    • XSS 곡격을 λ°©μ§€ν•©λ‹ˆλ‹€.
    • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ ‘κ·Ό λΆˆκ°€ν•©λ‹ˆλ‹€.(document.cookie) (μ›λž˜λŠ” μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.)
    • HTTP μ „μ†‘μ—λ§Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
  • SameSite
    • XSRF 곡격을 λ°©μ§€ν•©λ‹ˆλ‹€.
    • μš”μ²­ 도메인과 쿠킀에 μ„€μ •λœ 도메인이 같은 κ²½μš°μ—λ§Œ μΏ ν‚€λ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€. (κΈ°λŠ₯ 적용된 지 λͺ‡ λ…„ μ•ˆ 됨.)

 


μ„Ήμ…˜7이 끝이 났어여

생각보닀 지 많이 μΌλ„€μš©γ…‹γ…‹γ…‹γ…‹γ…‹

μ„Ήμ…˜8이 HTTP λ§ˆμ§€λ§‰μ΄λžλ‹ˆλ‹€~~

μ„Ήμ…˜8 λ‹€μŒμ—” Spring 기본이 μ°Ύμ•„μ˜¬ μ˜ˆμ •πŸ‘»

 

그럼 μ•ˆλ‡½~~