HTTP란
HTTP는 클라이언트와 서버가 통신하는 방법 중 하나이다.
클라이언트가 요청을 보내면 서버가 응답을 반환한다.
요청과 응답의 구조화된 데이터를 보낼때 일반적으로 JSON 구조를 사용한다.
JSON
- JS객체 또는 여타 언어의 Map과 구조가 매우 비슷하다.
- 요청과 응답의 body에 사용되는 구조이다.
- 보낼때 string으로 변환하고 받으면 다시 JSON으로 변환한다.
- key/value짝으로 이루어져 있고 콜론을 기준으로 왼쪽이 key 오른쪽이 value가 된다.
- key는 string만 허용된다.
- value는 숫자 string, 중첩된 JSON 그리고 List등이 허용된다.
HTTP 요청의 구성 요소
- URL : 요청을 보내는 주소
- Method : 요청의 종류/타입 (GET/POST/PUT/PATCH/DELETE)
- Header : 요청의 메타데이터
- Body : 요청에 관련된 데이터
https://blog.codefactory.ai/javascript?page=1 라는 URL이 있다면
- http 또는 https 는 Scheme
- blog.codefactory.ai 까지는 Host라고 하고 ⇒Domain 이라고 부르는 영역
- javascript 는 path ⇒ 요청하는 리소스
- ?page=1 쿼리파라미터 ⇒ 요청하는 리소스에 대한 추가 정보(일반적으로 필터링에 많이 사용됨)
URL은 이렇게 구성되어 있습니다.
URL(Uniform Resource Locator)은 웹 상의 리소스를 나타내는 주소로, 우리가 브라우저에서 웹사이트에 접속할 때 입력하는 주소입니다. URL은 여러 구성 요소로 이루어져 있으며, 각각의 역할이 명확합니다. URL의 구조를 이해하면 리소스를 어떻게 찾고 요청하는지 알 수 있습니다.
URL의 기본 구성 요소
URL은 다음과 같은 형식으로 구성됩니다.
프로토콜://사용자 정보@호스트:포트/경로?쿼리#프래그먼트
각 부분에 대해 자세히 설명하겠습니다.
1. 프로토콜 (Protocol)
프로토콜은 브라우저와 서버 간의 데이터 통신 방법을 정의합니다. 주로 사용되는 프로토콜은 다음과 같습니다.
- http: Hypertext Transfer Protocol의 약자로, 기본적인 웹 통신을 수행합니다.
- https: HTTP의 보안 버전으로, 데이터를 암호화하여 전송합니다. 보안이 강화된 HTTPS가 일반적으로 사용됩니다.
- ftp: 파일 전송 프로토콜로, 서버에서 파일을 전송할 때 사용합니다.
- mailto: 이메일을 보내기 위한 프로토콜입니다.
예: https://
2. 사용자 정보 (User Info) [선택 사항]
사용자 정보는 URL에 포함될 수 있는 선택적 정보로, 사용자 이름과 비밀번호를 포함할 수 있습니다. 주로 FTP와 같은 특정 프로토콜에서 사용됩니다.
- 형식: username:password@
- 예: user:password@
3. 호스트 (Host)
호스트는 리소스를 제공하는 서버의 도메인 이름이나 IP 주소를 의미합니다. 브라우저는 이 정보를 통해 서버를 찾아 연결합니다.
- 도메인 이름: example.com
- IP 주소: 192.168.1.1
예: www.example.com 또는 127.0.0.1
4. 포트 (Port) [선택 사항]
포트는 서버에서 리소스를 요청할 때 사용할 포트를 지정합니다. 대부분의 경우 HTTP(포트 80)와 HTTPS(포트 443)와 같이 기본 포트가 설정되어 있어 생략 가능합니다. 그러나 기본 포트가 아닌 경우 명시해야 합니다.
- 예: :8080
5. 경로 (Path)
경로는 특정 리소스가 서버 내에서 위치한 경로를 나타냅니다. 파일 시스템 경로와 유사하며, 서버에서 파일이나 폴더를 찾는 데 사용됩니다. 경로는 **/**로 구분된 계층적 구조를 가질 수 있습니다.
- 예: /products/list 또는 /images/photo.jpg
6. 쿼리 (Query) [선택 사항]
쿼리는 추가적인 데이터를 전달할 때 사용됩니다. 주로 **?**로 시작하며, 여러 개의 쿼리 매개변수는 **&**로 구분됩니다. 쿼리 문자열은 서버에 특정 요청을 보내거나 검색 조건을 지정하는 데 활용됩니다.
- 형식: ?key1=value1&key2=value2
- 예: ?search=apple&type=fruit
7. 프래그먼트 (Fragment) [선택 사항]
프래그먼트는 **#**으로 시작하며, 페이지 내의 특정 위치로 이동하기 위해 사용됩니다. 프래그먼트는 주로 HTML 문서에서 특정 섹션으로 이동할 때 유용합니다.
- 형식: #section-name
- 예: #about
URL 예제 분석
다음 URL을 통해 각 구성 요소가 어떻게 적용되는지 살펴보겠습니다.
<https://user:password@www.example.com:8080/products/list?search=apple&type=fruit#details>
- 프로토콜: https
- 사용자 정보: user:password
- 호스트: www.example.com
- 포트: 8080
- 경로: /products/list
- 쿼리: ?search=apple&type=fruit
- 프래그먼트: #details
이 URL은 HTTPS 프로토콜로 www.example.com 서버의 8080번 포트를 통해 /products/list 경로에 있는 리소스를 요청하고 있으며, 쿼리 매개변수로 **search=apple**과 **type=fruit**을 전달하고 있습니다. 페이지가 로드된 후에는 #details 위치로 이동하게 됩니다.
요약
URL은 리소스를 찾기 위한 여러 정보를 포함하며, 구성 요소들은 각각의 역할이 있습니다. 이를 통해 브라우저는 적절한 서버에 연결하여 사용자가 원하는 리소스를 제공받을 수 있습니다.
Method
HTTP에서 **메서드(Method)**는 클라이언트가 서버에 요청할 작업의 유형을 정의하는 중요한 요소입니다. 메서드는 주로 HTTP 요청에 사용되며, REST API와 같은 웹 서비스를 설계할 때 필수적인 개념입니다. 메서드마다 고유한 목적과 특징이 있으며, 각각의 메서드는 서버에 데이터를 요청하거나 변경하는 방식을 결정합니다.
1. HTTP 메서드의 주요 종류
HTTP에는 여러 메서드가 존재하지만, 주로 사용되는 메서드로는 다음이 있습니다:
1) GET
- 역할: 서버로부터 리소스를 조회하는 요청입니다.
- 특징:
- 안정적(Safe): 데이터를 변경하지 않습니다.
- 멱등성(Idempotent): 동일한 요청을 여러 번 보내도 결과가 같습니다.
- 캐시 가능: 브라우저가 GET 요청의 응답을 캐시할 수 있습니다.
- 사용 예: 웹페이지 로드, 데이터 조회
- 예제: GET /api/products
2) POST
- 역할: 서버에 새로운 리소스를 생성하거나 데이터를 전송하는 데 사용됩니다.
- 특징:
- 안정적이지 않음: POST 요청은 서버의 데이터를 변경할 수 있습니다.
- 멱등성 보장 안됨: 같은 요청을 여러 번 보내면 리소스가 중복으로 생성될 수 있습니다.
- 사용 예: 사용자 등록, 데이터 제출, 주문 생성
- 예제: POST /api/users
3) PUT
- 역할: 서버의 리소스를 완전히 대체하거나 업데이트합니다.
- 특징:
- 멱등성: 같은 PUT 요청을 여러 번 보내도 결과는 동일합니다.
- 전체 리소스를 새 데이터로 대체하는 방식이므로 모든 필드를 포함해야 합니다.
- 사용 예: 프로필 수정, 데이터 업데이트
- 예제: PUT /api/users/123
4) PATCH
- 역할: 서버의 리소스를 부분적으로 수정합니다.
- 특징:
- 멱등성: 동일한 요청을 여러 번 보내도 결과가 같습니다.
- 전체 리소스가 아닌, 일부 필드만 업데이트할 때 사용됩니다.
- 사용 예: 특정 필드의 업데이트(예: 이메일 변경)
- 예제: PATCH /api/users/123
5) DELETE
- 역할: 서버의 리소스를 삭제합니다.
- 특징:
- 멱등성: 동일한 DELETE 요청을 여러 번 보내도 삭제는 한 번만 발생합니다.
- 사용 예: 데이터 삭제(게시물, 계정 등)
- 예제: DELETE /api/users/123
6) HEAD
- 역할: GET 요청과 유사하게 리소스를 요청하나, 헤더 정보만 반환하고 본문은 포함하지 않음.
- 특징:
- 주로 리소스의 존재 유무를 확인하거나, 응답의 메타 데이터(예: 파일 크기, 콘텐츠 타입)를 확인하는 데 사용됩니다.
- 사용 예: 캐싱 제어, 리소스 상태 확인
- 예제: HEAD /api/products/123
7) OPTIONS
- 역할: 서버에서 지원하는 메서드의 옵션을 확인합니다.
- 특징:
- 특정 리소스에 대해 사용할 수 있는 HTTP 메서드 목록을 반환합니다.
- 주로 CORS 설정 시 어떤 메서드가 허용되는지 확인하는 데 사용됩니다.
- 사용 예: CORS 사전 요청
- 예제: OPTIONS /api/products
2. 메서드의 멱등성과 안전성
- 멱등성: 같은 요청을 여러 번 보내도 결과가 같음을 의미합니다. 예를 들어, **PUT**이나 **DELETE**는 같은 요청을 반복해도 서버의 상태가 변하지 않기 때문에 멱등성을 가집니다.
- 안전성: 서버의 데이터를 변경하지 않음을 의미합니다. GET, HEAD, **OPTIONS**는 서버 데이터를 수정하지 않으므로 안전한 메서드입니다.
3. 메서드와 REST API
REST API에서는 각 메서드를 HTTP 상태 코드와 함께 적절하게 사용하여 클라이언트가 서버 리소스와 효율적으로 상호작용할 수 있도록 합니다. 예를 들어:
- GET은 주로 200 OK로 성공을 나타내며, 서버의 데이터 조회 시 사용됩니다.
- POST는 리소스 생성에 사용되며, 성공 시 보통 201 Created 상태 코드와 함께 새 리소스 위치를 반환합니다.
- PUT과 PATCH는 리소스 업데이트에 사용되며, 200 OK 또는 204 No Content로 성공을 알립니다.
- DELETE는 리소스 삭제 후 204 No Content 또는 200 OK로 응답합니다.
요약
HTTP 메서드는 클라이언트가 서버에 요청할 작업을 명확히 정의하며, 각각의 메서드는 고유한 목적과 특징이 있습니다. 메서드를 올바르게 사용하는 것은 서버와 클라이언트 간의 명확한 데이터 처리와 상호작용을 보장하며, RESTful 설계에 중요한 역할을 합니다.
Header란 무엇인가
Header는 메타데이터를 정의한다.
메타데이터는 데이터에대한 데이터 즉, 요청에 대한 정보를 정의한다.
흔한 예제로 Cookie, 인증 토큰, 요청의 바이트 길이, 요청/응답을 보낸 HOST, 요청을 할때 사용된 클라이언트 타입과 버전 등을 정의한다.
key/value 형태로 정의되고 key와 Value 모두 String 형태이다.
라이브러리/프레임워크/환경에 의해 자동으로 생성되는 값들이 많고 직접 값을 변경하는 경우 Body보단 상대적으로 적다.
Body란 무엇인가
Body는 요청에 대한 로직 수행에 직접적으로 필요한 정보를 정의한다.
만약에 새로운 블로그 글에 생성하는 POST요청을 한다면 이 글을 생성할때 필요한 제목, 내용등의 모든 데이터를 Body에 입력하게 된다.
일반적으로 JSON 구조를 사용한다.
Header와 가장 큰 차이점은 Header는 요청 자체에 대한 정보를 담고 있고 Body는 요청을 수행하는데 필요한 데이터를 담고 있다는 것이다.
Status Code
- 100~599 까지의 숫자를 사용한다.
- 100~199 정보응답
- 200~299 성공 응답
- 300~399 리다이렉션 메세지
- 400~499 클라이언트 에러 응답(프론트 에러)
- 500~599 서버 에러 응답(서버 에러)
자주보는 스테이터스 코드
- 200(OK) ⇒ 문제없이 요청이 잘 실행됨
- 201(Created) ⇒ 문제없이 데이터 생성이 잘 됨 (POST 요청에서 많이 사용)
- 301(Moved Permanently) ⇒ 리소스가 영구적으로 이동됨
- 400(Bad Request) ⇒ 요청이 잘못됨(필수 값 부족 등)
- 401(Unauthorized) ⇒ 인증 토큰 / 키가 잘못됨
- 403(Forbidden) ⇒ 접근이 불가능한 리소스. 401과 달리 인증은 된 상태
- 404(Not Found) ⇒ 존재하지 않은 리소스.
- 405(Method Not Allowed) ⇒ 허가되지 않은 요청 Method
- 500(Internal Server Error) ⇒ 알 수 없는 서버 에러
'Network' 카테고리의 다른 글
OSI 7계층 정리 (1) | 2024.10.24 |
---|