본문 바로가기
개인공부/Web API 게임 서버 공부

배경지식 - HTTP

by 하고싶은건많은놈 2023. 4. 19.

웹 서버 방식에서는 기본적으로 HTTP 프로토콜을 사용하여 통신을 함

따라서 우선적으로 HTTP 프로토콜이 어떤 것이고, 어떤 식으로 작동하는지 알아야 할 필요가 있음

 

HTTP

Hyper Transfer Protocol의 약자로 TCP/IP 프로토콜 집합에 속함

HTTP 통신은 크게 리퀘스트(Request)와 리스폰스(Response)로 이루어져있음

  • 클라이언트에서 서버로 보내는 요청이 리퀘스트
  • 클라이언트의 요청에 대한 서버의 응답이 리스폰스

HTTP 통신은 상태를 유지하지 않는 stateless 프로토콜

  • stateless : 서버가 각 세션에 대한 값을 메모리에 저장하지 않기 때문에 클라이언트의 상태를 기억하지 못함
  • 따라서 서버가 유지해야 하는 자원의 양이 줄어듬
  • 단, 이전의 리퀘스트 및 리스폰스 정보를 기억하지 못하기 때문에 새 리퀘스트가 부여될 때마다 매번 새로운 리스폰스를 생성하는 오버헤드가 발생
  • 쿠키(Cookie)를 사용할 경우 이러한 단점을 어느정도는 해소할 수 있음

HTTP 메소드(method)

GET : 서버로부터 정보를 조회하기 위해 설계된 메소드

GET www.example-url.com/resources?name1=value1&name2=value2
  • 요청 전송시 필요한 데이터를 Body에 담는 대신 쿼리스트링을 통해 전송
  • 쿼리스트링 : URL 끝의 '?' 뒤에 존재하는 '이름=값&이름=값...' 형태를 지닌 파라미터
  • 쿼리스트링에 값들이 그대로 노출되기 때문에 보안이 필요한 경우에는 사용할 수 없음
  • 동일 요청 발생시 캐싱을 사용하기 때문에 상대적으로 전송 속도가 빠름
  • 어플리케이션이나 브라우저에 따라 일반적으로 헤더 크기에 제한이 걸려있기 때문에 간단한 데이터 요청시에만 주로 사용

 

POST : 리소스를 생성 / 변경하기 위해 설계된 메소드

POST www.example-url.com/resource
Host: ...				
Content-Type: ...
...
  • 전송해야할 데이터를 Body에 담아서 전송하기 때문에 데이터 크기의 제한이 없음
  • Content-Type에 요청할 데이터의 타입을 표기, 해당 표기가 존재하지 않을시 서버에서 데이터 타입을 유추
  • GET과는 달리 데이터가 직접적으로 표시되지는 않지만 여러 툴로 내용을 확인할 수 있기 때문에 보안이 필요한 경우 암호화 작업을 거쳐야함

 

GET vs POST : Idempotent(멱등성) 여부에 따른 성질의 차이가 존재

GET : Idempotent

  • 동일한 연산을 여러번 수행하더라도 반드시 동일한 결과가 나타나야함
  • 즉, 서버에게 동일한 요청을 전송시 동일한 응답이 반환되어야함
  • 따라서 서버의 데이터나 상태가 변경되지 않는 요청에 사용

POST : Non-idempotent

  • 동일한 연산을 여러번 수행할시 서로 다른 결과가 나타날 수 있음
  • 즉, 서버에게 동일한 요청을 전달하더라도 응답은 항상 다를 수 있음
  • 따라서 서버의 데이터나 상태가 변경되는 요청에 사용

 

PUT : 리소스를 생성 또는 갱신하기 위해 설계된 메소드

PUT www.example-url.com/resource/1
HOST: ...
Content-type: ...
...
  • 입력한 리소스가 Request-URI에 존재한다면 리소스를 수정
  • 존재하지 않고 Request-URI와 리소스가 모두 올바르다면 리소스를 새롭게 생성
  • 특정 리소스에 대한 요청이므로 리소스를 구분할 수 있는 id값을 입력해주어야함

 

