Study/WebHacking

HTTP/HTTPS

mnzy🌱 2022. 9. 19. 17:16

https://learn.dreamhack.io/199

컴퓨터와 톡신할 λ•ŒλŠ” 비ꡐ적 μ—„κ²©ν•œ ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 

 

λ§Žμ€ 컴퓨터 톡신 ν”„λ‘œν† μ½œμ€ 각 톡신 주체가 κ΅ν™˜ν•˜λŠ” 데이터(μ΄ν•˜ λ©”μ‹œμ§€)λ₯Ό λͺ…ν™•νžˆ 해석할 수 μžˆλ„λ‘ 문법(syntax)을 ν¬ν•¨ν•œλ‹€. 일반적으둜 이 문법에 μ–΄κΈ‹λ‚˜λŠ” λ©”μ‹œμ§€λŠ” 잘λͺ» μ „μ†‘λœ κ²ƒμœΌλ‘œ μ·¨κΈ‰ν•˜μ—¬ λ¬΄μ‹œλœλ‹€. 


ν˜„μž¬κΉŒμ§€ μ œμ •λœ ν‘œμ€€ 톡신 ν”„λ‘œν† μ½œμ—λŠ” λ„€νŠΈμ›Œν¬ ν†΅μ‹ μ˜ κΈ°μ΄ˆκ°€ λ˜λŠ” TCP/IP, μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‚¬μš©ν•˜λŠ” HTTP, νŒŒμΌμ„ 주고받을 λ•Œ μ‚¬μš©ν•˜λŠ” FTP λ“± 맀우 λ§Žμ€ μ’…λ₯˜κ°€ μžˆλ‹€. 

 

HTTP

HTTP(Hyper Text Transfer Protocol)λž€ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈμ˜ 데이터 κ΅ν™˜μ„ μš”μ²­(Request)κ³Ό 응닡(Response) ν˜•μ‹μœΌλ‘œ μ •μ˜ν•œ ν”„λ‘œν† μ½œμ΄λ‹€. 

HTTP의 κΈ°λ³Έ λ©”μ»€λ‹ˆμ¦˜μ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—κ²Œ μš”μ²­ν•˜λ©΄, μ„œλ²„κ°€ μ‘λ‹΅ν•˜λŠ” 것이닀. μ›Ή μ„œλ²„λŠ” HTTP μ„œλ²„λ₯Ό HTTP μ„œλΉ„μŠ€ ν¬νŠΈμ— λŒ€κΈ°μ‹œν‚¨λ‹€. 이 ν¬νŠΈλŠ” 일반적으둜 TCP/80 λ˜λŠ” TCP/8080이닀. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλΉ„μŠ€ ν¬νŠΈμ— HTTP μš”μ²­μ„ μ „μ†‘ν•˜λ©΄, 이λ₯Ό ν•΄μ„ν•˜μ—¬ μ μ ˆν•œ 응닡을 λ°˜ν™˜ν•œλ‹€.

 

HTTP λ©”μ‹œμ§€

HTTP λ©”μ‹œμ§€μ—λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ „μ†‘ν•˜λŠ” HTTP μš”μ²­, 그리고 μ„œλ²„κ°€ λ°˜ν™˜ν•˜λŠ” HTTP 응닡이 μžˆλ‹€.

κΈ°λŠ₯κ³Ό μ„ΈλΆ€ κ΅¬μ‘°μ—μ„œλŠ” 차이가 μžˆμ§€λ§Œ, 크게 보면 이듀은 κ³΅ν†΅μ μœΌλ‘œ HTTP ν—€λ“œμ™€ λ°”λ””λ‘œ κ΅¬μ„±λœλ‹€.

HTTP λ©”μ‹œμ§€μ˜ μ‹œμž‘ 쀄과 HTTP 헀더λ₯Ό λ¬Άμ–΄μ„œ 'μš”μ²­ ν—€λ“œ(head)' 라고 λΆ€λ₯΄λ©°,  HTTP λ©”μ‹œμ§€μ˜ νŽ˜μ΄λ‘œλ“œλŠ” 'λ³Έλ¬Έ(body)'이라고 ν•œλ‹€.

