개발일지

HTTP와 HTTPS 본문

네트워크

HTTP와 HTTPS

딸기아사이레모네이드리프레셔 2024. 1. 21. 21:27
728x90

목차

    HTTP

    HTTP(Hyper Text Transfer Protocol)란

    HTTP는 서버/클라이언트 모델을 따라 데이터를 주고 받기 위한 프로토콜이다. 

    *프로토콜 : 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계이다. 즉 통신 규약 및 약속

     

    HTTP의 구조

    • 애플리케이션 레벨의 프로토콜로 TCP/IP 위에서 작동한다.
    • HTTP는 상태를 가지고 있지 않는 Stateless 프로토콜이며 Method, Path, Version, Headers, Body 등으로 구성된다.
      *Stateless : 서버가 클라이언트의 상태를 유지하지 않는 것을 의미한다. 각각의 요청은 독립적으로 처리되며 이전의 요청에 대한 정보를 서버가 저장하지 않는다.

    하지만 HTTP는 암호화가 되지 않은 평문 데이터를 전송하는 프로토콜이였기 때문에, HTTP로 비밀번호나 주민등록번호 등을 주고 받으면 제3자가 정보를 조회할 수 있었다. 그리고 이러한 문제를 해결하기 위해 HTTPS가 등장하게 되었다.

    <Stateless 예시>

    더보기

    1. 클라이언트가 서버에게 요청 1을 보냄
    GET /page1 HTTP/1.1
    Host: example.com

    서버가 응답 1 반환
    HTTP/1.1 200 OK
    Content-Type: text/html

    <html>
    <body>
    페이지 1의 내용
    </body>
    </html>

    2. 클라이언트가 서버에게 요청 2를 보냄
    GET /page2 HTTP/1.1
    Host: example.com

    서버가 응답 2 반환
    HTTP/1.1 200 OK
    Content-Type: text/html

    <html>
    <body>
    페이지 2의 내용
    </body>
    </html>

    HTTP 동작과정

    서버 접속 -> 클라이언트 -> 요청 -> 서버 -> 응답 -> 클라이언트 -> 연결종료

    1. 클라이언트가 웹 브라우저에 URL 주소 입력

    2. DNS 서버에 웹 서버의 호스트 이름을 IP 주소로 변경 요청

    3. 웹서버와 TCP 연결 시도 (3way -handshaking)

    4. 클라이언트가 서버에게 요청 
        HTTP Request Message = Request Header + 빈 줄 + Request Body

     

    Request Header

    - 요청 메소드 + 요청 URI + HTTP 프로토콜 버전

    ex) GET/background.png HTTP/1.0 POST / HTTP 1.1

    - Header 정보(key-value 구조)

    빈줄

    - Header와 Body를 구분짓기 위한 구분자 

    - 요청에 대한 모든 메타 정보가 전송되었음을 알리는 용도

    Request Body

    - GET, HEAD, DELETE, OPTIONS처럼 리소스를 가져오는 요청은 바디 미포함

    - 데이터 업데이트 요청과 관련된 내용 (HTML 폼 콘텐츠 등)

     

    5. 서버가 클라이언트에게 데이터 응답
    HTTP Response Message = Response Header + 빈 줄 + Response Body

     

    Response Header

    - HTTP 프로토콜 버전 + 응답 코드 + 응답 메시지
       ex. HTTP/1.1 404 Not Found.

    - Header 정보(key-value 구조)

    빈 줄

    - Header와 Body를 구분짓기 위한 구분자 

    - 요청에 대한 모든 메타 정보가 전송되었음을 알리는 용도

    Response Body

    - 응답 리소스 데이터

    - 201, 204 상태 코드는 바디 미포함

       

    6. 서버 클라이언트 간 연결 종료 (4way-handshaking)

    HTTS

    HTTS란?

    • HTTP에 데이터 암호화가 추가된 프로토콜이다.
    • HTTPS는 HTTP와 다르게 443번 포트를 사용하며, 네트워크 상에서 중간에 제3자가 정보를 볼 수 없도록 암호화를 지원하고 있다.
    • HTTPS는 대칭키 암호화 방식과 비대칭키 암호화 방식을 모두 사용하고 있다.
    • HTTPS를 이용한 인터넷 접속은 SSL(TLS)을 이용한 것을 의미한다.
      *SSL 암호화 통신은 SSL 또는 TLS라는 보안 프로토콜을 통해 클라이언트와 서버가 보안이 향상된 통신을 하는 것을 말한다. 
      SSL : Secure Scokets Layer은 암호화 기반 인터넷 보안 프로토콜이다. 전달되는 모든 데이터를 암호화하고 특정한 유형의 사이버 공격도 차단한다. SSL은 TLS(Transport Layer Security) 암호화의 전신이기도 한다.

     

    HTTPS와 SSL은 같은것인가?

    HTTPS와 SSLS은 다르다.

    SSL과 TLS는 보안 계층 이라는 독립적인 프로토콜 계층을 만들어, 응용 계층과 전송 계층 사이에 속하게 된다.

    HTTPS는 SSL 또는 TLS 위에 TTHP 프로토콜을 얹어 보안된 HTTP 통신을 하는 프로토콜이다. 

     

    즉, SSL과 TLS는 HTTP뿐만 아니라 FTP,SMTP와 같이 다른 프로토콜에도 적용할 수 있으며, HTTPS는 TLS와 HTTP가 조합된 프로토콜만을 가리킨다. 

    (SSL과 TLS는 같은 의미의 단어로, TLS가 SSL의 후속버전이지만 SSL이 일반적으로 더 많이 사용되는 용어이다.)

    HTTS의 동작과정

    SSL 핸드셰이크

    1. 클라이언트에 해당하는 브라우저가 먼저 웹 서버에 접속한다. (Client Hello)

    웹 사이트 접속에 HTTPS를 사용하는 브라우저는 다음 정보를 Client Hello 단계에서 보낸다. 

    • 브라우저가 사용하는 SSL 혹은 TLS 버전 정보
    • 브라우저가 지원하는 암호화 방식 모음(cipher suite)
      • cipher suite는 보안의 궁극적 목표를 달성하기 위해 사용하는 방식을 패키지의 형태로 묶어놓는 것을 의미한다. 
    • 브라우저가 순간적으로 생성한 임의의 난수(숫자)
    • 만약 이전에 SSL 핸드 셰이크가 완료된 상태라면, 그 때 생성된 세션 아이디

    2. 웹서버는 1번에 응답하면서 아래 정보를 클라이언트에 제공한다. (Server Hello)

    • 브라우저의 암호화 방식 정보 중에서 서버가 지원하고 선택한 암호화 방식
    • 서버의 공개키가 담긴 SSL 인증서(인증서는 CA의 비밀키로 암호화되어 발급된 상태)
    • 서버가 순간적을  생성한 임의의 난수
    • 클라이언트 인증서 요청(선택사항)

    3.  서버의 SSL 인증서가 올바른지 확인한다.

    대부분 브라우저에는 공신력 있는 CA(인증기관)들의 정보와 CA가 만든 공개키가 이미 설치되어 있다.

    내장된 CA 공개키로 암호호화된 인증서를 복호화하고, 정상적으로 복호화되었다면 CA가 발급한 것이 증명된다.

     

    4. premaster secret 생성과 교환을 만든다.

    브라우저는 서버의 공개키를 사용하여 임의로 생성한 Premaster secret를 암호화하여 서버에게 전송한다. 

    서버는 자신의 개인키를 사용하여 복호화하고, 브라우저와 서버 같에 공유되는 master secret를 생성한다.

    master secret는 이후에 대칭키 암호화를 위한 세션 키를 생성하는 데 사용된다. 

     

    5. 대칭키로 암호화된 통신 시작

    클라이언트와 서버는 이제 공유된 master secret을 사용하여 대칭키를 생성한다. 이 대칭키는 향후 통신에서 데이터를 암호화하고 복호화하는데 사용된다. 

    SSL 핸드세이크가 완료되면, 클라이언트와 서버는 대칭키를 사용하여 암호화된 통신을 시작하고 이로써 안전한 HTTPS 연결이 성립된다. 

     

    6. SSL 핸드세이크를 종료 및 안전한 HTTPS 통신

    HTTPS 통신이 완료되면, 양쪽은 사용한 세션 키를 폐기하고, 새로운 핸드셰이크가 필요한 경우를 대비하여 재사용 가능한 상태로 남겨둡니다.

    HTTP 상태코드

    • 1xx(정보) : 요청을 받았으며 프로세스를 계속 진행한다.
    • 2xx(성공) : 요청을 성공적으로 받았으며 인식했고 수용한다.
    • 3xx(리다이렉션) : 요청 완료를 위해 추가 작업 조치가 필요하다. 
    • 4xx(클라이언트 오류) : 요청의 문법이 잘못되었거나 요청을 처리할 수 없다.
    • 5xx(서버 오류) : 서버가 명백히 유효한 요청에 대한 충족을 실패했다.

    1XX : Information responses

    상태 코드가 '1'로 시작하는 경우는 서버가 요청을 받았으며, 서버에 연결된 클라이언트는 작업을 계속 진행하라는 의미이다.

    해당 코드는 HTTP 1.0에서 지원되지 않는다.

    ex) 100 Continue, 101 Switching Protocol, 102 Processing

    2XX : Successful responses

    자주 사용되는 2xx 코드

    200 OK 요청이 성공적으로 되어, 요청에 따른 응답 반환

    201 Created : POST 요청 또는 일부 PUT 요청 이후 따라오며, 결과로 새로운 리소스 생성

     

    그외

    더보기

    202 Accepted

    요청을 수신하였지만, 그에 응하여 행동할 수 없다.
    이 응답은 요청 처리에 대한 결과를 이후에 HTTP로 비동기 응답을 보내는 것에 대해서 명확하게 명시하지 않는다.
    이것은 다른 프로세스에서 처리 또는 서버가 요청을 다루고 있거나 배치 프로세스를 하고 있는 경우를 위해 만들어졌다.

    203 Non-Authoritative Information

    이 응답 코드는 돌려받은 메타 정보 세트가 오리진 서버의 것과 일치하지 않지만 로컬이나 서드 파티 복사본에서 모아졌음을 의미한다. 이러한 조건에서는 이 응답이 아니라 200 OK 응답을 반드시 우선된다.

     

    204 No Content

    요청에 대해서 보내줄 수 있는 콘텐츠가 없지만, 헤더는 의미있을 수 있다. 사용자-에이전트는 리소스가 캐시된 헤더를 새로운 것으로 업데이트 할 수 있다.

     

    205 Reset Content

    이 응답 코드는 요청을 완수한 이후에 사용자 에이전트에게 이 요청을 보낸 문서 뷰를 리셋하라고 알려준다.

     

    206 Partial Content

    이 응답 코드는 클라이언트에서 복수의 스트림을 분할 다운로드를 하고자 범위 헤더를 전송했기 때문에 사용된다. 

    클라이언트가 이어받기를 시도하면 웹서버가 이에 대한 응답코드로 '206 Partial Content'와 함께 Range 헤더에 명시된 데이터의 부분(byte)부터 전송을 시작한다.

     

    207 Multi-Status

    멀티-상태 응답은 여러 리소스가 여러 상태 코드인 상황이 적절한 경우에 해당되는 정보를 전달한다.

    해당 코드는 WebDAV(Web Distributed Authoring and Vesioning)에 사용된다.

     

    208 Already Reported

    Prostat(property와 status의 합성어) 응답 속성으로 동일 컬렉션으로 바인드된 복수의 내부 멤버를 반복적으로 열거하는 것을 피하기 위해 사용된다. 해당 코드는 WebDAV(Web Distributed Authoring and Vesioning)에 사용된다.

     

    226 IM Used ( HTTP Delta encoding )

    서버가 GET 요청에 대한 리소스의 의무를 다 했고, 그리고 응답이 하나 또는 그 이상의 인스턴스 조작이 현재 인스턴스에 적용이 되었음을 알려준다.

    3XX : Redirection messages

    개발하면서 3xx 상태 코드를 본적이 있나,,싶을 정도로 처음 보는 코드들이 많다,,,

    더보기

    300 Multiple Choice

    요청에 대해서 하나 이상의 응답이 가능하다.

     

    301 Moved Permanently

    요청한 리소스의 URI가 변경되었음을 의미한다.

     

    302 Found

    요청한 리소스의 URI가 일시적으로 변경되었음을 의미한다.

     

    303 See Other

    클라이언트가 요청한 리소스를 다른 URI에서 GET 요청을 통해 얻어야 할 때, 서버가 클라이언트로 직접 보내는 응답이다.

     

    304 Not Modified

    이것은 캐시를 목적으로 사용된다. 이것은 클라이언트에게 응답이 수정되지 않았음을 알려준다.

     

    305 Use Proxy

    이전 버전의 HTTP 기술 사양에서 정의되었으며, 요청한 응답은 반드시 프록시를 통해서 접속해야 하는 것을 알려준다.

    이것은 프록시의 in-band설정에 대한 보안상의 걱정으로 인하여 사라져가고 있다.

     

    307 Temporary Redirect

    클라이언트가 요청한 리소스가 다른 URI에 있으며, 이전 요청과 동일한 메소드를 사용하여 요청해야 할 때, 서버가 클라이언트에 이 응답을 직접 보낸다.

    이것은 302 Found HTTP 응답 코드와 동일한 의미를 가지고 있으며, 사용자 에이전트가 반드시 사용된 HTTP 메소드를 변경하지 말아야 하는 점만 다르다. 만약 첫 요청에 POST가 사용되었다면, 두번째 요청도 반드시 POST를 사용해야 한다.

     

    308 Permanent Redirect

    이것은 리소스가 이제 HTTP 응답 헤더의 Location:에 명시된 영구히 다른 URI에 위치하고 있음을 의미한다.

    이것은 301 Moved Permanently HTTP 응답 코드와 동일한 의미를 가지고 있으며, 사용자 에이전트가 반드시 HTTP 메소드를 변경하지 말아야 하는 점만 다르다. 만약 첫 요청에 POST가 사용되었다면, 두번째 요청도 반드시 POST를 사용해야 한다.

    4XX : Client error responses

    4xx 응답코드는 개발하면서 가장 다양하게 봤다.

    자주 보게 될 응답코드들이니 잘 기억해두자.

     

    • 400 Bad Request : 잘못된 문법으로 인하여 서버가 요청하여 이해할 수 없음을 의미한다.
    • 401 Unauthorized :지정한 리소스에 대한 액세스 권한이 없어, 클라이언트는 요청한 응답을 받기 위해서는 반드시 스스로를 인증해야 한다.
    • 403 Forbidden : 지정한 리소스에 대한 액세스가 금지되었음을 의미한다. 401 인증 처리 이외의 사유로 리소스에 대한 액세스가 금지되었음을 의미한다. 401과 다른 점은 서버가 클라이언트가 누구인지 알고 있다.
    • 404 Not Found : 서버는 요청받은 리소스를 찾을 수 없다. 브라우저에서는 알려지지 않은 URL을 의미한다.
    • 405 Method Not Allowed : 요청한 URI가 지정한 메소드를 지원하지 않는다.

    그외 코드들은 해당 블로그에 들어가보면 확인할 수 있다. 

    5XX : Server error responses

    백엔드 개발자라면 5xx 코드는 반드시 기억하길 바란다.

    • 500 Internal Server Error : 웹 사이트 서버에 문제가 있음을 의미하지만 서버는 정확한 문제에 대해 더 구체적으로 설명할 수 없다.
    • 501 Not Implemented : 서버가 요청을 이행하는 데 필요한 기능을 지원하지 않음을 나타낸다. 
    • 502 Bad Gateway : 서버가 게이트웨이로부터 잘못된 응답을 수신했음을 의미한니. 인터넷상의 서버가 다른 서버로부터 유효하지 않은 응답을 받은 경우 발생합니다.
    • 503 Service Unavailable : 서버가 요청을 처리할 준비가 되지 않았다. 일반적인 원인은 유지보수를 위해 작동이 중단되거나 과부하가 걸린 서버이다.

    그외 코드

    더보기

    504 Gateway Timeout : 웹페이지를 로드하거나 브라우저에서 다른 요청을 채우려는 동안 한 서버가 액세스하고 있는 다른 서버에서 적시에 응답을 받지 못했음을 의미한다. 

    505 HTTP Version Not Supported : 서버에서 지원되지 않는 HTTP 버전을 클라이언트가 요청하였다.

    506 Variant Also Negotiates : 서버에 내부 구성 오류가 있는 경우 발생한다. 

     

    507 Insufficient Storage : 선택한 가변 리소스는 투명한 서버에 내부 구성 요류가 있는 경우 발생한다.

     

    508 Loop Detected (WebDAV) : 서버가 요청을 처리하는 동안 무한 루프를 감지한 경우 발생한다.

     

    510 Not Extended : 서버가 요청을 이행하려면 요청에 대한 추가 확장이 필요하다.

     

    511 Network Authentication Required : 클라이언트가 네트워크 액세스를 얻기 위해 인증할 필요가 있음을 나타낸다.

    상태 코드에 대한 더 자세하고, 구체적인 설명을 보고 싶다면 다음 블로그 글을 추천한다. 

    728x90

    '네트워크' 카테고리의 다른 글

    쿠키와 세션  (0) 2024.01.22
    CORS란?  (1) 2024.01.22
    로드밸런싱  (0) 2024.01.18
    TCP와 UDP  (0) 2024.01.16
    OSI 7계층  (0) 2024.01.13
    Comments