POST vs PUT :  Idempotent 여부에 따른 성질의 차이가 존재

  • POST는 Non-idempotent하기 때문에 요청시마다 새로운 리소스가 생성됨
  • PUT은 Idempotent하기 때문에 요청시마다 새로운 리소스가 생성되지 않음
  • 즉, 어떤 Request-URI에 같은 리소스를 반복해서 요청하는 경우 
    • POST는 서로 다른 id를 가진 리소스가 계속해서 생성됨
    • PUT은 입력한 id에 대한 리소스가 존재하지 않을 경우 생성한 후, 이후에는 해당 리소스에 대한 갱신작업만 수행

 

DELETE : 리소스를 삭제하기 위해 설계된 메소드

DELETE www.example-url.com/resource
HOST: ...
...

 


HTTPS

HTTP에 데이터 암호화가 추가된 프로토콜

대칭키 암호화와 비대칭키 암호화를 모두 사용하여 빠른 연산 속도와 안전성을 획득함

  • 대칭키 암호화
    • 클라이언트와 서버가 동일한 키로 암호화 및 복호화를 진행
    • 연산 속도가 빠르지만 키가 노출될시 보안이 깨질 위험이 존재
  • 비대칭키 암호화
    • 한 쌍으로 구성된 공개키와 개인키로 암호화 및 복호화를 진행
    • 연산속도가 느리지만 키가 노출되어도 비교적 안전함

HTTPS 연결 과정은 다음과 같음

  1. 클라이언트가 서버로 연결 시도
  2. 서버는 공개키(인증서)를 클라이언트에 넘겨줌
  3. 클라이언트는 공개키의 유효성을 검사(개인키로 복호화)하여 세션키(대칭키) 발급
  4. 클라이언트는 세션키를 보관하며 서버의 공개키로 세션키를 암호화하여 서버로 전송
  5. 서버는 개인키로 암호화된 세션키를 복호화하여 획득
  6. 따라서 클라이언트와 서버가 동일한 세션키를 공유하므로 데이터 전달시 세션키로 암호화 및 복호화를 진행

JSON

JavaScript Object Notation의 약자로 자바스크립트의 객체 표기법이자 데이터를 표시하는 데이터 포맷의 일종

텍스트 기반이기 때문에 자바스크립트 뿐만 아니라 다양한 언어에서 사용할 수 있고 특히 서버와 클라이언트간 교류에서 많이 사용됨

즉, HTTP 통신에서 HTTP의 Body 데이터로도 사용할 수 있음 (Content-Type을 application/json으로 설정)

  • 또다른 데이터 포맷인 XML에 비해 구조가 간단하기 때문에 속도가 빠르고 가독성이 뛰어남
  • 특정 언어에 종속되지 않는 사용이 가능
  • 단, 주석처리가 불가능하며 문법 오류를 검증할 수 없음
{
	"key1" : "value1",
	"key2" : "value2",
	"array" : ["element1", "element2", "element3"],
	"object" : {
		"inkey1" : "invalue1",
		"inkey2" : "invalue2",
		"inarray" : ["inelement1", "inelement2", "inelement3"]
	}
}
  • 기본적으로 Key : Value의 구조로 이루어져있음
  • 자료형으로는 string / number / boolean / null / object / array 사용 가능

Postman이라는 프로그램을 사용하여 편리하게 json HTTP 요청을 전달할 수 있음

https://www.postman.com/ 

 

Postman API Platform | Sign Up for Free

Postman is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs—faster.

www.postman.com

 

'개인공부 > Web API 게임 서버 공부' 카테고리의 다른 글

배경지식 - Redis  (0) 2023.04.20
배경지식 - ORM  (1) 2023.04.20
배경지식 - C#  (0) 2023.04.20
배경지식 - ASP.NET  (0) 2023.04.19
배경지식 - API  (0) 2023.04.19

댓글