본문 바로가기
프로그래밍

HTTP Header에는 한글이 포함될 수 없다! Header로 데이터 보내기

by bantomak 2025. 4. 12.
반응형

HTTP Header로 데이터를 보내보자

HTTP 헤더를 통해서 클라이언트는 서버에 각종 데이터를 전송할 수 있다. 하지만 HTTP 헤더는 전송 규약의 일부이기 때문에 ASCII 기반의 매우 엄격한 형식을 따른다.

공식 규격: RFC 7230 - HTTP/1.1 메시지 형식

Header-Name: Header Value
  • Header-Name: ASCII 문자, 숫자, 하이픈(-)만 가능
  • Header-Value: ASCII의 visible character (0x20~0x7E)만 사용 가능

📌 HTTP Header에 포함될수 없는 문자들

  • 제어 문자(\n, \r, \t, \0 등) : ASCII 코드 0~31 및 127
  • 유니코드 문자(한글, 이모지 등) : ASCII 외의 확장 문자
  • 공백 (헤더 값 중간은 가능, 키는 안됨)
  • 콜론(:) : 키에는 불가, 키:값 구분자로만 가능
  • 슬래시 /, 등 특수문자 : 값에는 가능하지만, 상황에 따라 제한됨

Header에 포함될 수 없는 문자열을 추가하는 경우

'System.InvalidOperationException: Header value contains invalid characters'

'System.Net.Http.HttpRequestException: 'Request headers must contain only ASCII characters.'

해당 에러가 발생한다.

X-Name: 홍길동              ← ❌ 유니코드 (한글)
X-Comment: Hello\nWorld     ← ❌ 줄바꿈
X-Data: abc☺def             ← ❌ 이모지/비ASCII 문자

안전하게 HTTP Header 쓰는 법

  • ASCII 문자만 사용하기
  • 값에 한글이나 특수문자를 꼭 넣어야한다면 Base64 인코딩 또는 URL-safe 변환

C# 예제 코드

using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        // 1. 전송할 값 (예: 사용자 이름, JSON 문자열 등)
        string originalValue = "홍길동";

        // 2. 문자열 → UTF-8 바이트 → Base64 인코딩
        byte[] bytes = Encoding.UTF8.GetBytes(originalValue);
        string base64Value = Convert.ToBase64String(bytes);

        // 3. HttpClient 생성
        using var client = new HttpClient();

        // 4. HttpRequestMessage 생성
        var request = new HttpRequestMessage(HttpMethod.Get, "https://example.com/api/data");

        // 5. 커스텀 헤더에 Base64 인코딩된 값 추가
        request.Headers.Add("X-Custom-Header", base64Value);

        // 6. 요청 전송
        HttpResponseMessage response = await client.SendAsync(request);

        // 7. 결과 출력
        string responseBody = await response.Content.ReadAsStringAsync();
        Console.WriteLine("응답: " + responseBody);
    }
}
string header = request.Headers["X-Custom-Header"];
byte[] bytes = Convert.FromBase64String(header);
string decoded = Encoding.UTF8.GetString(bytes);

함께 읽으면 좋은 글

 

64진수로 바꿔보자! Base64 인코딩

Base64 인코딩이란?인터넷 환경이나 암호 관련으로 공부하다 보면 Base64 인코딩과 만나게 될 것이다. Base64 인코딩이란 무엇인지? 그리고 왜 필요한지에 대해서 알아보자. Base64 인코딩이란, 8비트(b

jettstream.tistory.com

 

C# 컴퓨터가 문자를 표현하는 방법, 문자 인코딩

string에서 byte[]로 변환하기string 타입에서 ToCharArray() 함수를 통해서 바로 Char배열로 변환하는 함수는 존재하지만 ToByteArray() 함수는 존재하지 않는다. 그 이유는 무엇일까? 그 이유는 byte[]로 변환

jettstream.tistory.com

헤더 형식 규정

 

RFC 7230: Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing

The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document provides an overview of HTTP architecture and its associated terminology, defines the "http" and "

datatracker.ietf.org

댓글