CS

HTTP와 SSL 그리고 HTTPS

🤖 Play with Android 🤖 2021. 10. 6. 15:01
728x90

 

📌 HTTP

HTTP란 텍스트 기반의 통신 규약으로 인터넷에서 데이터를 주고받을 수 있는 프로토콜이다.

쉽게 말해 HTML, CSS, JS, 이미지, 동영상 들과 같은 컨텐츠들을 서버와 클라이언트가 주고받기 위해서는 서로가 알아들을 수 있는 공통의 약속인 메세지가 필요한데 이를 HTTP라고 한다. 

 

 

 

 

📖  HTTP 동작 방식

클라이언트 즉, 사용자가 브라우저를 통해서 어떠한 서비스를 url을 통하거나 다른 것을 통해서 요청(request)을 하면 서버에서는 해당 요청사항에 맞는 결과를 찾아서 사용자에게 응답(response)하는 형태로 동작한다.

  • 요청 : client -> server
  • 응답 : server -> client

 

 

 

 

 

Request(요청)

클라이언트가 서버에게 연락하는 것을 요청이라고 하며 요청을 보낼때는 요청에 대한 정보를 담아 서버로 보낸다.

 

Request Method (요청의 종류)

  • GET : 자료를 요청할 때 사용
  • POST : 자료의 생성을 요청할 때 사용
  • PUT : 자료의 전체의 수정을 요청할 때 사용
  • PATCH : 자료의 일부의 수정을 요청할 때 사용
  • DELETE : 자료의 삭제를 요청할 때 사용

(요즘 DELETE는 잘 사용하지 않는다고 한다. 기업의 입장에서 모든 데이터는 곧 자산이기 때문이다.

따라서 회원 탈퇴 같은 처리를 할 때는 PUT과 PETCH등을 이용해 회원 상태를 탈퇴로 수정하는 방식을 많이 사용하고 있다고 한다.)

 

예시

GET /115 HTTP/1.1
Host: jminie.tistory.com
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36

 

첫줄에 보면 요청의 종류인 GET이 나와 있고 HTTP버전이 나와있다. 이 줄이 시작줄이다.

 

두 번째 줄 부터는 헤더이다. 요청에 대한 많은 정보를 담고 있다.

HOST는 어디인지 User-Agent(웹 브라우저라 및 OS에 대한 정보라고 생각하면 편하다.)

 

헤더에서 한 줄 띄고 본문이 시작되는데 본문은 요청을 할 때 함께 보낼 데이터를 담는 부분이다.

지금은 단순히 주소로만 요청을 보내고 있기 때문에 본문이 없는 것을 볼 수 있다.

 

 

 

 

 

 

 

Response(응답)

응답에서 우리가 알아야 할 것은 상태코드(Status Code)이다. 

상태코드는 종류가 매우 많은데 첫째 자리 숫자로 대략의 분류를 할 수 있다.

  • 1XX (조건부 응답) : 요청을 받았으며 작업을 계속한다.
  • 2XX (성공) : 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리했음을 가리킨다.
  • 3XX (리다이렉션 완료) : 클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.
  • 4XX (요청 오류) : 클라이언트에 오류가 있음을 나타낸다.
  • 5XX (서버 오류) : 서버가 유효한 요청을 명백하게 수행하지 못했음을 나타낸다.

 

자세한 상태코드 종류는 다음 링크를 통해 확인할 수 있다.

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

 

 

예시

HTTP/1.1 200 OK
Date: Wed, 06 Oct 2021 05:25:44 GMT
Content-Type: text/html; charset=utf-8
X-UA-Compatible: IE=Edge
Set-Cookie: TSSESSION_KEEP=1; expires=Fri, 05-Nov-2021 05:25:44 GMT; Max-Age=2592000; path=/; domain=tistory.com; HttpOnly

 

첫 줄은 버전 상태코드 상태메시지로 구성되어 있으며 위와 같이 200은 성공적인 요청이였다는 뜻이다.

 

두 번째 줄은 헤더로 Response(응답) 에 대한 여러가지 정보를 담고 있다.

 

헤더 뒤부터는 응답이다.

응답에는 대부분의 경우 본문이 있다.

보통 데이터를 요청하고 응답 메시지에는 요청한 데이터를 담아서 보내주기 때문이다.

응답 메시지에 HTML이 담겨 있는데 이 HTML을 받아 브라우저가 화면에 렌더링한다.

 

 

 

 

 

 

 