https://developer.mozilla.org/ko/docs/Web/HTTP/Messages

HTTP μš”μ²­

HTTP μš”청은 μ„œλ²„μ—κ²Œ νŠΉμ • λ™μž‘을 μš”κ΅¬ν•˜λŠ” λ©”μ‹œμ§€μ΄λ‹€.

 μ„œλ²„λŠ” ν•΄λ‹Ή λ™μž‘μ΄ μ‹€ν˜„ κ°€λŠ₯ν•œμ§€, ν΄λΌμ΄μ–ΈνŠΈκ°€ κ·ΈλŸ¬ν•œ λ™μž‘μ„ μš”μ²­ν•  κΆŒν•œμ΄ μžˆλŠ”μ§€ 등을 κ²€ν† ν•˜κ³ , μ μ ˆν•  λ•Œλ§Œ 이λ₯Ό μ²˜λ¦¬ν•œλ‹€.

https://developer.mozilla.org/ko/docs/Web/HTTP/Messages


μ‹œμž‘ 쀄

HTTP μš”μ²­μ˜ μ‹œμž‘ 쀄은 λ©”μ†Œλ“œ(Method), μš”μ²­ URI(Request-URI), 그리고 HTTP λ²„μ „μœΌλ‘œ κ΅¬μ„±ν•œλ‹€.

각각은 λ„μ–΄μ“°κΈ°λ‘œ κ΅¬λΆ„ν•œλ‹€.

  • HTTP 전솑 방법 (method)
    • ex. GET, PUT, POST, HEAD, OPTIONS
  • μš”μ²­ URL
    • 주둜 URL, λ˜λŠ” ν”„λ‘œν† μ½œ, 포트, λ„λ©”μΈμ˜ μ ˆλŒ€ 경둜둜 λ‚˜νƒ€λ‚¨
    • μš”μ²­ 포맷은 HTTP λ©”μ†Œλ“œμ— 따라 달라짐
      • POST / HTTP/1.1
      • GET /background.png HTTP/1.0
      • HEAD /test.html?query=alibaba HTTP/1.1
      • OPTIONS /anypage.html HTTP/1.1
    • 'absolute ν˜•μ‹'으둜 μ•Œλ €μ§„ μ™„μ „ν•œ URL은 ν”„λ‘μ‹œμ— μ—°κ²°ν•˜λŠ” 경우 λŒ€λΆ€λΆ„ GETκ³Ό ν•¨κ»˜ μ‚¬μš©
    •  'authority ν˜•μ‹'으둜 μ•Œλ €μ§€κ³  도메인 이름 및 μ˜΅μ…˜ 포트(':'κ°€ μ•žμ— λΆ™μŠ΅λ‹ˆλ‹€)둜 이루어진 URL의 인증 μ»΄ν¬λ„ŒνŠΈμ΄λ‹€. HTTP 터널을 κ΅¬μΆ•ν•˜λŠ” κ²½μš°μ—λ§Œ CONNECT와 ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλ‹€. 
      • CONNECT developer.mozilla.org:80 HTTP/1.1
    •  OPTIONS와 ν•¨κ»˜ λ³„ν‘œ('*') ν•˜λ‚˜λ‘œ μ„œλ²„ 전체λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 'asterisk ν˜•μ‹'이닀. 
      • OPTIONS * HTTP/1.1
  • HTTP 버전
    • ex. 1.0 λ˜λŠ” 1.1
    • ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ 버전을 맞좰주기 μœ„ν•¨


