HTTP(Hyper Text Transfer Protocol)
-웹 상에서 클라이언트와 서버 간 통신을 위한 프로토콜이다.
-요청(request)과 응답(response)으로 구성되어 있으며, 기본적으로 80번 port(각 프로토콜의 데이터가 오고가는 통로)를 사용한다.
-예를 들어 클라이언트(웹 브라우저)가 HTTP를 통해 서버에 정보를 요청하면, 서버는 클라이언트에게 맞는 정보를 보내줌.
iOS 개발자가 HTTP를 알아야 하는 이유
1. 웹 서비스 및 API와의 통신
대부분의 앱들이 웹 서비스 또는 API를 사용하여 원격 서버에서 데이터를 가져오거나 서버로 데이터를 전송하는 작업들을 하고 있다.
HTTP를 이해하면 개발자가 적절한 HTTP 요청을 실행해서 서버에서 리소스를 만들고, 읽고, 업데이트하고, 삭제 할 수 있다.(CRUD)
2. 에러 처리 및 문제해결
요청 및 응답의 구조, 상태 코드 및 헤더를 포함하여 HTTP의 작동 방식을 알면 개발자가 앱의 문제를 보다 효율적으로 식별하고 해결할 수 있다. 네트워크 관련 문제를 디버깅하고 성능을 최적화하는데 도움이 된다.
3. 보안 및 인증
클라이언트와 서버 간 전송되는 데이터가 안전한지 확인하려면 HTTP를 파악하는 것이 필수!
개발자는 HTTPs를 사용하여 보안 통신을 구현하고, API 키 또는 토큰으로 인증을 관리하고, 민감한 사용자 데이터를 적절하게 처리하는 방법을 이해해야 한다.
4. 캐싱 및 성능 최적화
캐시 제어 헤더 및 ETag와 같은 HTTP 캐싱 메커니즘을 이해하면 개발자가 대기 시간과 네트워크 트래픽을 줄여 앱의 성능을 최적화 할 수 있다. 사용자 경험을 개선시키고, 서버 부하를 줄여주는 효과를 가져옴.
5. 네트워킹 라이브러리 및 도구
iOS 개발에서 네트워킹을 위한 라이브러리(URLSession, Alamofire 등) 및 도구(Postman 등)를 효과적으로 사용하려면 HTTP 요청 및 응답이 작동하는 방식을 이해하는 것이 중요하다.
HTTP 구조
-HTTP는 요청(request)과 응답(response)으로 구성되어 있다.
클라이언트가 서버에 요청을 하고, 서버에서 요청에 대한 응답을 보내주는 구조.
HTTP 특징
-HTTP는 상태가 없는(stateless) 프로토콜이다. 이것은 "상태를 저장하지 않는다" 는 뜻과 동일하며, 각각의 요청과 응답이 독립적으로 발생된다는 것이다.
예를 들면 클라이언트가 요청을 보내고, 서버에서 응답을 받았다. 잠시 후 다시 클라이언트가 요청을 보낼 때 이전에 통신했던 요청과 응답에 대해서는 알지 못하는 것이다.
이는 비연결식이라고도 말하며, 요청과 응답에 대한 진행과정이나 해당 데이터가 필요할 경우에는 쿠키나 세션 등을 사용한다.
HTTP Request(요청)
-HTTP 요청은 클라이언트가 서버로 보내는 메세지로, 특정 작업이나 정보를 요청한다.
-HTTP 요청 메세지는 크게 3부분으로 나뉜다. (Start line, Headers, Body)
HTTP의 요청 메세지의 예시
GET /index.html HTTP/1.1 //Start Line
Host: www.example.com //여기서부터 Headers
Content-Type: application/json
Content-Length: 257 //예시임. 원래 없어야함
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
1. Start Line
GET /index.html HTTP/1.1
-HTTP 메서드, 대상 URI, HTTP 버전을 포함하는 요청의 시작줄이다.
-GET 부분은 HTTP 메서드가 들어가는 자리로 해당 request가 의도하는 action을 정의한다.
-index.html 부분은 대상 URI로 해당 request가 전송되는 목표를 정의한다.
-HTTP/1.1 부분은 사용되는 HTTP 버전을 정의한다.
2. Headers
Host: www.example.com
Content-Type: application/json
Content-Length: 257 //예시임. 원래 없어야함
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
-헤더는 해당 request에 대한 추가 정보를 담고 있는 부분이다.
-Key : Value 값으로 되어 있다. ( : 이 사용된다. )
-헤더도 크게 3부분으로 나누어져 있다.(general headers, request headers, entity headers)
-Host
요청이 전송되는 target의 host url
-Content-Type
해당 요청이 보내는 메세지 body의 타입을 말한다. application/json은 JSON 타입을 말함.
-Content-Length
해당 요청이 보내는 메세지 body의 길이를 말한다.
-User-Agent
요청을 보내는 클라이언트에 대한 정보를 말한다. 예를 들면 웹 브라우저에 대한 정보
-Accept
해당 요청이 받을 수 있는 response타입을 말한다.
3. Body
-바디는 해당 요청 메세지의 본문이다.
-바디는 선택사항으로 GET request 메세지에는 바디가 없는 경우가 일반적임.
ex) POST 메서드로 Body 예시
POST /api/register HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 89
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
//Body 부분
{
"username": "johndoe",
"email": "johndoe@example.com",
"password": "securepass123"
}
HTTP Response(응답)
-요청된 작업의 결과 또는 요청된 정보를 포함하는 서버에서 클라이언트로 보내는 메세지이다.
-HTTP 응답 메세지도 3가지 구조로 되어있다. (status line, headers, body)
HTTP 응답의 예시
HTTP/1.1 200 OK //Status Line
Date: Wed, 29 Mar 2023 10:00:00 GMT //여기서부터 Headers
Server: Apache/2.4.38 (Debian)
Content-Type: text/html; charset=UTF-8
Content-Length: 180
//Body
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Example Page</title>
</head>
<body>
<h1>Welcome to the example page!</h1>
<p>This is a simple HTML file.</p>
</body>
</html>
1. Status Line
-응답의 상태를 간략하게 나타내준다.
-요청 메세지의 Start Line과 동일하게 3부분으로 나뉜다.
-HTTP/1.1는 요청 메세지에서도 보았듯이 HTTP 버전을 나타낸다.
-숫자 "200" 은 Status code로 응답 상태를 코드로 나타낸 것이다.
-문자열 "OK" 는 Status text로 응답 상태를 문자열로 간략하게 설명해주는 부분이다.
2. Headers
-요청 메세지의 Headers와 동일하게 응답에 대한 메타데이터를 제공한다.
-Date
날짜를 제공함.
-Server
응답을 생성하는데 사용되는 서버 소프트웨어에 대한 정보를 제공하는 헤더.
Apache부분은 서버, 2.4.38는 버전, Debian은 운영체제를 말한다.
-Content-Type
해당 응답 메세지 본문의 타입을 말하며 UTF-8인코딩의 HTML 문서가 포함되어 있음을 나타낸다.
-Content-Length
해당 응답 메세지 본문의 길이를 바이트 단위로 지정한 것.
3. Body
-요청 메세지의 바디와 동일하게 클라이언트가 요청한 결과물을 나타낸다.
-요청과 마찬가지로 모든 응답 메세지가 Body를 가지고 있지 않음.
Status Code (상태 코드)
-HTTP Response 메세지의 Status Line에서 Status code를 보았죠?
Status code에는 무엇이 있고, 어떤 의미를 담고있는지 몇 가지만 알아봅시다.
-네트워크 통신 중 나타나는 오류들.
1XX (조건부 응답) - 요청을 받았으며 작업을 계속한다.
2XX(성공) - 클라이언트가 요청한 동작을 성공적으로 처리했음을 말한다.
3XX (리다이렉션 완료) - 클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.
4XX (요청 오류) - 클라이언트에 오류가 있음.
5XX (서버 오류) - 서버가 유효한 요청을 명백하게 수행하지 못했음.
200번 - 정상
201번 - 생성
301번 - 해당 URI가 다른 주소로 바뀌었을 때 보내는 코드
400번 - 잘못된 요청. 예를들어 요청에 포함된 input 값들이 잘못된 값들로 보내졌을 경우 등
401번 - 권한 없음 - 요청을 하려면 로그인이나, 회원가입을 해라 등
404번 - 찾을 수 없음 - 요청된 URI가 존재하지 않는다.
500번 - 내부 서버 오류 - 말 그대로 서버에서 오류가 발생했을 때 사용되는 코드
일반적인 HTTP의 메서드
1. GET
데이터를 조회하는데 사용하는 메소드
데이터를 생성, 수정, 삭제하지 않고, 서버에서 검색을 하는데 사용된다.
GET 요청에는 부작용이 없는 작업만 있어야 하므로 서버에서 데이터의 상태를 변경하지 않는다.
2. POST
데이터를 생성, 수정, 삭제하는 경우에 주로 사용되는 메서드.
메세지 바디를 통해 처리할 데이터를 서버로 전송하여 일반적으로 새 데이터를 만들거나, 기존 데이터를 업데이트 한다. 예를 들어 새로운 유저 계정 만들기 등이다.
POST 요청은 부작용이 있을 수 있으며 서버에서 데이터의 상태를 변경할 수 있다.
POST 메서드로 PUT, DELETE 메서드를 대체할 수 있음.
3. PUT
데이터를 생성할 때 사용되는 메서드
만일 요청 메세지에 있는 데이터가 서버에 없는 데이터라면 새로 생성하고, 서버에 있는 데이터라면 덮어쓴다.
4. DELETE
데이터를 삭제할 때 사용되는 메서드
5. HEAD
GET과 유사하다. GET처럼 요청한 데이터에서 본문이 아닌 헤더에 해당하는 부분만 요청한다.
보통 응답의 상태 코드만 확인하고 싶을 때 사용함. (응답 헤더를 보면서 해당 리소스가 수정되었는지 확인.)
6. PATCH
데이터의 일부분을 변경하는 메서드이다.
PUT은 전체 데이터를 변경했지만, PATCH는 변경하고 싶은 부분만 변경을 할 수 있다.
7. OPTIONS
예비 요청에 사용되는 메서드. 예비 요청이란 본 요청을 하기 전에 안전한지 미리 검사해보는 것
8. TRACE
서버에게 요청했던 요청내용을 원할 때 사용되는 메서드. OPTIONS처럼 검사용으로 사용되는 메서드다.
클라이언트의 요청 패킷이 방화벽, Proxy 서버, Gateway 등을 거치면서 변조가 일어날 수 있는데, 서버에 도달했을 때 최종적인 패킷의 내용을 요청하는 것이다.
요청했던 패킷과 최종적으로 도달한 패킷의 내용을 비교하여 변경된 점이 있는지 확인한다.
Reference
-프런트엔드 개발자가 알아야하는 HTTP 프로토콜 Part 1 • 캡틴판교 (joshua1988.github.io)
'강의 정리' 카테고리의 다른 글
WWDC2021 - ARC in Swift - Basics and beyond 에 관하여. (0) | 2023.05.31 |
---|---|
앱으로 문제 해결하는 순서와 방법(강의 정리) (0) | 2023.05.27 |
그런 REST API로 괜찮은가 (1) | 2023.03.19 |
IOS 개발자 로드맵 정리 (0) | 2022.10.03 |
TCP/IP (Transmission Control Protocol/Internet Protocol) (0) | 2022.09.29 |