💡 참고자료 : 웹 개발자라면 알고 있어야 할 HTTP의 진화 과정
📌 HTTP 동작 순서
Ⅰ. 클라이언트와 서버 구조
Ⅱ. 무상태 (Stateless)
Ⅲ. 비연결 (Connectionless)
⭐ HTTP 지속연결(Persistent Connections)
- 하나의 요청에 필요한 요청들이 모두 응답될 때까지 연결 유지
- 연결을 한번만 맺고 끊기 때문에, Connectionless 방식보다 연결 횟수가 적음 → 속도가 빨라짐
ex) HTML 요청 + CSS 요청 + JS 요청 + 이미지 요청
💡 공식 스펙
📌 HTTP Message 구조
Ⅰ. HTTP 요청 메세지(Request Message)
Start Line
ex) /search?keyword=spartaHeader
(OWS : 띄어쓰기 허용) 구조 대소문자 구분 Xex) Message Body 내용, 크기, 인증, 브라우저 정보, 서버 정보 등Empty Line
필수 값Message Body
HTML, 이미지, JSON 등 byte로 표현되는 모든 데이터GET의 경우 Message Body가 지원되지 않는 경우가 많아 권장하지 않음Ⅱ. HTTP 응답 메세지(Response Message)
필수 값📚 클라이언트 - 서버 사이에 이루어지는 요청, 응답 데이터를 전송하는 방식을 뜻한다.
⭐ 주요 Method ⭐
Ⅰ. POST : 리소스 생성
Ⅱ. GET : 리소스 조회
Query String 미포함 GET의 경우 Message Body가 미지원되는 경우가 많아 권장하지 않음
Query String 포함 서버에 추가 데이터 전송시 Message Body가 아닌 Query String을 사용
Ⅲ. PUT : 리소스 덮어쓰기

기존 리소스 존재시 완전히 덮어쓰기

Ⅳ. PATCH : 리소스 부분 수정
Ⅴ. DELETE : 리소스 삭제
Ⅵ. 기타 Method
잘 사용하지 않음잘 사용하지 않음Ⅶ. HTTP Method 속성
📌 HTTP Method별 속성표 Optional : 있을 수 있다

안전성(Safe)
멱등성(Idempotent)
ex) 계좌 송금 2회, 게시판 글쓰기, 회원가입멱등하지 않으면 중복 요청을 하면 안됨ex) 요청 실패시 서버에서 자동으로 재시도ex) 도서관 책 재고 조회(실시간으로 대여 혹은 판매됨)
캐시가능성(Cacheable) : 재사용을 위해 요청에 대한 응답 저장 가능 여부
GET, HEAD 정도만 사용ex) 변경 가능성이 적은 정적자원(HTML, CSS, IMAGE, JS 등)을 주로 캐싱💡 캐시(Cache)란?
📚 이미 요청한 데이터를 다시 요청할 때마다 전송하지 않도록 웹에서 임시로 데이터를 보관하는 장소
📚 HTTP 요청에 대한 처리 상태를 응답하는 코드, Data를 함께 응답.

HTTP Status Code
1xx (정보) 👉 요청 수신 후 처리중인 상태 잘 사용하지 않음
2xx (성공) 👉 정상 처리 완료된 상태

주로 Batch 처리에서 사용ex) 설정한 시간마다 반복적으로 동작하는 특정 작업ex) 저장, 작성버튼 클릭 시3xx (리다이렉션) 👉 요청을 완료하려면 추가 행동이 필요한 상태
3xx 응답 + Location HTTP Header가 있으면 Location 위치로 리다이렉트

영구 리다이렉션 URL 영구 변경 시 기존 URL 사용 X ex) /event → /event1
301 Moved Permanently 👉 요청 메서드가 GET으로 변하고 본문이 제거될 수 있음

308 Permanent Redirect 👉 리다이렉트시 요청 메서드와 본문 유지

일시 리다이렉션 URI가 일시적으로 변경된 경우
ex) 게시글 작성 후 게시글 목록 페이지로 이동, PRG 패턴
기타 리다이렉션 캐시를 활용할 것인지에 대한 여부
💡PRG(Post, Redirect, Get) 패턴 : 게시글 작성(Post) → 응답(Redirect) → 리다이렉트 요청(Get)
PRG 패턴 미적용시 👉 새로고침을 하게되면 요청이 중복으로 처리됨
PRG 패턴 적용시 👉 새로고침을 하게되면 GET 요청을 함

