사전 페이로드
개념

페이로드

gabury1

페이로드는 데이터를 주고받을 때 실어 나르려던 알맹이를 가리킵니다. 목적지나 길이 같은 안내는 겉에 따로 붙습니다. 나르는 쪽은 이 알맹이를 열어 보지 않고 목적지까지 옮깁니다. 보안에서는 공격 코드 가운데 진짜 피해를 입히는 부분을 같은 이름으로 부릅니다.

쉽고 빠른 이해

무슨 일을 하는 물건인가 — 주고받는 데이터에서 알맹이에 해당하는 부분입니다. 화물 트럭으로 치면 운전석과 운송장이 아니라 실려 있는 짐이 페이로드입니다.

왜 이렇게 하나 — 안내와 알맹이를 섞어 두면 중간에서 옮겨 주는 쪽도 내용을 해석해야 합니다. 둘을 갈라 두면 옮기는 쪽은 겉만 읽습니다. 알맹이는 받는 쪽만 열어 보면 됩니다.

어떻게 도나

  1. 보내는 쪽이 보낼 내용을 알맹이로 두고 그 앞에 안내를 붙입니다
  2. 중간 장비는 안내만 읽고 다음 장비로 넘깁니다
  3. 받는 쪽이 안내를 떼어 내고 알맹이를 꺼내 씁니다

대가 — 알맹이가 작아도 안내는 늘 붙으므로, 작은 데이터를 자주 보낼수록 덧붙는 몫이 커집니다. 한 번에 실을 수 있는 알맹이 크기에도 상한이 있어서 큰 데이터는 여러 벌로 쪼개 보내야 합니다. 겉의 안내와 안의 내용을 갈라 말할 필요가 없으면 그냥 본문이라고 부릅니다.

상세

이 절은 네트워크에서 데이터를 주고받을 때의 페이로드를 중심으로 봅니다. 두 쪽이 데이터를 주고받는 약속을 프로토콜이라고 합니다. 무엇이 페이로드인지는 그 약속이 정합니다.

화물 트럭을 떠올리면 쉽습니다. 트럭에는 운전석과 운송장과 짐이 함께 실려 움직입니다. 보내는 사람이 옮기려던 것은 짐 하나입니다.

페이로드는 그 짐에 해당합니다. 말 자체가 실어 나르는 짐이라는 뜻입니다.

헤더와 페이로드

주고받는 데이터는 한 덩이씩 끊어 보냅니다. 이 한 덩이가 데이터 단위입니다.

데이터 단위 하나는 대개 두 부분으로 나뉩니다. 앞에 붙는 안내가 헤더입니다. 그 뒤가 페이로드입니다.

둘을 가르는 까닭은 읽는 쪽이 다르기 때문입니다. 가는 길에 놓인 라우터 같은 장비는 목적지와 길이만 알면 데이터 단위를 다음으로 넘길 수 있습니다. 알맹이에 무엇이 들었는지는 몰라도 됩니다.

sequenceDiagram
    participant A as 보내는 쪽
    participant R as 라우터
    participant B as 받는 쪽
    A->>R: 헤더 + 페이로드
    Note over R: 헤더만 읽는다 · 페이로드는 안 연다
    R->>B: 헤더 + 페이로드
    Note over B: 헤더를 떼고 페이로드를 꺼낸다

그래서 페이로드가 암호로 잠겨 있어도 전달에는 지장이 없습니다. TLS(Transport Layer Security, 전송 계층 보안)는 주고받는 알맹이를 암호로 잠그는 약속입니다. 이때도 겉의 주소는 그대로 보입니다.

중간 장비는 주소를 읽어 길을 고릅니다. 안의 내용은 받는 쪽만 풉니다.

데이터 단위 끝에 붙는 정보도 있습니다. 이것이 트레일러입니다. 페이로드를 다 받은 뒤에야 계산할 수 있는 검사값처럼, 앞에 둘 수 없는 정보가 뒤로 갑니다.

계층이 바뀌면 페이로드도 바뀐다

네트워크는 일을 여러 계층으로 나눠 맡깁니다. 위 계층이 만든 데이터 단위는 아래 계층에게는 알맹이일 뿐입니다. 아래 계층은 그것을 받아 자기 헤더를 앞에 붙입니다. 이렇게 감싸는 일을 캡슐화라고 부릅니다.

