본문 바로가기
안드로이드/etc.

[CS] HTTP와 HTTPS

by jinwo_o 2024. 9. 14.

HTTP (HyperText Transfer Protocol)

  • 웹 페이지를 요청하고 응답받기 위해 설계된 클라이언트와 서버 간의 기본 *통신 프로토콜이다. 사용자가 웹 브라우저를 통해 웹 페이지를 요청하면, 서버는 그 요청에 대한 응답을 보낸다. 주로 *헤더와 *바디로 구성된다.
    • 통신 프로토콜 : 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고받는 양식과 규칙의 체계이다. 즉, 통신 규약 및 약속
    • 헤더는 클라이언트와 서버 간의 메타 데이터를 전달하기 때문에, *요청 메서드, URL, 프로토콜 버전, 요청 헤더 등이 포함된다.
    • 바디는 클라이언트가 서버에 전송하고자 하는 실제 데이터가 포함되며, JSON, XML, 폼 데이터 등이 포함될 수 있다.
  • 데이터를 암호화하지 않은 평문으로 전송하기 때문에 중간에, 누군가가 데이터를 가로챌 수 있어 보안에 취약하다.
  • 인증서를 사용하지 않기 때문에 서버의 신원을 확인할 수 없다.
  • 뉴스 사이트, 블로그, 정보 제공 사이트와 같이 보안이 필요하지 않은 다양한 웹 애플리케이션에서 사용된다.

 

HTTP 구조

  • 애플리케이션 레벨의 프로토콜로 TCP/IP 위에서 작동한다.
  • Method, Path, Version, Headers, Body 등으로 구성된다.
  • 연결 상태를 유지하지 않는 무상태(stateless) 프로토콜이기 때문에 각 요청마다 사용자의 정보를 새로 입력해야 하며, 이는 웹 사용성을 떨어뜨린다.

 

TCP 와 IP 의 주요 기능과 차이점

  • *TCP 와 *IP 는 서로 다른 역할을 하지만, 함께 작동하여 인터넷상에서 데이터를 안정적으로 전송한다.
    • TCP(Transmission Control Protocol) : 신뢰할 수 있는 데이터 전송을 제공하는 프로토콜
      • 데이터 전송 과정에서의 확인 응답과 재전송 기능을 가지고 있기 때문에 데이터가 순서대로, 오류 없이 도착하도록 한다.
      • 전송 계층에서 자동한다.
    • IP (Internet Protocol) : 패킷의 라우팅과 전달을 담당하는 프로토콜
      • 네트워크 간의 데이터 전송 경로를 결정하는 역할을 하기 때문에 데이터 패킷에 주소 정보를 붙여 목적지까지 전송한다.
      • 인터넷 계층에서 작동한다.

 

요청 메서드

  • GET : 서버에서 데이터를 조회할 때 사용된다. 데이터를 변경하지 않으며, 주로 데이터를 읽어오는 데 사용된다.
    • URL 에 변수(데이터)를 포함시켜 요청한다.
    • 데이터를 Header(헤더)에 포함하여 전송한다.
    • 간단한 데이터를 URL 에 넣도록 설계된 방식으로 데이터를 보내는 양에 한계가 있다.
      • HTTP 자체는 GET 방식의 URL 길이에 제약을 두고 있지는 않지만, 브라우저에서 최대 길이를 제한하고 있으며 URL 형식에 맞지 않는 파라미터 이름이나 값은 인코딩 되어 전달해야 한다.
      • 만약 여기서 보내는 길이가 너무 길은 경우 초과데이터는 절단된다.
    • URL 에 데이터가 노출되어 보안에 취약하다.
    • 데이터가 노출되는 경우는 개인정보가 포함되지 않는 상황에서 캐싱을 통해 속도를 높이거나 즐겨찾기를 편리하게 하기 위해 사용됩니다.
      • 우리가 어떤 물건 A 에 대해서 즐겨찾기를 추가하면 그 물건의 이름이 A 라는 정보를 URL 에 추가하여 즐겨찾기를 생성할 수 있는 것이다.
  • POST : 서버에 데이터를 추가하거나 수정할 때 사용된다. 데이터를 서버에 전송하며, 주로 폼 데이터를 제출할 때 사용된다.
    • URL 에 변수(데이터)를 노출하지 않고 요청한다.
    • 데이터를 Body(바디)에 포함시킨다.
      • 메시지 길이에 제한은 없지만, 최대 요청을 기다리는 시간인 타임아웃(Time Out)이 존재한다.
      • 즉, 클라이언트는 페이지를 요청한 후, 응답을 기다리는 시간이 존재한다.
    • 헤더 필드 중 하나인 Content-Type 헤더는 응답 본문(Body)의 데이터 유형을 설명하며, 어떤 데이터 타입인지를 명시해야 한다.
    • URL 에 데이터가 노출되지 않으므로 즐겨찾기나 캐싱이 불가능하지만 쿼리스트링(문자열) 데이터뿐만 아니라, 라디오 버튼, 텍스트 박스와 같은 객체들의 값도 전송이 가능하다.
  • PUT : 서버에 데이터를 업데이트할 때 사용된다. 지정된 리소스를 업데이트하며, 주로 전체 리소스를 대체할 때 사용된다.
  • DELETE : 서버에서 데이터를 삭제할 때 사용된다. 지정된 리소스를 삭제하며, 주로 리소스를 제거할 때 사용된다.
  • PATCH : 서버에 데이터를 부분적으로 업데이트할 때 사용된다. 지정된 리소스의 일부를 업데이트하며, 주로 부분적인 변경을 적용할 때 사용된다.

 

