HTTP / HTTPS 와 HTTP Method

이하은·2024년 2월 1일

HTTP (Hypertext Transfer Protocol)

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

  • 프로토콜이란?
    컴퓨터 내부에서 또는 컴퓨터 사이에 데이터 교환 방식을 정의하는 규칙 세계. 기기 간 통신은 교환되는 데이터의 형식에 대해 상호 합의를 요구하며 이런 형식을 정의하는 규칙의 집합이다.

사용자가 웹 사이트를 방문하면 사용자 브라우저가 웹 서버에 HTTP 요청을 전송하고 웹 서버는 HTTP 응답으로 응답하고, 웹 서버와 사용자 브라우저는 데이터를 일반 텍스트로 교환한다. HTTP는 80번 포트를 사용하고 있기 때문에 HTTP 서버가 80번 포트에서 요청을 기다리고 있으며, 클라이언트는 80번 포트로 요청을 보내게 된다.
간단히 말해 HTTP 프로토콜은 네트워크 통신을 작동하게 하는 기본 기술이며, WWW(World-Wide-Web) 기반에서 세계적인 정보를 공유하는데 큰 역할을 하였다.

[ HTTP의 구조 ]

HTTP는 상태를 가지고 있지 않는 Stateless 프로토콜이며 Method, Path, Version, Headers, Body 등으로 구성된다.

[ HTTP의 단점 ]

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

HTTPS (Hyper Text Transfer Protocol Secure)

HTTPS는 HTTP에 데이터 암호화가 추가된 프로토콜이다. HTTPS는 HTTP와 다르게 443번 포트를 사용하며, 네트워크 상에서 중간에 제3자가 정보를 볼 수 없도록 암호화를 지원하고 있다.

HTTPS(Hypertext Transfer Protocol Secure)는 이름에서 알 수 있듯이 HTTP의 확장 버전 또는 더 안전한 버전이다. HTTPS에서는 브라우저와 서버가 데이터를 전송하기 전에 안전하고 암호화된 연결을 만들 수 있게 도와주고 서버 브라우저가 민감한 정보를 주고 받을 때도 도난당하는 것을 막아준다.

[ HTTPS의 보안 방식 ]

SSL 인증서(클라이언트와 서버간의 통신을 제3자가 보증해주는 전자화된 문서)는 사용자가 사이트에 제공하는 정보를 암호화하는데 이용되며, SSL 인증서를 HTTP 프로토콜에 추가하여 만들어진 것이 HTTPS다.
따라서 제 3자가 데이터를 훔쳐낸다고 하더라도 데이터가 암호화처리 되어 있기 때문에 해독을 할 수 없어 데이터를 읽을 수 없다.
그리고 HTTPS는 TLS(전송 계층 보안) 프로토콜을 사용해서 보안을 유지한다. TLS는 데이터 무결성을 보장해서 데이터가 전송 중에 수정되거나 손상되는 것을 방지하며 사용자가 접속하려는 웹사이트와 통신하고 있음을 증명할 수 있는 인증 기능도 가지고 있다.

[ HTTPS의 대칭키 암호화와 비대칭키 암호화 ]

대칭키 암호화

클라이언트와 서버가 동일한 키를 사용해서 암호화와 복호화를 진행한다.
키가 노출되면 매우 위험할 수 있지만 연산속도가 빠른 장점이 있다.

비대칭키 암호화

1개의 쌍으로 구성된 공개키와 개인키를 이용해 암호화와 복호화를 진행한다.
키가 노출되어도 비교적 안전할 수 있지만 연산속도가 느린 단점이 있다.
HTTPS는 대칭키 암호화와 비대칭키 암호화 방식 둘 다를 사용한다.

[ HTTPS의 비대칭키 암호화에서 공개키와 개인키 ]

비대칭키 암호화에서 공개키와 개인키 암호화 방식을 이용해 데이터 암호화를 진행하며 공개키와 개인키는 서로를 위한 1쌍의 키이다.

공개키 : 모두에게 공개 가능한 키이다.

개인키 : 나만 가지고 있어야 하는 키이다.