HTTP μš”μ²­ 헀더

  • 이름: κ°’
  • μš”μ²­ ν—€λ”μ˜ μ’…λ₯˜
    • General 헀더: HTTP/1.1 λΆ€ν„°λŠ” General header둜 ꡬ체적으둜 λΆ„λ₯˜ν•˜μ§€ μ•ŠμŒ 
    • Request 헀더: User-Agent (en-US), Accept와 같은 Request ν—€λ”λŠ” μš”μ²­μ˜ λ‚΄μš©μ„ μ’€ 더 ꡬ체화 μ‹œν‚€κ³ (Accept-Language), μ»¨ν…μŠ€λ₯Ό μ œκ³΅ν•˜κΈ°λ„ ν•˜λ©°(Referer), 쑰건에 λ”°λ₯Έ μ œμ•½ 사항을 주기도 ν•˜λ©΄μ„œ(If-None) μš”μ²­ λ‚΄μš©μ„ μˆ˜μ •λ‹€.
      • User-Agent 헀더: μ†Œν”„νŠΈμ›¨μ–΄μ— κ΄€ν•œ 정보
      • 호슀트(Host) 헀더: 호슀트λͺ…
      • μΏ ν‚€(Cookie) 헀더
        • μΏ ν‚€: μ„Έμ…˜μ— λŒ€ν•œ 정보 (이게 μ–΄λ–€ μ„Έμ…˜μΈμ§€ νŒŒμ•… κ°€λŠ₯)
        • XWS 곡격으둜 μ„Έμ…˜ 정보 ν›”μ³μ˜¬ 수 있음
    •    Referer 헀더: ν•΄λ‹Ή μš”μ²­μ΄ μ‹œμž‘λœ URL 정보
      • κ³΅κ²©μžκ°€ ν•΄λ‹Ή 헀더λ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.
    •  λ©”μ‹œμ§€ λ°μ΄ν„°μ˜ μ›λž˜ ν˜•μ‹κ³Ό 적용된 인코딩을 μ„€λͺ…ν•˜λŠ” Content-Typeκ³Ό 같은 Representation 헀더(λ©”μ‹œμ§€μ— 본문이 μžˆλŠ” κ²½μš°μ—λ§Œ 쑴재).

→ λ³΄μ•ˆμ  κ΄€μ μ—μ„œλŠ” μΏ ν‚€ 헀더와 Referer헀더가 κ°€μž₯ μ€‘μš”!

λ³Έλ¬Έ (body)

본문은 μš”μ²­μ˜ λ§ˆμ§€λ§‰ 뢀뢄에 λ“€μ–΄κ°„λ‹€.

λͺ¨λ“  μš”μ²­μ— 본문이 λ“€μ–΄κ°€μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. GET, HEAD, DELETE , OPTIONS처럼 λ¦¬μ†ŒμŠ€λ₯Ό κ°€μ Έμ˜€λŠ” μš”μ²­μ€ 보톡 본문이 ν•„μš”κ°€ μ—†λ‹€.

일뢀 μš”μ²­μ€ μ—…λ°μ΄νŠΈλ₯Ό ν•˜κΈ° μœ„ν•΄ μ„œλ²„μ— 데이터λ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€. 보톡 (HTML 폼 데이터λ₯Ό ν¬ν•¨ν•˜λŠ”) POST μš”청일 κ²½μš°μ— κ·Έλ ‡λ‹€.

bodyλŠ” 크게 두가지 μ’…λ₯˜λ‘œ λ‚˜λ‰œλ‹€

  • 헀더 두 개(Content-Type와 Content-Length)둜 μ •μ˜λœ 단일 파일둜 κ΅¬μ„±λ˜λŠ” 단일-λ¦¬μ†ŒμŠ€ λ³Έλ¬Έ(single-resource bodies)
  • 각각 μ„œλ‘œ λ‹€λ₯Έ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” λ©€ν‹°νŒŒνŠΈ 본문으둜 κ΅¬μ„±λ˜λŠ” λ‹€μ€‘ λ¦¬μ†ŒμŠ€ λ³Έλ¬Έ
    •  λ³΄ν†΅ HTML 폼 (en-US)κ³Ό 관련이 있음 

HTTP 응닡 

