WEB

[Web 기초] HTTP (Hypertext Transfer Protocol)

728x90

정의

웹에서 데이터를 주고 받기 위해 서버/클라이언트 모델을 따르는 통신규약

 

특징

모든 사용자의 요청마다 연결과 해제의 과정을 거치기 때문에 연결 상태가 유지되지 않고, 연결 해제 후에 상태 정보가 저장되지 않는다 (서버의 자원을 절약하기 위함)
  • 비연결성 Connectionless
    • 서버는 클라이언트와 연결을 유지하지 않아 최소한의 자원만 사용할 수 있음 (빠른 속도)
    • TCP/IP 연결을 매번 새로 맺어야 함 (3 way handshake 시간) ⇒ HTTP 지속 연결(Persistent Connection) 으로 해소
  • 무상태성 Stateless
    • 상태 유지 - Stateful : 항상 같은 서버가 유지되어야 한다. (서버 장애에 취약)
    • 무상태 - Stateless : 아무 서버나 호출해도 된다. (스케일 아웃 - 수평 확장에 유리)
    • 단순한 서비스 소개 화면 설계에 좋음

이처럼 기본적으로 무상태 프로토콜인 HTTP는 상태 정보가 유지되지 않아 사용자를 식별할 수 없다.

즉, 같은 사용자가 여러 번 요청할 경우 요청마다 새로운 사용자로 인식한다.

이러한 HTTP의 비연결성과 비상태성을 보완하기 위해 서버가 클라이언트를 식별할 수 있도록 쿠키와 세션을 사용한다.

HTTP 통신 방식

Request / Response

클라이언트가 HTTP Request(요청)을 서버에 보내면 서버는 HTTP Response를 보내는 구조

클라이언트와 서버의 모든 통신은 요청과 응답으로 이루어짐

  • General : 요청 url 정보, 메소드, 상태 코드를 확인할 수 있다
  • Response Headers : 응답 헤더. 응답 온 패킷의 헤더를 확인할 수 있다. 서버의 종류, 연결 상태 등
  • Request Headers : 요청 헤더. 요청을 보낸 패킷의 헤더를 확인할 수 있다. 보낸 클라이언트의 종류, 요청한 파일의 종류 등

HTTP 요청 메서드

  • GET : 존재하는 자원에 대한 요청 (URI)
  • POST : 새로운 자원을 생성 #멱등이_아니다
  • PUT : 존재하는 자원에 대한 변경 (전체 교체)
  • PATCH : 존재하는 자원에 대한 일부 변경
  • DELETE : 존재하는 자원에 대한 삭제

  • HEAD : 서버 헤더 정보를 획득, GET과 유사하지만 Response Body를 반환하지 않음
  • OPTIONS : 서버 옵션들을 확인하기 위한 요청
  • HTTP Status Code (HTTP 상태 코드)

주요 상태 코드 

2xx - 성공

  • 200 : GET 요청에 대한 성공
  • 204 : No Content. 성공했으나 응답 본문에 데이터가 없음
  • 205 : Reset Content. 성공했으나 클라이언트의 화면을 새로 고침하도록 권고
  • 206 : Partial Conent. 성공했으나 일부 범위의 데이터만 반환

3xx - 리다이렉션

300번대의 상태 코드는 대부분 클라이언트가 이전 주소로 데이터를 요청하여 서버에서 새 URL로 리다이렉트를 유도하는 경우

  • 301 : Moved Permanently, 요청한 자원이 새 URL에 존재
  • 303 : See Other, 요청한 자원이 임시 주소에 존재
  • 304 : Not Modified, 요청한 자원이 변경되지 않았으므로 클라이언트에서 캐싱된 자원을 사용하도록 권고. ETag와 같은 정보를 활용하여 변경 여부를 확인

4xx - 클라이언트 에러

400번대 상태 코드는 대부분 클라이언트의 코드가 잘못된 경우입니다.

우리에게 브라우저에서 가장 자주 접하는 코드는 👾 404 코드 요청한 페이지를 찾을 수 없습니다.

이 404 코드는 요청한 자원이 서버에 없다는 의미입니다.

  • 400 : Bad Request, 잘못된 요청
  • 401 : Unauthorized, 권한 없이 요청. Authorization 헤더가 잘못된 경우
  • 403 : Forbidden, 서버에서 해당 자원에 대해 접근 금지
  • 404 : Not Found, 유효하지 않은 자원을 요청했거나 권한이 잘못된 경우
  • 405 : Method Not Allowed, 허용되지 않은 요청 메서드
  • 409 : Conflict, 최신 자원이 아닌데 업데이트하는 경우. ex) 파일 업로드 시 버전 충돌

5xx - 서버 에러

500번대 상태 코드는 서버 쪽에서 오류가 난 경우입니다.

  • 501 : Not Implemented, 요청한 동작에 대해 서버가 수행할 수 없는 경우
  • 503 : Service Unavailable, 서버가 과부하 또는 유지 보수로 내려간 경우

HTTP Request Headers 출력 예시

package network;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class PrintHeader {
    public static void main(String[] args) throws IOException {
        String hostname = "stackoverflow.com";
        int port = 80;

        Socket socket = null;
        PrintWriter writer = null;
        BufferedReader reader = null;

        try {
            socket = new Socket(hostname, port);
            writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
            writer.println("GET / HTTP/1.1");
            writer.println("Host: " + hostname);
            writer.println("Accept: */*");
            writer.println("User-Agent: Java"); // Be honest.
            writer.println(""); // Important, else the server will expect that there's more into the request.
            writer.flush();

            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            for (String line; (line = reader.readLine()) != null;) {
                if (line.isEmpty()) break; // Stop when headers are completed. We're not interested in all the HTML.
                System.out.println(line);
            }
        } finally {
            if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} 
            if (writer != null) { writer.close(); }
            if (socket != null) try { socket.close(); } catch (IOException logOrIgnore) {} 
        }
    }
}

References

https://joshua1988.github.io/web-development/http-part1/

https://devuna.tistory.com/23

728x90