HTTP
HyperText Transfer Protocol
- HTTP란 Hypertext Transfer Protocol의 약자로, 텍스트를 기반으로 한 데이터를 주고 받기 위해 만들어진 통신 규약을 뜻한다.
프로토콜, 즉 규약을 정해두었기 때문에 사람들은 이 규약에 맞춰 개발하고, 그 덕분에 우리는 이 규약에 맞춰 서로 정보를 쉽게 교환할 수 있게 되었다.
Hypertext: In computing, hypertext is a way of connecting pieces of text so that you can go quickly and directly from one to another.
- HTTP 동작은 요청과 응답으로 이루어져있다.
요청(Request): 클라이언트(Client) -> 서버(Server)
응답(Response): 서버(Server) -> 클라이언트(Client)
- HTTP 응답의 결과로는 plain text, HTML, json, xml 등 다양한 형태의 데이터가 있다.
- HTTP는 연결 상태를 유지하지 않는 비연결성(Connectionless) 프로토콜이다.
비연결성 프로토콜이란, 클라이언트가 서버에게 한 번 연결을 맺고 요청을 보낸 뒤, 서버가 요청에 대한 응답을 보내면 곧바로 연결을 끊어버리는 것을 의미한다.
HTTP는 불특정 다수를의 통신 환경을 기반으로 설계되었기 때문에 서버와 클라이언트가 계속해서 연결을 유지한다면 많은 리소스가 필요하다. HTTP는 이러한 리소스를 줄이는 대신 더 많은 사용자와 통신을 연결하기 위해 비연결적인 특징을 선택했다.
연결을 유지하기 위한 리소스를 줄이는 대신 HTTP는 같은 사용자와 연결할 때에도 매번 새로운 연결을 시도하고 해제해야 하기 때문에 연결 / 해제에 따른 오버헤드가 발생할 수 있다.
오버헤드(Overhead): 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등
이에 대한 해결책으로 HTTP의 KeepAlive 속성을 사용할 수 있다. KeepAlive란, 특정 시간 동안 클라이언트와 서버 사이에 패킷 교환이 이루어지지 않을 경우, 클라이언트의 상태를 체크하기 위해 서버가 주기적으로 클라이언트에 패킷을 보내는 방법이다. 이때, 서버가 보낸 패킷에 반응이 없으면 연결이 끊어진다.
- HTTP는 클라이언트를 식별할 수 없는 무상태(Stateless) 프로토콜이다.
HTTP는 불특정 다수와의 통신 환경을 기반으로 설계되었기 때문에 클라이언트를 식별할 수 없다. 즉, 같은 클라이언트가 요청을 보내도 매번 클라이언트를 식별하기 위한 인증 절차가 필요하다는 의미다.
Ex. 특정 사이트에서 로그인 정보가 유지되지 않음
이를 해결하기 위해 쿠키(Cookie), 세션(Session), 토큰(Token) 등의 방법을 사용할 수 있다.
- 쿠키(Cookie)
쿠키는 서버가 클라이언트에 보내는 작은 데이터 조각으로, 클라이언트는 해당 데이터를 저장해두었다가 동일한 서버에 재요청시 쿠키를 Request-Header에 넣어 함께 보낸다.
HTTP 요청이 같은 브라우저에서 온 것인지 확인할 때 주로 사용된다. 이를 이용해 사용자의 로그인 상태를 유지시키기도 한다.
쿠키는 주로 세션 관리(로그인, 장바구니, 게임 스코어 등의 정보 저장), 개인화(사용자 선호, 테마 등의 세팅), 트래킹(사용자의 행동을 기록하고 분석) 등을 위해 사용된다.
쿠키는 클라이언트의 상태와 정보를 클라이언트 본인 컴퓨터 메모리에 저장하고 필요할 때 참조, 재사용한다. 때문에 보안에 취약하다는 단점이 있다.
- 세션(Session)
세션이란 사용자가 서버에 처음 요청을 보낸 시간부터 연결을 끝내는 시점까지, 한 클라이언트로부터 오는 일련의 요청을 하나의 상태로 보고 그 상태를 유지하는 기술을 뜻한다.
클라이언트가 서버에 처음 요청을 보낼 때는 세션ID가 없기 때문에 서버가 고유한 세션ID를 생성해서 저장 후 클라이언트에게 전달한다. 후에 클라이언트는 HTTP 요청을 보낼 때 서버에게서 받은 세션ID를 함께 보내고, 서버에서는 이를 통해 클라이언트를 식별한다.
세션은 쿠키와 달리 클라이언트의 상태와 정보를 서버에 저장한다. 때문에 쿠키보다 보안이 높다는 장점이 있지만, 반대로 세션이 서버에 저장되기 때문에 서버의 메모리를 차지하게 되고, 동시 접속자가 많은 서비스일 경우 서버 과부화의 원인이 될 수 있다.
- 토큰(Token)
쿠키와 세션의 문제점을 해결하기 위해 도입된 인증 방식으로, 누군가 통신 중간에 데이터를 탈취하여 중요한 데이터를 취득하는 것을 막기 위해 보호할 데이터를 토큰으로 치환하여 원본 데이터 대신 토큰을 사용해 통신하는 방법이다.
중간에 외부 공격자로부터 공격을 당하더라도 원본 데이터를 알 수 없기 때문에 보안이 뛰어나다는 장점이 있다.
대표적인 토큰으로는 Oauth와 JWT가 있다.
- HTTP 요청 메서드(Request Method)
클라이언트가 서버로 요청을 보낼 때, 어떤 목적을 가지고 있는지 명확히 하기 위해 method를 지정하는 것.
GET: 서버에 리소스를 요청할 때 (Read)
POST: 서버에 리소스의 생성을 요청할 때 (Create)
PUT: 서버에 리소스의 수정을 요청할 때 (Update)
DELETE: 서버에 리소스의 삭제를 요청할 때 (Delete)
- HTTP 응답 코드(Response Code)
HTTP 요청에 대한 응답 상태는 코드를 통해 손 쉽게 알 수 있다. 대략적인 코드를 살펴보면 다음과 같다.
100 - 109: 요청을 받았으며 프로세스를 계속 진행한다.
200 - 206: 요청을 성공적으로 받았으며 성공적으로 응답했다.
300 - 305: 요청 완료를 위해 추가 작업 조치가 필요하다. (주로 리다이렉션)
400 - 415: 요청의 문법이 잘못되었거나 요청을 처리할 수 없다. (클라이언트측 에러)
500 - 505: 요청을 처리하는 과정에서 오류가 발생해 요청을 처리할 수 없다. (서버측 에러)
'Computer Science' 카테고리의 다른 글
[운영체제] 프로세스(Process)와 스레드(Thread) (0) | 2021.10.21 |
---|---|
[자료구조] 스택(Stack)과 큐(Queue), 배열(Array)과 연결 리스트(Linked List) (0) | 2021.10.14 |
객체 지향 프로그래밍(OOP) (0) | 2021.10.07 |