본문 바로가기
HTTP

HTTP

by moonstal 2022. 5. 31.

인터넷 네트워크

IP (인터넷 프로토콜)

  • 역할: 지정한 IP 주소에 패킷이라는 통신 단위로 데이터 전달
  • 패킷 정보: 출발지, 목적지, 전송제어, 순서
  • 한계: 비연결성(대상없음, 서비스 불능), 비신뢰성(패킷소실, 순서), 프로그램 구분(같은 IP)

TCP, UDP

  • 인터넷 프로토콜 스택 4계층
    • 애플리케이션 계층: http,ftp
    • 전송 계층: tcp,udp
    • 인터넷 계층: ip
    • 네트워크 인터페이스 계층
  • 애플리케이션(소켓 라이브러리) > os (tcp > ip) > 네트워크 인터페이스
  • tcp(전송제어 프로토콜) 특징
    • 연결지향-tcp 3 way handshake (가상연결): syn(클라이언트)->syn+ack(서버)->ack(클라이언트)-> 데이터 전송
    • 데이터 전달 보증: 데이터 전송(클라이언트)->응답(서버)
    • 순서보장: 잘못오면 다시 보내(전송제어, 순서, 검증정보로 확인)
    • 신뢰
  • udp(사용자 데이터그램 프로토콜) 특징: 기능 거의 없음, 연결지향-tcp 3 way handshake x, 순서 x, 단순 빠름, port(어디 패킷 구분), 체크섬(값변경 검사) 애플리케이션 추가 작업

PORT

  • ip: 목적지 서버찾기(아파트)
  • Port: 서버안의 애플리케이션 찾기(동,호수)

DNS

  • 도메인 네임 시스템
  • 도메인 명 ip주소로 변환
  • google.com
  • ip 바뀌어도 ok

URI와 웹 브라우저 요청 흐름

URI

  • uri: 리소스 식별 url(위치) + urn(이름)
    • uniform: 통일된 방식
    • resource: 모든 자원
    • identifier: 식별 정보
  • url 문법
    • 프로토콜 https: 스키마, 어떤 방식으로 자원접근, s-보안
    • userinfo: 사용자 정보 포함해서 인증
    • 호스트명 www.google.com
    • 포트번호 443: 생략 가능, http(80), https(443)
    • 패스 /search: 리로스 경로, 계층구조
    • 쿼리 파라미터(q=hello): key=value, ?시작, &추가, 문자로 넘어감
    • fragment: html 내부 북마크, 서버전송x

웹 브라우저 요청 흐름

  • dns, port 조회 > http 요청 메세지 > 소켓라이브러리 통해 전달(tcp/ip연결, 데이터 전달) > tcp/ip 패킷 생성, http 메시지 포함 > 패킷도착 > http 메시지 분석 > http 응답 메시지

HTTP

HTTP 기본

  • hypertext transfer protocol: http메시지에 모든 것을 전송
  • http/1.1 가장 많이 사용
  • 기반 프로토콜: tcp(http/1.1, 2), udp(http/3)
  • 특징
    • 클라이언트 서버구조: request(클라이언트), response(서버)
    • 무상태 프로토콜 stateless: 문맥 모름, 응답 서버 쉽게 바꿈(서버증설) <-> stateful 상태유지
      • 한계: 데이터 많음, 모든 것 무상태 불가 ex)로그인->브라우저 쿠키, 서버 세션
    • 비연결성: 연결 끊어버림(기본) 최소 자원 유지, 초단위 응답, 자원 효율 <-> 서버 연결 유지 자원 소모
      • 한계: tcp/ip연결(3 way handshake) 새로, 자원 다시 다운->지속연결(문제해결)-> http/2,3 최적화
    • http 메시지
      • 구조
        • 시작라인
          • 요청: http 메서드, 요청 대상(/절대경로), http버전
          • 응답: http버전, http상태코드, 이유문구
        • 헤더: field-name ":" owws field-value ows (ows:띄어쓰기o), 전송에 필요한 부가정보
        • 공백라인
        • 메시지 바디: 실제 전송 데이터, byte
    • 단순, 확장

