웹 서버 방식에서는 기본적으로 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 연결 과정은 다음과 같음
- 클라이언트가 서버로 연결 시도
- 서버는 공개키(인증서)를 클라이언트에 넘겨줌
- 클라이언트는 공개키의 유효성을 검사(개인키로 복호화)하여 세션키(대칭키) 발급
- 클라이언트는 세션키를 보관하며 서버의 공개키로 세션키를 암호화하여 서버로 전송
- 서버는 개인키로 암호화된 세션키를 복호화하여 획득
- 따라서 클라이언트와 서버가 동일한 세션키를 공유하므로 데이터 전달시 세션키로 암호화 및 복호화를 진행
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 요청을 전달할 수 있음
'개인공부 > 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 |
댓글