아래 그림에 세 가지 방식이 나옵니다. 계층마다 데이터 단위를 부르는 이름도 다릅니다.

이더넷은 같은 선에 붙은 장비끼리 데이터를 주고받는 방식입니다. 이더넷의 데이터 단위는 프레임입니다.

IP(Internet Protocol, 인터넷 프로토콜)는 주소를 보고 데이터를 목적지까지 나르는 약속입니다. IP 의 데이터 단위는 패킷입니다.

TCP(Transmission Control Protocol, 전송 제어 프로토콜)는 순서를 맞추고 잃어버린 데이터를 다시 보내는 전송 방식입니다. TCP 의 데이터 단위는 세그먼트입니다.

flowchart TD
    subgraph F["이더넷 프레임"]
        FH["이더넷 헤더"]
        subgraph P["IP 패킷 · 이더넷의 페이로드"]
            PH["IP 헤더"]
            subgraph S["TCP 세그먼트 · IP 의 페이로드"]
                SH["TCP 헤더"]
                D["웹 요청 · TCP 의 페이로드"]
            end
        end
    end

그림은 웹 요청 하나가 선 위로 나갈 때의 모양입니다. 각 겹에서 헤더가 앞이고 안쪽 겹이 뒤입니다. 한 겹 안으로 들어갈 때마다 그것이 바깥 겹의 페이로드가 됩니다. 받는 쪽은 바깥부터 헤더를 하나씩 떼어 내며 안쪽으로 내려갑니다.

그래서 무엇이 페이로드인지는 어느 계층에서 보느냐에 따라 달라집니다. 같은 바이트가 위 계층에서는 헤더였다가 아래 계층에서는 페이로드에 섞여 들어갑니다.

페이로드 크기의 상한

한 구간이 한 번에 나를 수 있는 데이터 단위의 크기에는 상한이 있습니다. 이 상한을 MTU(Maximum Transmission Unit, 최대 전송 단위)라고 합니다. 헤더도 이 상한 안에 들어가므로, 실을 수 있는 페이로드는 상한에서 헤더를 뺀 만큼입니다.

block-beta
columns 8
  m["MTU"]:8
  h1["헤더"]:1 p1["페이로드"]:7
  h2["헤더"]:1 p2["페이로드"]:2 space:5

두 줄 모두 상한 한 칸을 나눠 씁니다. 헤더는 어느 줄에나 똑같은 폭으로 붙습니다. 상한에서 헤더를 뺀 만큼이 페이로드입니다.

보낼 내용이 그보다 크면 여러 데이터 단위로 쪼개 보냅니다. 쪼개는 일은 단편화라고 부릅니다. 받는 쪽은 쪼개진 것을 모아 원래 알맹이로 되돌립니다.

flowchart TD
    W["보낼 알맹이 하나"]
    W --> S1
    W --> S2
    W --> S3
    subgraph S1["데이터 단위 1"]
        H1["헤더"] --- F1["조각 1"]
    end
    subgraph S2["데이터 단위 2"]
        H2["헤더"] --- F2["조각 2"]
    end
    subgraph S3["데이터 단위 3"]
        H3["헤더"] --- F3["조각 3"]
    end

알맹이 하나가 데이터 단위 여럿이 됩니다. 조각마다 헤더가 새로 붙습니다.

가는 길의 구간마다 상한이 다르면 그중 가장 작은 값이 그 길의 상한이 됩니다. 보내는 쪽이 그 값을 미리 알아내는 절차가 경로 MTU 탐색입니다. 미리 알아내면 중간에서 쪼개지 않고 처음부터 맞는 크기로 보낼 수 있습니다.

헤더는 페이로드가 작든 크든 똑같이 붙습니다. 그래서 페이로드가 작을수록 보내는 바이트에서 헤더가 차지하는 몫이 커집니다. 이렇게 알맹이 말고 덧붙는 몫을 오버헤드라고 합니다.

백엔드 코드에서 만나는 페이로드

백엔드 코드는 이더넷과 IP 와 TCP 의 페이로드를 직접 만지지 않습니다. 운영체제가 감싸고 벗기는 일을 대신하기 때문입니다. 코드가 날마다 만나는 페이로드는 HTTP(HyperText Transfer Protocol, 하이퍼텍스트 전송 프로토콜) 요청과 응답의 본문입니다.

