네트워크 프로그래밍

"Java Network Programming" 책을 기반으로 간략히 요약하여 정리했습니다.
HTTP란?
웹 클라이언트(브라우저)와 서버가 대화하는 표준 방식입니다.
HTML 뿐만 아니라 이미지, 워드 문서, 실행 파일(.exe) 등 바이트로 표현 가능한 모든 데이터를 전송 가능합니다.
전송 계층으로, TCP/IP 프로토콜을 사용합니다.
통신 과정(4단계)
1. 연결 수립(Open Connection): 클라이언트가 서버의 포트(기본 80)에 TCP 연결을 엽니다.
2. 요청 전송(Request): 클라이언트가 필요한 리소스(파일 등)를 달라고 메시지를 보냅니다.
3. 응답 수신(Response): 서버가 요청에 대한 결과(데이터 or 에러)를 보냅니다.
4. 연결 종료(Close): 서버가 연결을 끊습니다.
HTTP 요청(Request) 구조
1. 요청 라인 (Request Line): GET /index.html HTTP/1.1
- Method: 동작 지정 (예: /GET - 데이터 보내줘)
- Path: 리소스 경로 (예: /index.html)
- Version: 프로토콜 버전 (예: HTTP/1.1)
- User-Agent: 브라우저 종류 (서버가 이에 맞춰 최적화된 페이지를 줄 수 있음)
- Host: 접속하려는 도메인 이름 (하나의 IP에 여러 도메인이 있을 때 필수)
- Accept: 클라이언트가 받을 수 있는 데이터 타입 (MIME 타입)
3. 빈 줄 (Blank Line): 헤더의 끝을 알림
4. 본문 (Body) : (GET 요청은 보통 본문이 없음)
HTTP 응답(Response) 구조
1. 상태 라인 (Status Line): HTTP/1.1 200 OK
- Version: 프로토콜 버전
- Response Code: 결과 코드 (예: 200은 성공)
- Reason Phrase: 코드 설명 (예: OK)
- Date: 응답 생성 시간
- Server: 서버 소프트웨어 정보 (예: Apache)
- Content-Type: 보낼 데이터의 종류 (예: text/html)
- Content-Length: 데이터의 길이 (바이트 단위)
3. 빈 줄 (Blank Line)
4. 본문 (Body): 실제 요청한 HTML 코드나 이미지 데이터 등
구조의 유사성: 요청(Request)과 응답(Response) 모두 [시작 라인]-[헤더]-[빈 줄]-[본문] 이라는 동일한 구조를 가집니다.
헤더의 중요성: 실제 데이터(본문)를 해석하기 위한 모든 정보(길이, 타입, 인코딩 등)가 헤더에 들어있습니다.
버전의 진화: HTTP 1.1은 HTTP 1과 달리 연결 재사용(Keep-Alive)를 통해서 지속된 연결이 가능하게 됐습니다. (성능 개선)
Cookies
웹 사이트가 접속자(클라이언트)의 상태를 지속적으로 유지하기 위해 브라우저에 저장하는 작은 문자열입니다.
로그인 정보, 장바구니 목록, 사용자 설정, 세션 ID 등을 저장합니다.
HTTP는 기본적으로 상태가 없는(Stateless) 프로토콜이기 때문에,
서버가 클라이언트를 기억하기 위해 쿠키라는 기술을 사용합니다.
특징
- 보통 데이터 자체(예: 책 제목, 가격)를 담기 보다는, 서버 데이터베이스에 있는 기록을 찾기 위한 식별자(ID)값만 담는 경우가 많습니다.
(보안 및 효율성 때문)
- 형식: 공백이 없는 ASCII 텍스트로 제한되며, 쉼표나 세미콜론을 포함하지 않습니다.
동작 원리
1. 쿠키 설정 (Server → Client): 서버가 응답 헤더에 Set-Cookie를 실어 보냄
2. 쿠키 저장: 브라우저는 이 정보를 로컬에 저장함
3. 쿠키 반환 (Client → Server): 이후 같은 서버에 요청을 보낼 때, 저장해둔 쿠키를 Cookie 헤더에 실어 보냄
쿠키의 주요 속성 (Attributes)
단순한 key=value 외에 쿠키의 수명이나 적용 범위를 제어하는 속성들이 있습니다.
A. 범위 제어 (Scope): 쿠키가 어느 사이트, 어느 경로에서 유효한지 결정
Domain: 쿠키가 유효한 도메인을 지정함
Path: 특정 디렉터리 이하에서만 쿠키를 보내도록 제한
(예: Path = /restricted로 설정하면 /restricted/secret.html에는 쿠키를 보내지만,
/main.html에는 보내지 않음)
B. 수명 제어 (expiration): 쿠키가 언제 삭제될지 결정
- Expires: 특정 날짜와 시간(GMT)을 지정
- Max-Age: 생성된 후 흐른 시간(초단위)을 기준으로 만료시킴
C. 보안 (Security)
- Secure: 오직 암호화된 연결(HTTPS)을 통해서만 쿠키를 전송하도록 강제
- HttpOnly: 자바스크립트(document.cookie)로 쿠키에 접근하는 것을 막음
XSS 공격 등으로부터 쿠키 탈취를 방지하는 중요한 보안 옵션
쿠키는 웹 서버가 "나, 쟤(클라이언트) 알아!" 라고 기억하게 해주는 명찰과 같습니다.
서버가 명찰(Set-Cookie)을 주면, 클라이언트는 갈 때마다 그 명찰(Cookie)을 보여주는 방식입니다.