공개키와 개인키를 암호화하면 다음과 같은 이점을 얻을 수 있다.
공개키 암호화를 하면 개인키로만 복호화 할 수 있다. 따라서 개인키는 나만 갖고 있기 때문에 나만 데이터 정보를 볼 수 있다.
개인키를 암호화하면 공개키로만 복호화할 수 있다. 공개키는 모두에게 공개되어 있어 내가 인증한 정보임을 알려 신뢰성을 보장받을 수 있다.

Http Method

HTTP 메서드란 클라이언트와 서버 사이에 이루어지는 요청(Request)과 응답(Response) 데이터를 전송하는 방식을 뜻한다.
쉽게 말하면, 서버에 주어진 리소스에 수행하길 원하는 행동과 서버가 수행해야 할 동작을 지정하는 요청을 보내는 방법이다.

HTTP 메소드의 종류는 총 9가지가 있다. 
이 중 주로 쓰이는 메소드는 5가지다.

주요 메소드
GET - 서버로부터 정보를 요청, 데이터 조회
POST - 서버로 데이터를 전송, 데이터 생성
PUT - 서버에 데이터를 저장, 데이터 업데이트
PATCH - 데이터 부분 업데이트 ( PUT은 전체 업데이트 )
DELETE - 서버로부터 데이터 삭제

나머지 메소드
HEAD : GET 메서드와 동일하지만, 상태 줄과 헤더만 반환받음.
OPTIONS: 서버에서 지원되는 Method들을 요청(주로 CORS와 같은 보안 관련 기능에서 사용)
CONNECT: 서버와의 연결을 맺음, SSL/TLS(HTTPS)와 같은 보안 프로토콜에서 사용
TRACE: 서버로부터 전송된 요청 메시지를 다시 되돌려 받음, 디버깅 목적으로 사용

GET : 리소스 조회

GET은 버로부터 리소스를 가져와 조회하는 메서드이다.
서버에 전달하고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)을 통해서 전달한다.
예를 들어, 웹 페이지를 로드하거나 이미지를 가져오는 데 사용된다.

GET 데이터 전송 방식

GET 메서드 요청 예시

GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
  • query (쿼리 파라미터)
    GET 메서드로 요청할 때 클라이언트에서 서버로 데이터를 전송하기위해 사용하는 데이터 전송 방식. 위 GET 요청 예시에서 /serch 라는 리소스 뒤에 따라오는 q=hello&hl=ko 문자가 바로 쿼리 파라미터이다.
    쿼리 파라미터는 리소스 경로 뒤에 '?' 문자를 붙여 시작하여, Key-Value 형태로 데이터를 전송한다. 추가적인 데이터는 '&' 문자로 이어준다. 예시로, 서버에서는 쿼리 파라미터로 넘어온 데이터에서 q(KEY) 를 통해 hello(VALUE)를 가져올 수 있게 되는 것이다.
    쿼리 파라미터로 데이터를 전송하게되면 URL에 데이터가 그대로 노출되기때문에 보안에 취약하고, 따라서 쿼리 파라미터로 데이터를 전송할 땐 보통 보안에 민감하지 않은 내용을 포함시킨다.

POST : 요청 데이터 처리

POST는 요청 데이터를 처리하는 메서드이며, 한마디로 서버로 데이터를 제출한다.
주로 전달된 데이터로 신규 리소스를 등록하거나 프로세스 처리에 사용하는데, 예시로 사용자가 웹 양식을 제출하거나 데이터베이스에 새로운 항목을 추가하는 데 사용된다.
POST 메서드는 등록뿐만 아니라 데이터를 처리하는 모든 기능을 수행할 수 있다. 요청 데이터를 어떻게 처리할지 서버에서 리소스마다 따로 지정해야 하기 때문이다. 이는 서버가 정하기 나름인 것이다.

POST 메서드 사용 예시

회원가입을 통해 새로운 사용자 추가하기.
게시판, 뉴스 그룹, 메일링 리스트나 이와 유사한 시스템에 글 올리기
신규 주문 생성.
한 문서 끝에 내용 추가하기.

정리하자면, 새로운 데이터를 등록하거나 요청 데이터를 처리 할 때, 또는 다른 메서드로 처리하기 애매한 경우 POST 메서드를 사용하면 된다.

POST 데이터 전송 방식

POST 메서드 요청 예시

POST /members HTTP/1.1
Content-Type: application/json