HTTP 상태 코드

  • 웹 서버와 클라이언트 간의 통신 결과를 나타내는 코드로, 크게 5가지 범주로 나뉜다.

 

5가지 범주

  •  1xx (정보) : 요청을 받았으며, 처리가 계속되고 있음을 나타낸다.
    • 100 (Continue) : 클라이언트가 요청을 계속할 수 있음을 나타낸다.
  • 2xx (성공) : 요청이 성공적으로 처리되었음을 나타낸다.
    • 200 (OK) : 요청이 성공적으로 처리되었음을 나타낸다.
  • 3xx (리다이렉션) : 요청한 리소스가 다른 위치로 이동되었음을 나타낸다.
    • 301 (Moved Permanently) : 요청한 리소스가 영구적으로 이동되었음을 나타낸다. 주로 웹 페이지가 새 URL로 이동했을 때 사용되며, 사용자와 검색 엔진이 새 위치로 리디렉션되어야 함을 의미한다.
  • 4xx (클라이언트 오류) : 클라이언트의 요청에 오류가 있음을 나타낸다.
    • 401 (Unauthorized) : 요청이 인증되지 않았음을 나타낸다. 보안이 중요한 웹 애플리케이션에서 사용자 인증은 필수적이기 때문에, 사용자가 리소스에 접근하기 위해 필요한 권한이 없을 때 발생한다.
      • 클라이언트가 인증되지 않았거나, 유효한 인증 정보가 부족하여 요청이 거부되었음을 의미하는 상태값이다, 즉, 클라이언트가 인증되지 않았기 때문에 요청을 정상적으로 처리할 수 없다고 알려주는 것이다.
      • 예를 들어 로그인하지 않은 상태에서 결제 내역과 같은 정보를 요청하면 401 오류가 반환될 것이다.
    • 403 (Forbidden) : 서버가 요청을 이해했지만, 사용자가 해당 리소스에 접근할 권한이 없음을 나타낸다. 사용자가 인증을 했더라도 허가되지 않은 작업이나 리소스에 대한 접근을 차단할 때 발생한다.
      • 서버가 해당 요청을 이해했지만, 권한이 없어 요청이 거부되었음을 의미하는 상태값이다. 즉, 클라이언트가 해당 요청에 대한 권한이 없다고 알려주는 것이다.
      • 로그인하여 인증은 받았지만 접근 권한이 없는 정보를 요청하는 경우, 예를 들어 쇼핑몰에 로그인한 후 다른 사용자의 결제 내역을 요청하면 403 오류가 반환될 것입니다.
      • 403 오류가 발생했다는 것은 "해당 요청에 대한 자원이 존재함"을 내포하고 있기 때문에 "리소스의 존재 여부"를 알 수 있으므로 이러한 부분은 공격자가 취약점을 찾아내려 할 때 힌트를 제공할 수도 있다.
        • 따라서 보안 정책에 따라 권한이 없음을 알리지 않고 자원의 존재 자체를 숨기고 싶다면 404 오류를 사용하는 것이 더 적합할 수 있다. 이렇듯 응답 상태는 상황에 따라 유연하게 적용할 수 있다는 점을 참고하는 것이 좋다.
          • : 다른 사용자 GitHub 의 비공개 레포지토리에 접근하는 경우에는 403 이 아닌 404 오류를 내려주고 있다.
    • 404 (Not Found) : 요청한 리소스를 서버에서 찾을 수 없음을 나타낸다. 웹 사이트의 구조가 변경되거나 URL 이 잘못 입력되어 사용자가 존재하지 않는 페이지에 접근하려고 할 때 발생한다.
    • 409 (Conflict) : 리소스의 현재 상태와 충돌이 발생했음을 나타낸다. 사용자가 중복된 데이터를 생성하려 할 때, 이 상태 코드를 반환하여 개발자가 사용자에게 더 명확한 오류 정보를 전달할 수 있다.
  • 5xx (서버 오류) : 서버가 요청을 처리하는 도중 오류가 발생했음을 나타낸다.
    • 500 (Internal Server Error) : 서버 내부 오류로 인해 요청을 처리할 수 없음을 나타낸다. 서버 측의 문제로 발생하며, 개발자는 이러한 오류를 해결하기 위해 서버 로그를 확인해야 한다.
    • 503 (Service Unavailable) : 서버가 일시적으로 요청을 처리할 수 없음을 나타낸다. 서버의 과부하나 유지보수 등 다양한 이유로 발생한다.

 