http 메서드

  • 설계: 리소스(회원 자체) 식별 가장 중요-> 리소스를 uri에 매핑(행위 분리)
  • get: 리소스 조회, 데이터 query통해, 메시지 바디 사용가능(권장 안함)
  • post: 요청 데이터 처리(단순데이터 생성, 프로세스 처리), 메시지 바디 통해 서버로 요청 데이터 전달, 등록, 다른 메서드로 처리하기 애매한 경우(json 조회 데이터)
  • put: 리소스 완전히 대체(생성/덮기), 클라이언트가 리소스 위치 알고 uri 지정(<->post)
  • patch: 부분 변경
  • delete: 리소스 삭제
  • head: 상태 줄과 헤더만
  • options: 통신 가능 옵션 설명
  • 속성
    • 안전: 호출시 리소스 변경 x (get,head)
    • 멱등: 같은 요청 호출 결과 같음 (get, put, delete), 자동복구 메커니즘에 사용
    • 캐시가능: get(실제), head(실제), post(어렵), patch(어렵)

http 활용

  • 클라이언트에서 서버로 데이터 전송
    • 쿼리 파라미터: get, 정렬필터(검색어)
    • 메시지 바디: post, put, patch ex) 회원가입, 상품주문
    • 상황
      • 정적 데이터 조회: 이미지, 정적 텍스트, get, 리소스 경로
      • 동적 데이터 조회: 쿼리 파라미터 사용, 정렬필터(검색어), get
      • html form 데이터 전송: post(메시지 바디-key=value), get(쿼리파라미터), Content-Type:application/x-wwww-form-urlencoded, multipart/form-data
      • http api 데이터 전송: 서버끼리, 앱/웹 클라이언트, Content-Type:application/json(주로)
  • http 설계
    • post: 클라이언트 등록될 리소스 uri모름(/members), 서버가 새로 등록된 리소스 uri생성 문서(/members/100), 컬렉션(리소스 디렉토리 /members)
    • put: 클라이언트가 리소스 uri를 알고 있음 (/files/{filename}), 스토어(클라이언트 리소스 저장소 /files)
    • html form: get,post만 -> 컨트롤 uri(/delete) , 동사로 된 리소스 경로

http 상태코드

  • 상태 코드: 클라이언트가 보낸 요청의 처리 상태 응답
  • 1xx: 요청 수신 처리중
  • 2xx: 요청 성공
    • 200 ok: 요청 성공
    • 201 created: 새로운 리소스 생성
    • 202 accepted: 요청접수o 처리x 배치
    • 204 no content: 보낼 데이터 없음
  • 3xx: 웹 브라우저 추가 행동 필요
    • 리다이렉션: location위치로 이동, 영구, 일시, 특수
    • 301(get, 본문제거), 308(요청메서드, 본문유지): uri가 영구적으로 이동
    • 302(get, 본문제거), 307(요청메서드, 본문유지), 303(get): 일시적 리다이렉션
    • prg: post/redirect/get, 새로고침으로 인한 중복주문 방지
    • 304: 캐시 목적, 리소스 수정x, 재사용
  • 4xx: 클라이언트 오류
    • 400: 요청 파라미터, api스펙 잘못
    • 401: 리소스에 대한 인증 필요 (인증-로그인)
    • 403: 인증 o, 접근 권한x (인가-권한)
    • 404: 리소스 서버에 없음
  • 5xx: 서버오류
    • 500: 서버 내부 문제
    • 503: 서버 일시적 과부화/예정 작업 -> 서비스 이용불가