μ‹œμž‘μ€„

  • HTTP 버전
    • ex. HTTP/1.1
  •  μš”청에 λŒ€ν•œ κ²°κ³Ό μ½”λ“œ
    • ex. 200. 404, 302
  •  μ‘닡에 λŒ€ν•œ 상황을 μ„€λͺ…ν•΄μ£Όκ³ , μ‚¬λžŒμ΄ HTTP λ©”μ‹œμ§€λ₯Ό 이해할 λ•Œ 도움이 λ˜λŠ” μƒνƒœ μ½”λ“œμ— λŒ€ν•œ μ§§κ³ , μˆœμ „νžˆ 정보 제곡 λͺ©μ μ˜ 'μƒνƒœ ν…μŠ€νŠΈ'
    • ex. OK
μƒνƒœ μ½”λ“œ μ„€λͺ… λŒ€ν‘œ μ˜ˆμ‹œ
1xx  μš”μ²­μ„ μ œλŒ€λ‘œ λ°›μ•˜κ³ , μ²˜λ¦¬κ°€ μ§„ν–‰ 쀑  
2xx μš”μ²­μ΄ μ œλŒ€λ‘œ 처리됨 200(OK): 성곡
3xx μš”μ²­μ„ μ²˜λ¦¬ν•˜λ €λ©΄, ν΄λΌμ΄μ–ΈνŠΈκ°€ μΆ”κ°€ λ™μž‘μ„ μ·¨ν•΄μ•Ό 함  302(Found): λ‹€λ₯Έ URL둜 갈 것
4xx ν΄λΌμ΄μ–ΈνŠΈκ°€ 잘λͺ»λœ μš”μ²­μ„ 보내어 μ²˜λ¦¬μ— μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€. - 400(Bad Request): μš”μ²­μ΄ 문법에 λ§žμ§€ μ•ŠμŒ

- 401(Unauthorized): ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 인증이 μ‹€νŒ¨ν•¨ 

- 403(Forbidden): ν΄λΌμ΄μ–ΈνŠΈκ°€ λ¦¬μ†ŒμŠ€μ— μš”μ²­ν•  κΆŒν•œμ΄ μ—†μŒ

- 404(Not Found): λ¦¬μ†ŒμŠ€ μ—†μŒ
5xx ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ€ μœ νš¨ν•˜μ§€λ§Œ, μ„œλ²„μ— μ—λŸ¬κ°€ λ°œμƒν•˜μ—¬ μ²˜λ¦¬μ— μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.  - 500(Interval Server Error): μ„œλ²„κ°€ μš”μ²­μ„ μ²˜λ¦¬ν•˜λ‹€κ°€ μ—λŸ¬κ°€ λ°œμƒν•¨ 

- 503(Service Unavailable): μ„œλ²„κ°€ κ³ΌλΆ€ν•˜λ‘œ 인해 μš”μ²­μ„ μ²˜λ¦¬ν•  수 μ—†μŒ 

 

HTTP 응닡 헀더 

응닡에 λ“€μ–΄κ°€λŠ” HTTP ν—€λ”λŠ” λ‹€λ₯Έ 헀더와 λ™μΌν•œ ꡬ쑰λ₯Ό λ”°λ₯Έλ‹€.

  • Via와 같은 General ν—€λ”λŠ” λ©”μ‹œμ§€ 전체에 μ μš©λ©λ‹ˆλ‹€
  • 응닡 헀더: μ›μΉ™μ μœΌλ‘œλŠ” μ„œλ²„μ—μ„œ λ™μž‘λ˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄μ˜ 정보λ₯Ό λ³΄μ—¬μ€Œ
    ⇒ λ”°λΌμ„œ, 곡격자의 관심사! BUT 높은 ν™•λ₯ λ‘œ 정보가 잘λͺ»λ¨
    • 이 정보λ₯Ό 톡해 λ²„μ „μ˜ 정보λ₯Ό μ•Œμ•„λƒ„ → λ§Œμ•½ λ§žλŠ” 정보라면 κ³΅κ²©μžκ°€ λ§žμΆ€ν˜• 곡격을 ν•  수 있기 λ•Œλ¬Έμ— 맀우 μœ λ¦¬ν•΄μ§
      ⇒ κ³΅κ²©μžλ„ λ‹€λ₯Έ 방법 사
    • Set-Cookie 헀더: μΏ ν‚€λ₯Ό λΈŒλΌμš°μ €(=ν΄λΌμ΄μ–ΈνŠΈ)μ—κ²Œ 보낼 λ•Œ μ‚¬μš©
    • www-Authenticate 헀더: 인증 κ΄€λ ¨ 상세 정보λ₯Ό λ‹΄μŒ

