A. 처음 사용자가 아마존 웹 사이트 방문 → 서버는 아무것도 모름
B. 서버는 사용자 식별을 위한 값을 쿠키에 할당
C. 브라우저는 서버에서 온 쿠키콘텐츠를 브라우저 쿠키 DB에 저장
- *method*
- POST, PUT,HEAD,GET,DELETE
- *HEAD*
- GET과 유사
- 서버가 HEAD 요청 받음 → HTTP로 응답 ( but, 요청 객체는 보내지 않음)
- 디버깅을 위해 HEAD 메소드 많이 사용
- 웹서버에 업로드할 객체를 필요로 하는 애플리케이션에 의해 사용
- *Connection : close*
- client → 메세지 보냄 → TCP 연결 닫는 데 사용
- 브라우저는 서버에게 지속 연결 사용을 원치 않는다는 것을 말함
- *user-agent*
- 서버에게 요청하는 브라우저 타입 명시
- Date
- HTTP 응답이 서버에 의해 생성되고 보낸 날짜와 시간
- Server
- 아파치 웹서버에 의해 만들어졌음을 의미
- request header의 user-agent와 비슷
- Last-Modified
- 객체가 생성되거나 마지막으로 수정된 시간과 날짜
- Content-Length
- 송신되는 객체 바이트 수
- Content-Type
- 개체 몸체 내부의 객체가 HTML 텍스트인 것
- Etag (Entity Tag)
- 웹 캐시 유효성 검증에 사용
- 리소스 특정 버전에 대한 고유 값 → 리소스 업데이트 → Etag또한 업데이트
- 클라이언트에서 캐싱하고 있는 버전 === 서버 버전 ⇒ 304 Not Modified 상태 코드 response → response body에 대한 트래픽 절감 가능
단점
GET 방식 사용
If-Modified-Since 헤더 포함
⇒ 조건부 GET메세지
UDP를 이용한 소켓 프로그래밍
- 수신 프로세스에 있는 소켓으로 라우팅 위해 패킷에 “목적지 주소”를 붙여넣음
→ 목적지 주소에는
1. 목적지 호스트의 IP주소
2. 소켓이 생성될 시 할당된 소켓 포트 번호
UDP를 이용한 클라이언트 애플리케이션
UDPClient.py
from socket import *;
serverName = 'hostname'; // IP주소, 서버의 호스트 이름
severPort = 12000;
// socket(주소군, TCP, UDP 구분)
// AF_INET : IPv4 사용
// SOCK_DGRAM : UDP 사용
clientSocket = socket(AF_INET, SOCK_DGRAM)
// input : 파이썬 내장함수
// 클라이언트 사용자에게 인자 안의 글자로 프롬프트가 나타남
message = input('Input lowercase sentence:');
// encode로 문자열 -> 바이트 형으로 변환
// 클라이언트는 패킷을 보낸 후, 서버로부터 데이터 수신 기다림
clientSocket.sendto(message.encode(), (serverName, serverPort));
// 소켓 종료
clientSocket.close();
UDP를 이용한 서버 애플리케이션
UDPServer.py
from socket import *;
// client와 동일
serverName = 'hostname'; // IP주소, 서버의 호스트 이름
severPort = 12000;
serverSocket = socket(AF_INET, SOCK_DGRAM)
// 포트 번호 12000을 서버 소켓에 할당 (bind)
serverSocket.bind((''), serverPort));
// UDPServer는 클라이언트로부터 계속해서 패킷 수신,처리 가능하게끔
// 패킷이 도착하기를 기다림 (도착할 때까지 while문 반복)
while True :
// clientAddress: 패킷 출발지 주소
// 반송해야할 때, 이 주소를 참조
// message: 패킷 데이터
message, clientAddress = serverSocket.recvfrom(2048)
// 대문자로 변환
modifiedMessage = message.decode().upper()
// 클라이언트 주소를 대문자로 변환된 메세지에 붙임
// 만들어진 패킷을 서버 소켓으로 보냄
serverSocket.sendto(modifiedMessage.encode(), clientAddress)
TCP를 이용한 소켓 프로그래밍
- 연결 지향형 프로토콜 → 사전에 클라이언트 ↔ 서버 연결 설정 필요
- TCP 연결 설정 후 → 소켓을 통해 데이터를 TCP연결로 보냄
TCP에서 클라이언트와 서버의 상효작용 순서
클라이언트 → 서버로의 접속 시도 ( = TCP 연결 시도 )
클라이언트 → 3way handshake 함 → 서버와의 TCP 연결 설정
3way handshake란?
TCP를 이용한 클라이언트 애플리케이션
TCPClient.py
from socket import *;
serverName = 'hostname';
severPort = 12000;
// SOCK_STREAM : UDP가 아닌 TCP 소켓임을 의미
clientSocket = socket(AF_INET, SOCK_STREAM)
// client -> server전, TCP 연결
clientSocket.connect((serverName, serverPort));
message = input('Input lowercase sentence:');
//문자열 sentence를 서버로 보냄
clientSocket.send(sentence.encode());
clientSocket.sendto(message.encode(), (serverName, serverPort));
// 소켓 종료
clientSocket.close();
TCP를 이용한 서버 애플리케이션
TCPServer.py
from socket import *;
serverName = 'hostname'; // IP주소, 서버의 호스트 이름
severPort = 12000;
serverSocket = socket(AF_INET, SOCK_STREAM)
// 포트 번호 12000을 서버 소켓에 할당 (bind)
serverSocket.bind((''), serverPort));
// 연결 요청, 파라미터는 큐잉 되는 연결 최대 수
serverSocket.listen(1);
while True :
*// clientSocket과 서버의 connectionSocket 간 TCP 연결 설정*
connectionSocket, addr = serverSocket.accept();
sentence = connectionSocket.recvfrom(1024).decode();
capitalizedSentence = sentence.upper();
connectionSocket.send(capitalizedSentence.encode());
connectionSocket.close();