HTTPS (HyperText Transfer Protocol Secure)

  • HTTP 에 보안 계층을 추가한 프로토콜이다.
  • *SSL/TLS 를 사용하여 데이터를 암호화하기 때문에 데이터 유출을 방지할 수 있고, 데이터의 기밀성을 보장한다.
    • 기밀성은 데이터를 암호화하여 중간에 탈취되더라도 해독할 수 없도록 한다.
  • SSL/TLS 인증서를 사용하여 서버의 신원을 확인하기 때문에 데이터의 무결성과 인증을 보장한다. 
    • 무결성은 데이터가 전송 중에 변경되지 않도록 보장한다.
    • 인증은 서버의 신원을 확인하여 클라이언트가 신뢰할 수 있는 서버와 통신하고 있음을 보장한다.
  • 사용자가 방문하는 사이트의 신뢰성을 증가시키는 역할도 한다. 또한, 구글과 같은 검색엔진HTTPS 를 사용하는 사이트를 더 신뢰할 수 있는 사이트로 간주하기 때문에 검색 엔진 순위가 향상될 수 있다.
  • 인터넷 뱅킹, 전자 상거래, 소셜 네트워크 서비스와 같이 보안이 중요한 웹 애플리케이션에서 사용된다.

 

SSL(보안 소켓 계층, Secure Sockets Layer)/TLS(전송 계층 보안, Transport Layer Security) 인증서

  • 데이터를 암호화하고, 서버와 클라이언트의 인증을 제공하여 안전한 데이터 전송 채널을 구축한다.
  • 인증서는 신뢰할 수 있는 인증 기간(Certificate Authority, CA)에서 발급받아야 한다. 서버의 공개키와 서버의 신원을 확인할 수 있는 정보가 포함되어 있다.

 

HTTPS 연결 과정

  1. 클라이언트가 서버에 암호화에 필요한 정보들을 보내고, 인증서를 요구한다.
  2. 클라이언트와 서버 간에 SSL/TLS *핸드셰이크가 이루어진다. 이 과정에서 서버는 자신의 공개키가 포함된 인증서를 클라이언트에게 전송한다.
    • 핸드셰이크 : 두 장치가 안전한 통신을 위해 서로의 신원을 확인하고 조건을 정하는 준비 과정
  3. 클라이언트는 서버의 인증서를 검증한 후, *세션 키를 생성하여 이를 서버의 공개키로 암호화한 뒤 서버에게 전송한다. 이 세션 키는 이후 통신에서 사용될 대칭키 암호화에 활용된다.
    • 세션키 : 하나의 통신 세션에서 모든 메시지를 암호화하는 데 사용되는 일회용 대칭 키
  4. 서버는 자신의 개인키를 사용하여 세션 키를 복호화하고, 이후의 통신은 이 세션 키를 사용하여 암호화된다. 이렇게 함으로써 클라이언트와 서버 간의 안전한 통신 채널이 구축된다. 이제부터 애플리케이션 계층의 프로토콜(HTTP)로 송수신한다.

 