λ³Έλ¬Έ (body)

본문은 μ‘λ‹΅μ˜ λ§ˆμ§€λ§‰ 뢀뢄에 λ“€μ–΄κ°‘λ‹ˆλ‹€. λͺ¨λ“  응닡에 본문이 λ“€μ–΄κ°€μ§€λŠ” μ•ŠλŠ”λ‹€.

ν•΄λ‹Ή νŽ˜μ΄λ‘œλ“œ 없이도 μš”μ²­μ— μΆ©λΆ„νžˆ μ‘λ‹΅ν•˜λŠ” 201 Created, 204 **No Content**κ³Ό 같은 μƒνƒœ μ½”λ“œλ₯Ό κ°€μ§„ μ‘λ‹΅μ—λŠ” 보톡 본문이 μ—†λ‹€.

 

HTTP ν΄λΌμ΄μ–ΈνŠΈ λ©”μ†Œλ“œ

⭐ GETκ³Ό POST의 차이점 → μ–΄λ–€κ²Œ 더 λ³΄μ•ˆμ μœΌλ‘œ μ•ˆμ „ν• κΉŒ?
⇒ POST (URL 곡개 X)
κ·ΈλŸ¬λ‚˜ POST도 μ™„μ „ν•˜κ²Œ μ•ˆμ „ν•˜μ§€ μ•Šλ‹€λŠ” 것을 μ£Όμ˜ν•΄μ•Ό 함 (μƒλŒ€μ μœΌλ‘œ 더 μ•ˆμ „ν•˜λ‹€λŠ” 것)
→ POST도 크둬 개발자 λ„κ΅¬λ‚˜ 와이어샀크 등을 ν†΅ν•΄μ„œ 확인할 수 있기 λ•Œλ¬Έ

https://velog.io/@welchs1423/GET-POST-%EB%B0%A9%EC%8B%9D%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

