웹의 이해
💻
1. HTTP란?
HTTP는 OSI 7계층에 속하는 프로토콜로 우리가 흔히 아는 웹페이지에 접속할때 사용하는 프로토콜이다.
📌 URL
웹 리소스에 접근하기 위해서 사용하는 주소로, 인터넷 상에서 리소스를 식별하고 위치를 지정하는 역할을 한다.
프로토콜://호스트이름:포트번호/경로?파라미터
ex) http://example.com/login.jsp?id=test
프로토콜 : http://또는 https://로 시작하고, URL에서 사용하는 프로토콜을 나타낸다.
호스트이름 : 도메인이름 또는 IP주소를 통해 서버의 위치를 지정한다.
포트번호(선택사항) : 요청이 전송되는 네트워크의 포트를 지정. 기본적으로 생략가능하며, 생략 시 HTTP는 80, HTTPS는 443포트를 사용한다.
경로 : 서버의 리소스를 식별하기 위한 경로이다.
파라미터 : 파일에 전달되는 값을 뜻한다.
2. HTTP 구조
클라이언트와 서버 간의 요청 및 응답을 통해 데이터를 전송하는 프로토콜은 요청(Request)와 응답(Response) 메시지로 구성되어 있다.
📌 HTTP Request 구조
클라이언트가 서버에게 리소스를 요청할 때 사용된다.
1) 요청 줄 (Reuest Line)
Method : 요청의 동작을 정의
URL : 요청 리소스의 경로
HTTP 버전 : HTTP 프로토콜의 버전(예: HTTP/1.1, HTTP/2)
Method | 설명 |
GET | 서버에서 특정 리소스를 조회할 때 사용 |
POST | 서버에 데이터를 전송하고 처리 요청을 할 때 사용 |
PUT | 서버에 지정된 리소스를 생성하거나 기존 리소스를 완전히 교체 |
DELETE | 서버에서 특정 리소스를 삭제 |
HEAD | GET요청과 동일하지만, 응답 본문을 제외하고 헤더 정보만 반환 |
OPTIONS | 특정 URL에서 사용할 수 있는 매소드 목록을 확인 |
PATCH | 서버의 기존 리소스의 일부를 수정 |
TRACE | 요청이 서버까지 도달하는 경로를 테스트하기 위해 사용 |
CONNECT | 프록시 서버를 통해 TCP 터널을 설정 |
Method 중에서 가장 많이 사용되는 GET과 POST 비교이다.
항목 | GET | POST |
목적 | 데이터 조회 | 데이터 전송, 생성 |
데이터 전달 위치 | URL의 쿼리 문자열 | HTTP 요청 Body |
데이터 크기 제한 | URL 길이 제한 존재 (2,048자 등 브라우저/서버에 따라 다름). | 사실상 데이터 크기 제한 없음 (서버 설정에 따름). |
보안 | 데이터가 URL에 노출됨. | 데이터가 URL에 노출되지 않음. (HTTPS 사용 시 더 안전) |
캐싱 가능성 | 기본적으로 캐싱 가능. | 기본적으로 캐싱되지 않음. |
북마크 가능성 | URL에 데이터가 포함되어 있으므로 가능. | 본문 데이터를 전송하므로 불가능. |
반복 요청 처리 *** Idempotent(멱등성): 동일 요청 여러 번 보내도 동일한 결과. |
멱등성 보장 | 멱등성이 보장되지 않을 수 있음. |
속도 | 상대적으로 빠름. | 상대적으로 느림. |
2) 헤더(Header)
요청의 추가 정보를 전달
Host: 응답을 요청하는 호스트
User-Agent: 응답 내용에 대해 응답할 수 있는 브라우저의 종류
Accept: 클라이언트가 처리 가능한 콘텐츠 유형을 서버에 알림
Accept-Encoding : 클라이언트가 지원하는 압축 방식을 지정
Accept-Language: 응답에 대해 선호하는 언어
Authorization : 서버에 인증 정보를 전달
Cookie: 클라이언트가 서버에 쿠키 데이터를 전달
Referer: 요청을 보낸 이전 페이지의 URL
Content-Type : 요청 본문의 MIME 타입을 지정
MIME은 클라이언트와 서버 간 데이터의 콘텐츠 유형을 지정하는데 사용됩니다. HTTP 요청 또는 응답의 Content-type 헤더를 통해 MIME의 타입이 전달된다.
[MIME 타입의 구조]
type/subtype
📕 type : 콘텐츠의 주요 카테고리를 나타낸다.
📕 subtype : 콘텐츠의 세부 유형을 나타낸다.
1. text/ 텍스트 데이터와 관련된 콘텐츠
예) text/plain : 일반 텍스트, text/html : HTML 문서
2. image/ 이미지 파일
예) image/png : PNG 이미지, image/jpeg : JPEG 이미지
3. audio/ 오디오 파일
예) audio/mp3 : mp3파일
4. video/ 비디오 파일
예) video/mp4 : mp4파일
5. application/ 구조화된 데이터 또는 실행 가능한 콘텐츠
예) application/json : JSON 데이터, application/xml : XML 데이터, application/zip : ZIP 압축 파일
6. multipart/ 여러 개의 다른 MIME 타입 데이터를 포함하는 콘텐츠. 일반적으로 파일 업로드 같은 상황에서 사용된다.
예) multipart/form-data : HTML 양식의 데이터, multipart/alternative : 여러 표현의 이메일 메시지
7. message/ 메시지와 관련된 MIME 타입
예) message/rfc822 : 이메일 메시지
8. font/ 폰트 파일
예) font/woff : WOF 폰트 파일
Content-Length :요청 본문의 길이를 바이트 단위로 지정
Content-Encoding : 요청 본문이 압축되었음을 나타냄
Cache-Control : 클라이언트 또는 서버가 요청에 대해 캐싱 동작을 지정
If-Modified-Since : 지정된 날짜 이후에 변경된 리소스만 요청
ETag : 서버가 리소스의 특정 버전을 식별하는 태그
Connection : 연결 유지 여부를 나타낸다.
Proxy-Connection: 프록시 연결을 사용
3) 빈줄(CRLF)
헤더와 본문을 구분하는 빈줄(\r\n)
4) 본문(Body)
POST, PUT 등의 Method에서 요청 데이터를 포함
✔ GET 요청 예시 :
GET /login.jsp?id=test&password=1234 HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: sessionId=abc123; theme=light
✔ POST 요청 예시 :
POST /login.jsp HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
Connection: keep-alive
Cookie: sessionId=abc123; theme=light
id=test&password=1234
📌 HTTP Response 구조
1) 상태 줄(Status Line)
HTTP 버전 : 사용하는 HTTP 프로토콜 버전
상태 코드(Status Code) : 요청 처리 결과를 나타내는 숫자
상태 메시지(Status Message) : 상태 코드를 설명하는 텍스트 메시지
1xx 정보제공 100 Continue 요청이 초기 검증을 통과했으며, 계속 진행해도 됩니다. 101 Switching Protocol 서버 프로토콜 변경 요청을 승인했습니다. 103 Early Hints 캐시 사전 로딩 정보를 제공합니다. 2xx 성공 200 OK 요청이 성공적으로 처리되었습니다. 201 Created 요청으로 인해 새로운 리소스가 생성되었습니다. 202 Accepted 요청이 수락되었지만, 아직 처리되지 않았습니다. 204 No Content 요청은 성공했지만, 응답 본문이 없습니다. 206 Partial Content 부분 콘텐츠 요청이 성공적으로 처리되었습니다. 3xx 리다이렉션 301 Moved Permanently 리소스가 영구적으로 새로운 URL로 이동했습니다. 302 Found 리소스가 임시적으로 다른 URL에서 제공합니다. 303 See Other 리소스를 다른 URL로 조회해야 합니다. 304 Not Modified 클라이언트의 캐시된 리소스가 여전히 유효합니다. 307 Temporary Redirect 임시적으로 다른 URl로 리다이렉션됩니다. 308 Permanent Redirect 영구적으로 다른 URL로 리다이렉션됩니다. 4xx 클라이언트 오류 400 Bad Request 잘못된 요청 형식으로 인해 서버가 요청을 이해하지 못했습니다. 401 Unauthorized 인증이 필요합니다. 403 Forbidden 요청은 이해되었지만, 권한이 없어 거부되었습니다. 404 Not Found 요청한 리소스를 찾을 수 없습니다. 405 Method Not Allowed 요청 메서드가 허용되지 않습니다. 408 Request Timeout 서버가 요청을 기다리다 시간 초과되었습니다. 5xx 서버 오류 500 Internal Server Error 서버에서 알 수 없는 오류가 발생했습니다. 501 Not Implemented 서버가 요청된 기능을 지원하지 않습니다. 502 Bad Gateway 서버가 잘못된 게이트웨이 응답을 받았습니다. 503 Service Unavailable 서버가 과부하 상태이거나 유지보수 중입니다. 504 Gateway Timeout 게이트웨이 또는 프록시 서버가 응답 시간 초과되었습니다. 505 HTTP Version Not Supported 서버가 요청된 HTTP 버전을 지원하지 않습니다.
2) 헤더(Header)
응답의 메타데이터를 포함하며, 콘텐츠 타입, 서버 정보, 캐싱 정책 등을 전달한다.
Data: 응답이 생성된 날짜와 시간
Cache-Control : 캐싱 동작을 제어합니다. (예: Cache-Control: no-cache)
Connection: 현재 연결을 유지할지 종료할지 설정
Via : 요청에서 클라이언트와 서버, 통신 중간에 프로토콜과 수신자
Age : 서버에서 생성된 페이지에 대한 예상 시간
Server: 응답 서버 정보
Retry-After : 서버가 일정 시간 후 요청을 다시 시도하라고 알림.
Accept-Ranges: 클라이언트가 요청한 리소스의 특정 범위를 지원할지 여부를 나타낸다.
Etag: 리소스의 고유 식별자
Last_Modified: 최근 응답 페이지 수정일
Expires: 내용이 만료되는 것으로 예상 시간
Vary : 클라이언트의 요청 헤더에 따라 응답이 달라지는 조건을 명시
Content-Type : 응답 데이터의 MIME 타입을 정의
Content-Length : 응답 본문의 바이트 크기
Content-Encoding : 본문 데이터가 어떤 인코딩 방식으로 압축되었는지 나타닌다.
Content-Language : 응답 본문에 사용된 언어를 나타냄.
Content-Disposition : 응답 데이터를 어떻게 처리할지 나타낸다. (예: Content-Disposition: attachment; filename="file.pdf")
Set-Cookie : 클라이언트에 쿠키를 설정
Location : 클라이언트를 리다이렉션할 URL을 나타낸다.
Strick-Transport-Security (HSTS) : HTTPS 연결을 강제
X-Content-Type-Options : 브라우저의 MIME 타입 스니핑을 방지
X-Frame-Options : 클릭재킹을 방지하기 위해 프레임 내 삽입을 제어
Content-Security-Policy (CSP) : 리소스를 제한하여 XSS 공격을 방지
3) 빈줄(CRLF)
헤더와 본문을 구분하는 빈줄(\r\n)
4) 본문(Body)
서버가 클라이언트에 반환하는 데이터로, HTML, JSON, XML, 이미지 등 다양한 형식일 수 있다.
✔ 성공 응답 예시
HTTP/1.1 200 OK
Date: Sat, 12 Jan 2025 10:00:00 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Connection: keep-alive
Set-Cookie: sessionId=xyz789; HttpOnly; Path=/; Max-Age=3600
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login Successful</title>
</head>
<body>
<h1>Welcome, test!</h1>
<p>You have successfully logged in.</p>
</body>
</html>
✔ 리다이렉션 응답 예시
HTTP/1.1 301 Moved Permanently
Location: https://www.newdomain.com/newpage
Date: Sat, 12 Jan 2025 10:00:00 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Length: 0
Connection: keep-alive
3. HTTP 특징
- 비연결 지향(Connectionless)
HTTP요청은 독립적으로 처리되고 이전의 연결 상태를 유지하지 않음.
클라이언트가 서버에 요청을 보내고 서버가 응답을 보내면 그 즉시 연결이 종료.
- 비상태성(Stateless)
각 요청 간의 상태 정보가 유지되지 않으며, 이전 요청에 대한 정보를 기억하지 않음.
👉 Session, Cookie, JWT 등을 활용하여 상태를 유지할 수 있도록 함.