http 헤더 - 일반 헤더

  • 용도: http전송에 필요한 모든 부가정보
  • 엔티티(표현) 헤더는 엔티티(표현) 본문의 데이터 해석 정보 제공
  • 표현
    • Content-Type: 표현 데이터 형식 (application/json)
    • Content-Encoding: 표현 데이터 압축방식 (gzip)
    • Content-Language: 표현 데이터 자연언어 (ko)
    • Content-Length: 표현 데이터 길이 (Transfer-Encoding x)
  • 협상:클라이언트가 선호하는 표현 요청(요청시만)
    • Accept: 클라이언트 선호 미디어 타입
    • Accept-Charset: 클라이언트 선호 문자 인코딩
    • Accept-Encoding: 클라이언트 선호 압축 인코딩
    • Accept-Language: 클라이언트 선호 자연언어
    • 우선순위: 0~1 클수록 높음 , 생략 1, 구체적인 것(text/plain > text/*)
  • 전송방식
    • 단순 전송: 길이 알아
    • 압축 전송: gzip 용량 작아짐, Content-Encoding필요
    • 분할 전송: 쪼개서 보내, Transfer-Encoding: chunked, 용량 클때
    • 범위 전송: ex) 나머지 절반
  • 일반 정보
    • from: 유저 에이전트의 이메일 정보
    • referer: 이전 웹페이지 주소(유입 경로 분석)
    • user-agent: 클라이언트 애플리케이션 정보, 특정 브라우저 문제
    • server: 요청 처리하는 origin 서버의 소프트웨어 정보
    • date: 메시지 발생 날짜, 시간 (응답만)
  • 특별 정보
    • host(도메인): 요청시, 필수, 하나의 서버가 여러 도메인 처리 할때
    • location: 페이지 리다이렉션 3xx
    • allow: 허용가능한 http 메서드
    • retry-after: 다음 요청까지 기다려야 하는 시간
  • 인증: Autortization(클라이언트 인증 정보 서버에 전달), www-Authentication(인증방법정의)
  • 쿠키
    • set-cookie: 서버-> 클라이언트로 쿠키전달
    • cookie: 서버->클라이언트 쿠키 저장, http요청시 서버로 전달
    • stateless -> 모든 요청에 사용자 정보 포함(힘듦) -> 셋 쿠키-> 쿠키 저장소 -> 모든 요청에 쿠키 정보 자동 포함 -> 네트워크 트래픽 추가 유발, 최소 정보 사용, 웹 스토리지
    • 로그인 세션관리, 광고 정보 트래킹
    • 생명주기: set-cookie: expires=만료 날짜 gmt / set-cookie: max-age=초(0/음수 쿠키 삭제), 세션쿠기(만료날짜x-브라우저 종료시까지), 영속 쿠키(만료날짜o-해당날짜)
    • 도메인: 명시(명시 문서 도메인+서브), 생략(현재 문서 기준 도메인만)
    • 경로: 경로포함 하위 경로 o (일반 path=/)격
    • 보안: secure(https인 경우만 전송), httpOnly(xss방지, js불가, http전송만), sameSite(xsrf방지, 도메인 같은 경우)

http 헤더 - 캐시와 조건부 요청

  • 캐시기본동작: 캐시 없으면 계속 데이터 다운, 네트워크 느리고 비쌈 -> 캐시적용 cache-control:max-age=60(초) 응답결과 캐시저장 -> 캐시시간초과 다시요청-> 안바꼈으면?
  • 검증 헤더와 조건부 요청
    • 안바뀜: 재사용가능, 같다는 사실 확인, 조건부 요청 if-modified-since, 검증 헤더 Last-Modified:최종수정일 확인, 304not modified, http 바디 없음
    • 검증헤더: 캐시데이터 서버데이터 같은지 검증하는 데이터(last-modified,etag)
    • 조건부 요청헤더
      • 검증헤더로 조건에 따른 분기,
      • if-modified-since(laste-modified)
      • 미변경: 304 not modified, 캐시-서버 날짜 같음, 헤더만 전송
      • 변경: 200, 캐시-서버 다름(서버가 나중), 바디포함
      • 단점: 초단위 미만 불가, 날짜 다른데 데이터 같음, 캐시 유지하고 싶은 경우->if-none-match(etag)
      • if-none-match(etag): 고유 버전 이름, 데이터 바뀌면 이름 변경(hash), 캐시 제어 로직 서버에서 관리
  • 캐시와 조건부 요청 헤더
    • cache-control(캐시 지시어): max-age(유효시간, 초단위), no-cache(데이터 캐시 가능, 항상 원서버에서 검증), no-store(민감정보 저장x)
    • pragma(캐시제어): no-cache 하위호환
    • expires(만료일): 지장한 날짜로 지정
  • 프록시 캐시: 웹브라우저(private 캐시)-> 한국에 프록시 캐시 서버(public 캐시) -> 미국 원 서버 (유튜브)
  • 캐시 무효화
    • cache-control:no-cache (데이터 캐시o, 항상 원서버 검증)
    • cache-control:no-store (민감정보 저장x)
    • cache-control:must-revalidate (캐시만료후 최초 조회시 원서버 검증, 실패-> 오류 필수(504))
    • pragma:no-cache (하위호환)

 

 

모든 개발자를 위한 HTTP 웹 기본 지식 - 인프런 | 강의

실무에 꼭 필요한 HTTP 핵심 기능과 올바른 HTTP API 설계 방법을 학습합니다., - 강의 소개 | 인프런...

www.inflearn.com