λ¨Όμ € GET은 λ¦¬μ†ŒμŠ€λ₯Ό κ°€μ Έμ˜€λΌλŠ” λ©”μ†Œλ“œμ΄λ‹€. μ΄μš©μžκ°€ λΈŒλΌμš°μ €μ— μ›Ή μ„œλ²„μ˜ μ£Όμ†Œλ₯Ό μž…λ ₯ν•˜κ±°λ‚˜ ν•˜μ΄νΌλ§ν¬λ₯Ό ν΄λ¦­ν•˜λ©΄, μƒˆλ‘œμš΄ νŽ˜μ΄μ§€λ₯Ό λ Œλ”λ§ν•˜κΈ° μœ„ν•΄ λ¦¬μ†ŒμŠ€κ°€ ν•„μš”ν•˜λ‹€. μ΄λ•Œ λΈŒλΌμš°μ €λŠ” GET μš”μ²­μ„ μ„œλ²„μ— μ „μ†‘ν•˜μ—¬ λ¦¬μ†ŒμŠ€λ₯Ό λ°›μ•„μ˜¨λ‹€. λ°˜λŒ€λ‘œ, POSTλŠ” λ¦¬μ†ŒμŠ€λ‘œ 데이터λ₯Ό λ³΄λ‚΄λΌλŠ” λ©”μ†Œλ“œμ΄λ‹€. 전솑할 λ°μ΄ν„°λŠ” 보톡 HTTP 바디에 ν¬ν•¨λ˜κ³ , λ‘œκ·ΈμΈν•  λ•Œ μž…λ ₯ν•˜λŠ” ID와 λΉ„λ°€λ²ˆν˜Έ, κ²Œμ‹œνŒμ— μž‘μ„±ν•˜λŠ” κΈ€ 등이 POST둜 μ„œλ²„μ— 보내진닀.

  •  GET⭐⭐⭐
    • μ›Ή μ„œλ²„μ— μžˆλŠ” μžμ›μ„ νšλ“ν•  λ•Œ μ‚¬μš© → μš”μ²­
    • URL에 λͺ¨λ“  정보가 λ‚˜νƒ€λ‚¨
    • URL이 ν•œ 번 μž…λ ₯되면 λΈŒλΌμš°μ € νžˆμŠ€ν† λ¦¬λ‚˜ μ›Ή μ„œλ²„μ˜ λ‘œκ·Έμ— μ €μž₯됨
    • μ™ΈλΆ€μ‚¬μ΄νŠΈμ™€ λ§ν¬λ˜μ–΄ μžˆλŠ” κ²½μš°μ— λ‹€λ₯Έ μ‚¬μ΄νŠΈλ“€μ˜ Referer 헀더에도 전달됨
    • μ€‘μš”ν•œ μ •λ³΄λŠ” URL queryλ₯Ό 톡해 곡개되면 μ•ˆλ˜κΈ° λ•Œλ¬Έμ— GET λ©”μ„œλ“œλ₯Ό 톡해 μ „λ‹¬ν•˜λ©΄ μ•ˆλ¨
  • POST⭐⭐⭐
    • μš”μ²­ 인자λ₯Ό λ©”μ‹œμ§€ λͺΈμ²΄λ₯Ό ν†΅ν•΄μ„œ λ³΄λ‚΄μ§ˆ 수 있음
    • URL은 뢁마크 λ˜μ§€λ§Œ, λ©”μ‹œμ§€ λͺΈμ²΄λ₯Ό 톡해 보내어진 μš”μ²­ μΈμžλŠ” URL을 κΈ°λ‘ν•˜λŠ” λ‘œκ·Έμ— μ €μž₯λ˜μ§€ μ•Šκ³ , Referer 헀더에도 μ „λ‹¬λ˜μ§€ μ•ŠμŒ
  • HEAD
    • GET μš”μ²­μ„ ν•˜κΈ° 전에 λ¦¬μ†ŒμŠ€κ°€ μžˆλŠ”μ§€ 확인
      • 있으면 GETμš”μ²­ 보내고, μ—†μœΌλ©΄ 보내지 X
  •  TRACE
    • 진단을 μœ„ν•œ λͺ©μ μœΌλ‘œ μ‚¬μš©λ¨
    • ν”„λ‘μ‹œ μ„œλ²„μ˜ 효과λ₯Ό νƒμ§€ν•˜λŠ”λ° μ‚¬μš©
  •  OPTIONS
    • μΆ”κ°€μ μœΌλ‘œ λ“€μ–΄κ°ˆ 수 μžˆλŠ” μ–΄λ–€ 정보듀을 μ„œλ²„μ— μš”μ²­ν•  λ•Œ μ‚¬μš©
      • μΌμ‹œμ μœΌλ‘œ μ‚¬μš©λ˜μ§€ μ•ŠλŠ” νŠΉμ • μžμ› λ“±
    •  μ„œλ²„λŠ” 리슀트λ₯Ό κ°–λŠ” allow 헀더λ₯Ό 톡해 응닡
  •  PUT
    • μ„œλ²„μ— νŠΉμ • μžμ›μ„ 올릴 λ•Œ(μ—…λ‘œλ“œ..) μ‚¬μš©ν•˜λŠ” 방식
      •  GET/POST: μžμ›μ„ κ°€μ Έμ˜¬ λ•Œ μ‚¬μš©
    •  κ³΅κ²©μžκ°€ μ•…μ˜μ μΈ 슀크립트λ₯Ό μ„œλ²„μ— μ˜¬λ €μ„œ μ‹€ν–‰ν•  λ•Œ μ‚¬μš©λ  수 있음