[네트워크] HTTP, HTTPS

Minju Kim·2022년 3월 11일
0

CS & Etc.

목록 보기
5/9

HTTP | MDN

Hypertext Transfer Protocol (HTTP)
is an application-layer protocol for transmitting hypermedia documents, such as HTML. It was designed for communication between web browsers and web servers, but it can also be used for other purposes. HTTP follows a classical client-server mode, with a client opening a connection to make a request, then waiting until it receives a response. HTTP is a stateless protocol, meaning that the server does not keep any data (state) between two requests.

HTTP? 단어 뜻

HyperText - HTML의 HT와 같다. 즉 HyperText는 HTML파일을 의미한다.
Transfer - 전송
Protocol - 규약

👉  따라서 HTTP란 컴퓨터들끼리 HTML파일을 주고받을 수 있도록 하는 소통방식 또는 약속이다.


HTTP가 가지는 두 가지 특징

특징 1. Request & Response

메세지로 요청하고 응답받는다.

특징 2. Stateless

서버가 두개의 요청에 대한 데이터(state)를 보존하고 있지 않다는 뜻이다. 따라서 매 통신마다 필요한 모든 정보를 담아서 요청을 보내야 한다. 이번통신에서 필요한 내용중에 이전 통신에서 이미 보내준 정보가 있다고 하더라도, 이번통신에서는 그걸 알지 못한다는 의미이다.

따라서 만약 여러번 통신의 과정을 통해 연속된 데이터 처리가 필요한 경우(ex. 온라인 쇼핑몰에서 로그인 후 장바구니 기능)를 위해 로그인 토큰, 브라우저의 쿠키, 세션, 로컬스토리지 같은 기술이 필요해서 만들어지게 되었다.


Request/ Response 메세지 구조

Request 메세지 구조

👉  Start Line + Headers + Body

  1. Start Line = HTTP Method + Request Target + HTTP Version
  • HTTP Method: 해당 요청이 의도한 액션을 정의하는 부분. 주로 GETPOSTDELETE가 많이 쓰임
  • Request target: 해당 request가 전송되는 목표 url
  • HTTP Version: 말 그대로 사용되는 HTTP 버전을 뜻한다. 주로 1.1 버전이 널리 쓰임
GET /login HTTP/1.1
# 해석: GET 메소드로 login 이라는 요청 타겟에 HTTP 1.1 버전으로 요청을 보내겠다!
  1. Headers: 해당 요청에 대한 추가 정보(메타 데이터)를 담고있는 부분이다.

    • Key: Value 값으로 되어있다 (JavaScript의 객체, Python의 딕셔너리 형태라고 보면 된다)
    • Host: 요청을 보내는 목표(타겟)의 주소. 즉, 요청을 보내는 웹사이트의 기본 주소가 된다. (ex. www.apple.co.kr)
    • User-Agent: 요청을 보내는 클라이언트의 대한 정보 (ex. chrome, firefox, safari, explorer)
    • Content-Type: 해당 요청이 보내는 메세지 body의 타입 (ex. application/json)
    • Content-Length: body 내용의 길이
    • Authorization: 회원의 인증/인가를 처리하기 위해 로그인 토큰을 Authroization 에 담는다
    Headers: {
        Host:
        User-Agent:
        Content-Type:
        Content-Length:
        Authorization:
    }
    
  2. Body: 해당 요청의 실제 내용

    • 주로 Body를 사용하는 메소드는 POST다.
    • 로그인 시에 서버에 보낼 요청의 내용
    Body: {
        "user_email": "minju1009@gmail.com"
        "user_password": "hellominju"
    }
    

Response 메세지 구조

👉  Status Line + Headers + Body

  1. HTTP Version / Status Code / Status Text

    • HTTP Version: 요청의 HTTP버전과 동일
    • Status Code: 응답 메세지의 상태 코드
    • Status Text: 응답 메세지의 상태를 간략하게 설명해주는 텍스트
    HTTP/1.1 404 Not Found
    # 해석: HTTP 1.1 버전으로 응답하고 있는데, 프론트엔드에서 보낸 요청(ex. 로그인 시도)에 대해서
    # 유저의 정보를 찾을 수 없기 때문에(Not Found) 404 상태 메세지를 보낸다.
    
    HTTP/1.1 200 SUCCESS
    # 해석: HTTP 1.1 버전으로 응답하고 있는데, 프론트엔드에서 보낸 요청에 대해서 성공했기 때문에
    # 200 상태 메세지를 보낸다.
  2. Headers: 요청의 헤더와 동일하다. 응답의 추가 정보(메타 데이터)를 담고있는 부분이다.

    • 다만, 응답에서만 사용되는 헤더의 정보들이 있다. (ex. 요청하는 브라우저의 정보가 담긴 User-Agent 대신, Server 헤더가 사용된다.)
  3. Body: 요청의 Body와 일반적으로 동일하다.

    • 요청의 메소드에 따라 Body가 항상 존재하지 않듯이 응답도 응답의 형태에 따라 데이터를 전송할 필요가 없는 경우엔 Body가 없을 수도 있다.
    • 가장 많이 사용되는 Body 의 데이터 타입은 JSON(JavaScript Object Notation) 이다.
    • 로그인 요청에 대해 성공했을 때 응답의 내용
    Body: {
        "message": "SUCCESS"
        "token": "kldiduajsadm@9df0asmzm" (암호화된 유저의 정보)
    }