아래는 주문을 하나 만드는 요청입니다. 위의 세 줄이 헤더입니다. 빈 줄 다음의 한 줄이 페이로드입니다.

http
POST /orders HTTP/1.1
Content-Type: application/json
Content-Length: 30

{"item": "keyboard", "qty": 2}

방금 본 요청에서 Content-Type 은 페이로드가 JSON(JavaScript Object Notation, 자바스크립트 객체 표기법)으로 적혔다는 것을 알립니다. Content-Length 는 페이로드가 30바이트라는 것을 알립니다. 서버는 이 두 줄을 먼저 읽습니다. 그다음 그만큼의 바이트를 읽어 객체로 되살립니다.

메시지를 쌓아 두고 나중에 꺼내 쓰는 메시지 큐에서도 같은 말을 씁니다. 발행한 메시지 안에서 받는 쪽이 꺼내 쓰는 본문이 페이로드입니다. 사건이 일어났을 때 남의 서버로 요청을 보내는 웹훅도 그 본문을 페이로드라고 부릅니다.

페이로드는 바깥에서 들어온 입력입니다. 크기 상한을 두지 않으면 큰 본문 하나로 서버의 메모리가 바닥납니다. 들어온 내용을 믿고 그대로 객체로 되살리면 역직렬화 취약점이 열립니다. 보낸 쪽이 마음대로 적어 넣은 바이트라고 보고 검사한 뒤에 씁니다.

코드에서 이 말을 꺼내는 까닭은 겉의 안내와 안의 내용을 갈라 말해야 하기 때문입니다. 안의 내용만 이야기하면 될 때는 그냥 본문이라고 부릅니다.

페이로드라는 이름의 다른 쓰임

페이로드라는 말은 네트워크 밖에서도 쓰입니다. 껍데기와 알맹이를 가른다는 점은 어디서나 같습니다.

쓰임 무엇을 가리키나 데이터 단위의 페이로드와 닮았나
요청·응답 페이로드 요청이나 응답의 본문 닮았다. 헤더를 뺀 알맹이다
이벤트 페이로드 사건 알림에 실려 오는 내용 닮았다. 받는 쪽이 원한 내용이다
악성코드 페이로드 공격 코드에서 피해를 입히는 부분 닮았다. 나르는 수단과 알맹이를 가른다
탈것의 페이로드 로켓이나 트럭이 싣고 가는 짐 이 이름의 뿌리다

표의 악성코드 페이로드는 공격 코드를 두 토막으로 갈라 볼 때 나옵니다. 앞 토막은 빈틈을 파고들어 남의 코드가 돌게 만드는 데까지만 씁니다. 뒤 토막이 하려던 일을 합니다. 그 뒤 토막이 페이로드입니다.

관련 항목

페이로드와 나란히 데이터 단위를 이루는 구성 요소

헤더 · 트레일러 · 체크섬 · 시작줄 · 메타데이터 · 제어 데이터 · 프리앰블

페이로드를 실어 나르는 데이터 단위

패킷 · 프레임 · 세그먼트 · 데이터그램 · 메시지 · PDU · 옥텟

페이로드를 싸고 벗기는 처리 단계

캡슐화 · 역캡슐화 · 단편화 · 재조립 · 직렬화 · 역직렬화 · 프레이밍 · 다중화

페이로드 크기를 좌우하는 상한과 지표

MTU · 경로 MTU 탐색 · MSS · 오버헤드 · 페이로드 크기 · 처리량

페이로드를 실어 나르는 프로토콜

TCP · UDP · IP · 이더넷 · HTTP · MQTT · gRPC · 웹소켓

백엔드 코드가 다루는 페이로드 형식

JSON · XML · Protobuf · 멀티파트 폼데이터 · 요청 본문 · 웹훅

페이로드를 열어 보지 못하게 막는 보호 수단

TLS · 암호화 · 전자 서명 · 무결성 · 종단 간 암호화

페이로드에 실려 들어오는 공격

SQL 인젝션 · 역직렬화 취약점 · 요청 스머글링 · 셸코드 · 크로스 사이트 스크립팅

페이로드가 속하는 상위 분류

프로토콜 · 계층 · OSI 모델 · 네트워크

다른 이름: payload