HTTPS 보안성 강화 방법

  1. 강력한 암호화 알고리즘과 긴 키 길이를 사용하여 암호화된 데이터를 해독하기 어렵게 만든다.
  2. 서버의 SSL/TLS 인증서를 정기적으로 갱신하고, 인증서 체인을 올바르게 구성해야 한다. 이는 인증서의 유효성을 보장하고 중간자 공격을 방지한다.
  3. HSTS(HTTP Strict Transport Security)를 구현하여 클라이언트가 항상 HTTPS 를 통해서만 사이트에 접근하도록 강제한다. 이는 HTTP 를 통한 접근을 차단하여 보안을 강화한다.
  4. 취약점을 주기적으로 검사하고 보안패치를 적용한다. 이는 알려진 보안 취약점을 제거하여 공격자가 이를 이용하는 것을 방지한다.

 

웹 개발자를 위한 HTTP와 HTTPS의 이해

이 글에서는 HTTP와 HTTPS의 기본 원리 및 웹 개발에서의 중요성을 다루고, HTTPS를 도입하기 위한 기본적인 절차와 고려사항을 소개합니다. 이를 통해 보다 안전한 웹 서비스를 제공하는 방법을 배

f-lab.kr

 

HTTP와 HTTPS의 차이점과 보안성

이 글에서는 HTTP와 HTTPS의 차이점, 구성 요소, 보안성, 사용 사례, 그리고 미래에 대해 다룹니다. HTTP와 HTTPS의 차이점을 이해하고, 이를 웹 애플리케이션에 적용하여 보안성을 향상시키는 방법을

f-lab.kr

 

HTTPS 통신의 원리와 보안성 강화 방법

HTTPS 통신의 원리와 이를 통해 얻을 수 있는 보안 이점, 그리고 HTTPS 통신의 보안성을 강화하는 방법에 대해 설명합니다.

f-lab.kr

 

HTTP 상태 코드 완전 가이드: 웹 개발자를 위한 필수 지식

HTTP 상태 코드의 기본 이해부터 주요 상태 코드 분석, 상태 코드의 활용 방법까지, 웹 개발자가 알아야 할 필수 지식을 제공하는 가이드입니다.

f-lab.kr

 

HTTP 상태 코드의 이해와 활용

HTTP 상태 코드의 기본 분류와 특히 400번대와 500번대 상태 코드의 의미 및 활용 방법에 대해 설명합니다.

f-lab.kr

 

HTTP 프로토콜의 이해와 활용

이 블로그 포스트는 HTTP 프로토콜의 기본 개념과 특성, 다양한 메서드와 상태 코드에 대해 설명합니다. HTTP의 무상태성과 비연결성, 그리고 이를 보완하는 방법에 대해 다룹니다.

f-lab.kr

 

컴퓨터 네트워크 기초: TCP/IP 프로토콜 이해하기

TCP/IP 프로토콜의 개념과 구조, 그리고 주요 프로토콜에 대한 소개 글입니다. 컴퓨터 네트워크의 기본을 이루는 TCP/IP 프로토콜 스택의 이해를 돕기 위한 내용을 담고 있습니다.

f-lab.kr

 

[Web] GET과 POST의 비교 및 차이

사용자가 어떤 홈페이지로 이동하기 위해서 URL을 브라우저 주소창에 작성하고 엔터를 누르면 원하는 페이지로 이동합니다. 사용자는 단순히 URL(Uniform Resource Locator)을 입력하였을 뿐이지만 서버

mangkyu.tistory.com

 

[HTTP] HTTP 상태 401(Unauthorized) vs 403(Forbidden) 차이

1. HTTP 상태 401(Unauthorized) vs 403(Forbidden) 차이 [ HTTP 상태 401(Unauthorized) 이란? ] HTTP 상태 중 401(Unauthorized)는 클라이언트가 인증되지 않았거나, 유효한 인증 정보가 부족하여 요청이 거부되었음을 의

mangkyu.tistory.com