🔍  HTTP의 특징

  • HTTP 메시지는 HTTP 서버와 HTTP 클라이언트에 의해 해석이 된다.
  • TCP/ IP를 이용하는 응용 프로토콜이다.
    (컴퓨터와 컴퓨터간에 데이터를 전송 할 수 있도록 하는 장치로 인터넷이라는 거대한 통신망을 통해 원하는 정보(데이터)를 주고 받는 기능을 이용하는 응용 프로토콜)
  • HTTP는 연결 상태를 유지하지 않는 비연결성 프로토콜이다.
    (이러한 단점을 해결하기 위해 Cookie와 Session이 등장하였다.)
  • HTTP는 연결을 유지하지 않는 프로토콜이기 때문에 요청/응답 방식으로 동작한다.

 

 

 

 

 

🚨  HTTP의 위험성

HTTP는 통신 상대를 확인하지 않기 때문에 위장이 가능하다.

HTTP에 의한 통신에는 상대가 누구인지 확인하는 처리는 없기 때문에 누구든지 리퀘스트를 보낼 수 있다.

IP주소나 포트 등에서 그 웹 서버에 엑세스 제한이 없는 경우 Request가 온다면 상대가 누구든지 무언가의 리스폰스를 반환한다.

이러한 특징은 다음과 같은 여러 문제점을 유발한다.

  • Request를 보낸 곳의 웹 서버가 원래 원래 의도한 Response를 보내야 하는 웹 서버인지를 확인할 수 없다.
  • Response를 반환한 곳의 클라이언트가 원래 의도한 Request를 보낸 클라이언트인지 확인할 수 없다.
  • 통신하고 있는 상대가 접근이 허가된 상대인지 확인할 수 없다.
  • 어디의 누가 Request 했는지 확인할 수 없다.
  • 모든 Request를 수신하기 때문에 의미가 없는 리퀘스트도 수신한다. (DDOS 공격에 취약하다.)

 

 

 

 

 

 

📌  HTTPS

 

SSL

SSL은 상대를 확인하는 수단으로 증명서를 제공하고 있다.

증명서는 신뢰할 수 있는 제 3자 기관에 의해 발행되는 것이기 때문에 서버나 클라이언트가 실재하는 사실을 증명한다.

이 증명서를 이용함으로써 통신 상대가 내가 통신하고자 하는 서버임을 나타내고 이용자는 개인정보 누설 등의 위험성이 줄어들게 된다.

또한 클라이언트는 이 증명서로 본인 확인을 하고 웹사이트 인증에도 이용할 수 있다는 장점이 있다.

 

앞서 SSL인증을 받은 실습 포스팅을 참고하면 이해에 도움이 될 것이다.

https://jminie.tistory.com/104?category=1008953

 

AWS Nginx에 HTTPS 적용하기 (Let's Encrypt)

이 포스팅은 앞 포스팅들에 이어지는 글이다. AWS에 Nginx, MySQL, PHP 구축 및 Nginx - PHP 연동 MySQL 외부 접속 - MySQL Workbench 사용 AWS에 PHPMyAdmin 설치하기 도메인 구입(가비아) 및 설정 📌 HTTP란? H..

jminie.tistory.com

 

 

 

 

 

HTTPS

HTTPS는 SSL의 옷을 입은 HTTP라고 할 수 있다. 즉 HTTPS는 새로운 애플리케이션 계층의 프로토콜은 아니다.

HTTP 통신하는 소켓부분을 위에서 말한 SSL로 대체한다.

즉 HTTP는 원래 TCP와 직접 통신했지만, HTTPS에서는 SSL과 통신하고 SSL이 TCP와 통신하게 되는 것이다.

SSL을 사용한 HTTPS는 암호화와 증명서와 안전성 보호 세마리 토끼를 모두 잡았다고 볼 수 있다.

 

 

 

HTTPS는 공개키/개인키 암호화 방식을 이용해 데이터를 암호화하고 있다. 공개키와 개인키는 서로를 위한 1쌍의 키이다.

  • 공개키: 모두에게 공개가능한 키
  • 개인키: 나만 가지고 알고 있어야 하는 키

 

공개키와 개인키로 암호화하면 다음과 같은 효과를 얻을 수 있다.

  • 공개키 암호화: 공개키로 암호화를 하면 개인키로만 복호화할 수 있다. -> 개인키는 나만 가지고 있으므로, 나만 볼 수 있다. 
  • 개인키 암호화: 개인키로 암호화하면 공개키로만 복호화할 수 있다. -> 공개키는 모두에게 공개되어 있으므로, 내가 인증한 정보임을 알려 신뢰성을 보장할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Reference:

https://jeongupark-study-house.tistory.com/79

https://velog.io/@surim014/HTTP란-무엇인가

https://www.zerocho.com/category/HTTP/post/5b344f3af94472001b17f2da

https://toma0912.tistory.com/69

https://medium.com/@lunay0ung/protocol-http란-무엇일까-84a896c5fc93