ex) GET 메소드 API인데 POST로 보낼때, API 스펙 불일치, 숫자를 문자로, 문자를 숫자로 등WWW-Authenticate 헤더와 함께 인증 방법을 설명 ex) 로그인ex) 일반 유저, 관리자ex) 서버가 일정시간 다운되었다가 다시 살아난 경우
대부분 500으로 처리함서비스 이용 불가Retry-After Header 사용시 복구 소요시간 응답 가능📌 요구사항 : 게시글 관리 HTTP API 설계
💡 HTTP API 설계 - 잘못된 예시
- 게시글 생성 👉 /create/board
- 게시글 1개 조회 👉 /read/board/1
- 게시글 목록 조회 👉 /read/board-list
- 게시글 수정 👉 /update/board/1
- 게시글 삭제 👉 /delete/board/1
📌 HTTP API 설계 규칙
리소스 : 게시글board → boards📌 HTTP API 설계
성공시 상태코드 : 2xx
실패시 상태코드 : 4xx (클라이언트 문제) OR 5xx (서버 문제)
게시글 생성 👉 POST , /boards
게시글 1개 조회 👉 GET , /boards/{id}
게시글 목록 조회 👉 GET , /boards
게시글 수정 👉 PUT or PATCH , /boards/{id}
게시글 삭제 👉 DELETE , /boards/{id}
📚 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보
(Message Body 내용, 크기, 인증, 브라우저 정보, 서버 정보 등)를 전송 가능 하도록 함
(OWS : 띄어쓰기 허용) , 대소문자 구분 X💡 실제 HTTP Header 확인법
개발자도구(F12) → Network 탭 클릭 → Fetch/XHR 탭 클릭 → 우측 Header 정보
💡 참고자료 : 표준 HTTP 헤더
Ⅰ. 표현 헤더(Representation)
📌 표현 헤더의 종류
Content-Type : 형식
text/html; charset=utf-8 application/jsonContent-Encoding : 압축 방식
gzip identity : 압축하지 않음Content-Language : 언어
ex) ko는 한글 출력, en은 영어 출력Content-Length : 길이
Ⅱ. 컨텐츠 협상(Content Negotiation)
📚 클라이언트가 선호하는 표현을 요청 / 요청시에만 사용되는 Header
우선순위 존재
Quality Values 줄여서 q 값을 사용
0 ~ 1 사이의 값이 존재하며 1에 가까울수록 우선순위 높음
Value가 1인 경우 생략 가능
ex) Accept-Language: ko-KR,en-US;q=0.9,en;q=0.8
→ 서버에서 지원 가능시 우선순위 기반으로 응답 데이터 표현
q가 생략되었다면 선언된 순서대로 우선순위를 가짐
Accept: application/json, text/plain, */* → application/json ⇒ text/plain ⇒ */*
구체적으로 선언된 것이 우선순위 높음
Accpet: text/*, text/plain, text/plain;format=flowed, */*
→ text/plain;format=flowed ⇒ text/plain ⇒ text/* ⇒ */*
📌 컨텐츠 협상헤더의 종류
Ⅲ. 일반 정보
📚 단순한 정보들을 나타내는 Header
📌 일반 정보 헤더의 종류
From : 클라이언트 이메일 정보 잘 사용하지 않음
Referer : 현재 요청된 페이지의 이전 웹 페이지 주소 → 유입 경로 파악 가능요청시 사용
User-Agent : 클라이언트 애플리케이션 정보(PC, Mobile 브라우저) 요청시 사용
Server : 요청을 처리하는 ORIGIN 서버의 Software 정보 응답시 사용
Date : HTTP 요청이 발생한 날짜와 시간 응답시 사용
Ⅳ. 특별 정보
📌 특별 정보 헤더의 종류
Host : 요청한 도메인 정보 필수포함 요청시 사용
Location : 생성된 리소스 URI 응답코드 3xx , 리다이렉트 주소 응답코드 201(Created)
Allow : 허용 가능한 HTTP Method 응답코드 405 (Method Not Allowed)
ex) Allow: GET, POST
Retry-After : 다음 요청까지 대기 해야하는 시간 응답코드 503 (Service Unavailable)
Ⅴ. 인증
📌 인증 헤더의 종류
응답코드 401 (Unauthorized)Ⅵ. Cookie
📌 쿠키의 종류
Set-Cookie : 서버에서 응답시 클라이언트로 Cookie 값 전달
주의 항상 서버에 전달되니 최소한의 정보만 사용하여 트래픽을 최적화 해야 함주의 탈취 당하기 쉬우니 보안에 민감한 개인정보 등은 저장 금지Cookie : 클라이언트가 서버에서 받은 쿠키를 Cookie 헤더를 통해 전송
Secure : 해당 헤더가 적용되면 https인 경우에만 쿠키를 전송 HTTP + Secure = HTTPS
👉 기본적으로 http, https 구분하지 않고 쿠키를 전송
HttpOnly : http 전송에만 사용, 자바스크립트에서 쿠키를 접근하지 못하게 만듦
SameSite : 쿠키에 설정된 도메인이 같은 경우만 쿠키를 전송
Ⅶ. Cache
📌 캐시의 종류
Cache-Control : 응답시 사용 max-age
👉 캐시 유효 시간(초) : 유효 시간 초과시 다시 서버를 통해 데이터를 응답받고 캐시를 갱신
Cache-Control: no-cache 👉 캐시 가능한 데이터지만, 서버에 검증하고 사용
Cache-Control: no-store 👉 보안에 민감한 데이터, 캐시하지 않음
if-modified-since : 캐시로 저장된 데이터 최종 수정일 요청시 사용
Last-Modified : 데이터가 마지막으로 수정된 시간 응답시 사용
ETag : 캐시용 데이터에 날짜, 시간이 아닌 이름을 지정 요청시 사용
📚 REST를 잘 준수하는 API로 HTTP 프로토콜을 사용하여 클라이언트와 서버 간의 통신을 통해 리소스를 관리함. 리소스는 고유한 URI로 식별되며, HTTP 메서드를 통해 다양한 작업을 수행하며 요청과 응답은 일반적으로 JSON 또는 XML 형식으로 이루어짐
👉 REST 기반으로 서비스 API를 구현한 것, HTTP API를 잘 설계하는 규칙
💡 REST(Representational State Transfer)
/로 표현/ 사용 금지_가 아닌 하이픈-을 사용📌 Maturity Model (성숙도 모델) → REST의 제약 조건에 따라 API를 등급화하는 방법
Level0
모든 요청이 단일 URI로 전송POST /operation
{
"operation": "createUser",
"data": {
"name": "sparta",
"password": "codingclub"
}
}Level1
리소스에 대해 분리된 엔드포인트 보유POST /users
{
"name": "sparta",
"password": "codingclub"
}Level2
읽기 : GET 새로운 리소스 추가 : POST 기존 리소스 상태 변경 : PUT, PATCH 삭제 : DeleteHTTP Method 활용GET /users/123 // 특정 사용자 조회POST /users // 사용자 생성
{
"name": "sparta",
"password": "codingclub"
}PUT /users/123 // 사용자 정보 수정
{
"name": "java",
"password": "spring"
}DELETE /users/123 // 사용자 삭제Level3
응답 내에 링크 포함GET /users/123
{
"id": 123,
"name": "sparta",
"links": {
"self": "/users/123",
"update": "/users/123",
"delete": "/users/123"
}
}💡 HATEOAS(Hypermedia As The Engine Of Application State)
회원가입 후 회원정보 수정방법, 조회방법,
회원조회를 하면서 그다음 단계로 진행할 수 있는 또 다른 리소스에 대한 정보를 같이 알려주는 기능
📌 RESTful API 설계 시 고려사항
1. Consumer first
2. Make best use of HTTP
3. Request methods
4. Response Status
5. No secure info in URI
6. Use plurals
ex) /user -> /usersex) /users/17. User nouns for resources
8. For exceptions - define a consistent approach