{
 "username": "hello",
 "age": 20
}

- HTTP 메시지에서 공백 아래에 오는 데이터가 Message Body 이다.
POST 메서드에서는 Message Body에 데이터를 담아 보낸다. 
서버에서는 신규 리소스를 등록하고 생성된 리소스의 경로를 응답데이터로 반환한다. 

EX) /member/100

서버에 전달하고 싶은 데이터는 메시지 바디를 통해 서버로 요청 데이터를 전달한다. 서버에서는 이 요청 데이터를 처리하는 동작을 수행하게 된다.

PUT : 새로운 리소스를 생성 / 데이터 대체

PUT는 리소스를 완전히 대체하는 메서드이다.
요청 데이터에 해당하는 리소스가 존재하면 대체하고, 없다면 새로 생성한다. 폴더에 파일 붙여넣기 하는 것 처럼 덮어버린다고 생각하면 쉽다. 예를 들어, 파일을 업로드하거나 데이터베이스의 기존 항목을 업데이트하는 데 사용된다.

중요한 점은 요청시 클라이언트가 리소스를 알고있다는 점이다. 클라이언트가 PUT 메서드로 요청을 보낼 때 리소스의 경로를 알고 URL을 지정한다.
어떤 데이터를 대체할지를 알아야 요청을 보낼 수 있으므로 당연하지만, POST 메소드와는 클라이언트가 등록될 리소스의 경로를 모른다는 점에서 차이가 있다.

PUT 데이터 전송 방식

PUT 메서드 요청 예시

PUT /members/100 HTTP/1.1
Content-Type: application/json

{
 "username": "hello",
 "age": 20
}

서버에 전달하고 싶은 데이터는 메시지 바디를 통해 서버로 요청 데이터를 전달한다.
서버에서는 /member/100 이라는 경로의 데이터를 요청의 데이터로 완전히 대체하거나 새로 등록한다. 따라서, PUT 메서드는 몇번을 수행하더라도 결과가 같다(멱등성).
그러나 '완전히 대체한다'는 의미는 기존 데이터를 삭제 후 새로 등록하는 것과 같기 때문에 기존 데이터의 손실이 있을 수 있다.

PATCH : 부분 대체

PATCH는 리소스를 일부분만 업데이트하고 대체하는 메서드이다.
기능적으로는 PUT과 유사하지만 PUT은 기존 데이터를 완전히 대체 하고, PATCH는 요청 데이터만 부분적으로 변경한다.

PUT 과 PATCH 의 차이점

PATCH 메서드 요청 예시

PATCH /members/100 HTTP/1.1
Content-Type: application/json 

{
 "age": 50 
}

예를 들어, member/100 리소스에 "username" : "Lee", "age" : 20 이라는 데이터가 저장되어있다고 가정해보자.
위와 같이 PATCH 메서드로 해당 리소스 경로에 "age" : 50 데이터를 보내면 "age" 필드의 값만 변경되기 때문에 최종적으로 "username" : "Lee", "age" : 50 의 데이터를 가지게 된다.
반면 PUT 메서드는 방금과 같은 상황에서 기존 리소스를 완전히 대체하기 때문에 "age" : 50 의 데이터만 남게 됩니다. 기존 "username" 필드는 삭제된 것이다.

<예시에서 요청에 대한 최종 데이터>

PUT
[기존] "username" : "Lee", "age" : 20
[요청 후] "age" : 50
PATCH
[기존] "username" : "Lee", "age" : 20
[요청 후] "username" : "Lee", "age" : 50

DELETE : 리소스 삭제

DELETE는 리소스를 제거하는 메서드입니다. 요청 리소스 경로의 데이터를 삭제한다.
예를 들어, 데이터베이스의 특정 항목을 삭제하거나 파일을 삭제하는 데 사용된다.

DELETE 메서드 요청 예시

DELETE /members/100 HTTP/1.1
Host: localhost:8080

한 줄 예시)

회원 목록 조회 : /members - GET
회원 조회 : /members/{id} - GET
회원 등록 : /members/{id} - POST
회원 수정 : /members/{id} - PATCH & PUT
회원 삭제 : /members/{id} - DELETE

profile
코(딩)린 벨로그

0개의 댓글