대표적인 Request Methods 3가지

⛔️ 클라이언트 입장에서 생각해야 한다.

GET : 데이터 받아오기(페이지 불러오기, 정보조회 등)

👉🏻장바구니에 담은 제품을 조회한다

// (축약된 요청 메세지)
GET /shop/bag HTTP/1.1
Headers: {
    "HOST": "https://www.apple.com/kr",
    "Authroization": "kldiduajsadm@9df0asmzm" (유저가 본인임을 증명할 수 있는 인증/인가 토큰)
}

// (축약된 응답 메시지)
HTTP/1.1 200 SUCCESS
Body: {
    "message": "SUCCESS",
    "carts": [
        {
            "productId": 10
            "name": "Pro Display XDR - Nano-texture 글래스"
            "price": "₩7,899,000"
            "quantity": 1
       },
       {
           "productId": 20
           "name": "Mac Pro"
           "price": "₩73,376,000"
           "quantity": 2
       }
    ]
}

POST : 데이터 생성/수정하기

Body에 보내는 데이터가 들어있으니, Body 내용을 주의깊게 살펴볼 것

👉🏻장바구니에 맘에 드는 상품을 담는다

// (축약된 요청 메세지)
POST /shop/bag HTTP/1.1
Headers: {
"HOST": "https://www.apple.com/kr"
"Authroization": "kldiduajsadm@9df0asmzm" (유저가 본인임을 증명할 수 있는 인증/인가 토큰)
}
Body: {
    product: {
        "productId": 30
        "name": "12.9형 iPad Pro Wi-Fi + Cellular 128GB"
        "color": "스페이스 그레이"
        "price": "₩1,499,000"
        "quantity": 1
    }
}

// (축약된 응답 메시지)
HTTP/1.1 201 SUCCESS
Body: {
"message": "SUCCESSFULLY CARTS UPDATED"
}

DELETE : 서버에 있는 특정 데이터 삭제하기

👉🏻장바구니에서 제품을 삭제한다

// (축약된 요청 메세지)
DELETE /shop/bag HTTP/1.1
Headers: {
"HOST": "https://www.apple.com/kr"
"Authroization": "kldiduajsadm@9df0asmzm" (유저가 본인임을 증명할 수 있는 인증/인가 토큰)
}
Body: {
    productId: 30
}

// (축약된 응답 메시지)
HTTP/1.1 201 SUCCESS
Body: {
    "message": "productId 30 DELETED"
}

Response State Code

분류응답코드설명
Success200 : OK문제 없이 요청사항 처리 완료
Success201 : Created보통 POST 메소드의 요청에 따라 백엔드 서버에 데이터가 잘 생성/수정 되었을 때 보내는 코드
Client Error400 : Bad Request주로 요청의 Body에 보내는 내용이 잘못 되었을 때.number(번호)를 보내야 하는데 text(주소)보낸 경우
Client Error401 : Unauthorized유저가 해당 요청을 진행하려면 먼저 로그인/회원가입을 해야한다는 의미.
Client Error403 : Forbidden유저가 해당 요청에 대한 권한이 없음. 접근 불가능한 정보에 접근할 경우. ex) 유료회원만 접근할 수 있는 데이터 요청시
Client Error404 : Not Found서버가 요청받은 리소스를 찾을 수 없음, 너가 요청한 URL 여기 없다!!
Server Error500 : Internal Server Error서버에러시 → 요청을 처리하는 과정에서 서버가 예상하지 못한 상황에 놓였다

[ HTTP vs HTTPS ]

  • HTTP는 평문 데이터를 전송하는 프로토콜이기 때문에, HTTP로 비밀번호나 주민번호 등을 주고 받으면 제3자에 의해 조회될 수 있다. 이러한 문제를 해결하기 위해 HTTP에 암호화가 추가된 프로토콜이 HTTPS이다(HTTP + Security).
  • HTTPS에는 대칭키 암호화와 비대칭키 암호화가 모두 사용된다.비대칭키 암/복호화는 비용이 매우 크기 때문에 서버와 클라이언트가 주고받는 모든 메세지를 비대칭키로 암호화하면 오버헤드가 발생할 수 있다. 그래서 서버와 클라이언트가 최초 1회로 서로 대칭키를 공유하기 위한 과정에서 비대칭키 암호화를 사용하고, 이후에 메세지를 주고 받을 때에는 대칭키 암호화를 사용한다.
  • HTTPS 의 SSL 에서는 공통키 암호화 방식과 공개키 암호화 방식을 혼합한 하이브리드 암호 시스템을 사용한다. 공통키를 공개키 암호화 방식으로 교환한 다음에 다음부터의 통신은 공통키 암호를 사용하는 방식이다.
profile
⚓ A smooth sea never made a skillful mariner

0개의 댓글