베이스64
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
Base64는 바이너리 데이터를 64개의 ASCII 문자를 사용하여 텍스트 형식으로 인코딩하는 방식이다. 1987년 PEM 프로토콜에서 처음 표준화되었으며, MIME 규격에서 널리 사용되면서 다양한 환경에 맞춰 변형되어 사용된다. Base64는 데이터를 6비트씩 분할하여 변환표를 통해 문자로 변환하며, 데이터 크기가 약 33% 증가하는 단점이 있다. 이메일 첨부 파일 전송, XML 파일 내 바이너리 데이터 포함, 데이터 URI 스킴 등 다양한 활용 사례가 있다.
더 읽어볼만한 페이지
- 유즈넷 - UUCP
UUCP는 유닉스 시스템 간 파일 복사, 원격 명령 실행, 이메일 및 유즈넷 뉴스 전송을 위한 프로토콜 및 프로그램 모음으로, 초기 인터넷 확장에 중요한 역할을 했으나 TCP/IP 기반 서비스 보편화로 사용이 감소했다. - 유즈넷 - RSSSF
RSSSF는 전 세계 축구 관련 통계 정보를 제공하는 웹사이트이자 프로젝트로, 자원봉사자들의 협력으로 광범위한 데이터를 구축하고 과거에는 '올해의 선수상'을 수여하기도 했다. - 데이터 직렬화 포맷 - XML
XML은 태그 중첩 방식 구문을 사용하는 범용 언어로서, 인터넷을 통한 구조화된 문서 및 데이터 공유를 용이하게 하고, 웰 폼 및 유효 XML 문서 개념을 통해 구문 정확성을 검사하며, 데이터 교환 등 다양한 분야에서 널리 사용된다. - 데이터 직렬화 포맷 - S-표현식
S-표현식은 Lisp 구문에서 소스 코드와 데이터를 표현하는 기본 구조로, 원자와 `(x . y)` 형태의 표현식으로 정의되며, 이진 트리 표현, 다양한 데이터 형식 지원, 그리고 여러 분야에서 활용된다. - 전자 우편 - 전자우편
전자우편은 컴퓨터 네트워크를 이용하여 편지와 메시지를 주고받는 시스템으로, 시분할 메인프레임 통신에서 시작하여 @ 기호 주소 체계 도입 후 아파넷을 통해 대중화되었으며, 다양한 형식의 파일 첨부와 스팸 등의 문제에도 불구하고 널리 사용되는 통신 수단이다. - 전자 우편 - 레이 톰린슨
미국의 프로그래머 레이 톰린슨은 ARPANET에서 이메일 시스템을 개발하고 이메일 주소에 앳(@) 기호를 도입하여 이메일의 아버지로 불린다.
베이스64 | |
---|---|
기본 정보 | |
유형 | 인코딩 체계 |
종류 | 8비트 바이너리 데이터를 래핑하는 7비트 |
사용법 | MIME 데이터 전송 |
상세 정보 | |
설명 | Base64는 2진 데이터를 ASCII 문자열 형식으로 변환하는 인코딩 방식의 총칭이다. |
특징 | 8비트 바이너리 데이터를 래핑하는 7비트 바이너리 데이터를 텍스트 형식으로 전송 가능 MIME에서 널리 사용 |
역사 | 1987년 RFC 986에 처음 등장 RFC 1113에서 PEM에 사용하기 위해 채택 RFC 1421에서 비밀 이메일 전송에 사용하기 위해 다시 채택 현재 RFC 4648에 정의되어 있음 |
변환 과정 | 바이너리 데이터를 6비트 단위로 나눔 각 6비트를 Base64 인덱스 테이블을 사용하여 ASCII 문자로 변환 필요에 따라 패딩 문자 "="을 추가하여 출력 문자열 길이를 조정 |
장점 | 바이너리 데이터를 텍스트 기반 시스템에서 안전하게 전송 가능 다양한 프로그래밍 언어 및 환경에서 지원 |
단점 | 데이터 크기가 약 33% 증가 가독성이 떨어짐 |
주요 용도 | 이메일 첨부 파일 인코딩 웹 페이지 내 이미지 데이터 포함 (데이터 URI 스킴) 인증 토큰 인코딩 설정 파일 또는 데이터베이스에 바이너리 데이터 저장 |
관련 RFC | RFC 986 RFC 1113 RFC 1421 RFC 2045 RFC 4648 |
2. 역사
Base64 인코딩은 1987년 RFC 989에서 제안된 개인 정보 보호 강화 전자 메일(PEM) 프로토콜에서 처음 표준화되었다.[8] PEM은 Base64 인코딩을 사용하여 임의의 옥텟 시퀀스를 SMTP와 같은 전송 프로토콜에서 요구하는 6비트 문자의 짧은 줄로 표현할 수 있는 형식으로 변환했다.[8]
베이스64는 MIME에서 정의하며, 임의의 바이트 스트림을 ASCII 문자들로 바꾸는 인코딩 방식이다. 주로 인터넷 전자 메일 전송 시 MIME의 content transfer encoding의 하나로 사용된다.[25]
PEM의 현재 버전은 대문자와 소문자 로마자(`A`–`Z`, `a`–`z`), 숫자(`0`–`9`), `+` 및 `/` 기호로 구성된 64자 문자 집합을 사용하며, `=` 기호는 패딩 접미사로 사용된다.[4]
이후 MIME(다목적 인터넷 메일 확장)에서 Base64를 두 가지 이진-텍스트 인코딩 방식 중 하나로 채택하면서 널리 사용되기 시작했다.[5] MIME의 Base64 인코딩은 PEM과 동일한 64자 문자 집합 및 인코딩 메커니즘을 사용하며, `=` 기호를 출력 패딩에 사용한다.[5]
3. 작동 원리
베이스64는 원본 데이터를 6비트씩 자른 후, 각 6비트 값을 아래 표에 있는 64개의 ASCII 문자로 변환한다.인덱스 이진수 문자 rowspan="17"| 인덱스 이진수 문자 rowspan="17"| 인덱스 이진수 문자 rowspan="17"| 인덱스 이진수 문자 0 000000 A
16 010000 Q
32 100000 g
48 110000 w
1 000001 B
17 010001 R
33 100001 h
49 110001 x
2 000010 C
18 010010 S
34 100010 i
50 110010 y
3 000011 D
19 010011 T
35 100011 j
51 110011 z
4 000100 E
20 010100 U
36 100100 k
52 110100 0
5 000101 F
21 010101 V
37 100101 l
53 110101 1
6 000110 G
22 010110 W
38 100110 m
54 110110 2
7 000111 H
23 010111 X
39 100111 n
55 110111 3
8 001000 I
24 011000 Y
40 101000 o
56 111000 4
9 001001 J
25 011001 Z
41 101001 p
57 111001 5
10 001010 K
26 011010 a
42 101010 q
58 111010 6
11 001011 L
27 011011 b
43 101011 r
59 111011 7
12 001100 M
28 011100 c
44 101100 s
60 111100 8
13 001101 N
29 011101 d
45 101101 t
61 111101 9
14 001110 O
30 011110 e
46 101110 u
62 111110 +
15 001111 P
31 011111 f
47 101111 v
63 111111 /
colspan="12" | 패딩 =
원본 데이터가 6비트의 배수가 아니라면, 끝에 0을 추가하여 6비트로 만든다. 그리고 결과가 4글자의 배수가 되도록 `=` (패딩) 문자를 추가한다.
Base64 인코딩은 이진 데이터를 ASCII 문자로 인코딩하여, 텍스트만 처리할 수 있는 시스템에서도 데이터를 안정적으로 전송하기 위해 사용된다. 인코딩 결과물은 원본보다 대략 4/3 정도 크기가 늘어나며, 의미 없어 보이는 문자열이 나열된 형태가 된다.
3. 1. 변환 예시
"Man"을 Base64로 인코딩하는 과정은 다음과 같다.
Text content | M | a | n | |||||||||||||||||||||
ASCII | 77 | 97 | 110 | |||||||||||||||||||||
Bit pattern | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
Index | 19 | 22 | 5 | 46 | ||||||||||||||||||||
Base64-Encoded | T | W | F | u |
위 표는 첫 단어인 `Man`을 Base64로 변환하는 과정을 나타낸다.
- Text content: 원본 문자열 "Man"의 각 문자를 나타낸다.
- ASCII: 각 문자에 해당하는 ASCII 코드값 (10진수)을 나타낸다.
- Bit pattern: 각 ASCII 코드값의 8비트 이진수 표현을 나타낸다.
- Index: 24비트 버퍼에 3바이트(24비트)를 채운 후, 앞에서부터 6비트씩 잘라 얻은 값을 나타낸다.
- Base64-Encoded: 각 6비트 인덱스에 해당하는 Base64 문자[25]를 나타낸다. Base64는 64개의 문자(`A-Za-z0-9+/`)를 사용한다.
Base64 인코딩은 세 개의 옥텟을 네 개의 인코딩된 문자로 변환한다.
소스 ASCII 텍스트 | 문자 | M | a | n | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
옥텟 | 77 (0x4d) | 97 (0x61) | 110 (0x6e) | ||||||||||||||||||||||
비트 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | |
Base64 인코딩 | 섹스텟 | 19 | 22 | 5 | 46 | ||||||||||||||||||||
문자 | T | W | F | u | |||||||||||||||||||||
옥텟 | 84 (0x54) | 87 (0x57) | 70 (0x46) | 117 (0x75) |
`=` 패딩 문자는 마지막 인코딩 블록이 네 개의 Base64 문자를 포함하도록 추가될 수 있다.
유효한 입력 옥텟이 두 개뿐인 경우 (예: 'Ma') 또는 마지막 입력 그룹에 옥텟이 두 개만 포함된 경우, 16비트가 모두 처음 세 개의 Base64 숫자 (18비트)로 캡처된다. 마지막 내용 포함 6비트 블록의 두 개의 최소 유효 비트는 0이 되어 디코딩 시 (후속 `=` 패딩 문자와 함께) 폐기된다.
소스 ASCII 텍스트 | 문자 | M | a | colspan="8" rowspan="2" | | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
옥텟 | 77 (0x4d) | 97 (0x61) | |||||||||||||||||||||||
비트 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |||||||
Base64 인코딩 | 섹스텟 | 19 | 22 | 4 | 패딩 | ||||||||||||||||||||
문자 | T | W | E | = | |||||||||||||||||||||
옥텟 | 84 (0x54) | 87 (0x57) | 69 (0x45) | 61 (0x3D) |
유효한 입력 옥텟이 하나만 있는 경우 (예: 'M') 또는 마지막 입력 그룹에 옥텟이 하나만 포함된 경우, 8비트가 모두 처음 두 개의 Base64 숫자 (12비트)로 캡처된다. 마지막 내용 포함 6비트 블록의 네 개의 최소 유효 비트는 0이 되어 디코딩 시 (후속 두 개의 `=` 패딩 문자와 함께) 폐기된다.
소스 ASCII 텍스트 | 문자 | M | colspan="16" rowspan="2" | | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
옥텟 | 77 (0x4d) | ||||||||||||||||||||||||
비트 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | |||||||||||||
Base64 인코딩 | 섹스텟 | 19 | 16 | 패딩 | 패딩 | ||||||||||||||||||||
문자 | T | Q | = | = | |||||||||||||||||||||
옥텟 | 84 (0x54) | 81 (0x51) | 61 (0x3D) | 61 (0x3D) |
Base64 변환 절차는 다음과 같다.
단계 | 상태 | 데이터 |
---|---|---|
1 | 원본 데이터 | `ABCDEFG` (문자열) |
2 | 6비트씩 분할 | ` {010000, 010100, 001001, 000011, 010001, 000100, 010101, 000110, 010001, 11}` (비트열) |
3 | 2비트가 남으므로, 4비트 분량의 0을 추가하여 6비트로 한다 | ` {010000, 010100, 001001, 000011, 010001, 000100, 010101, 000110, 010001, 110000}` (비트열) |
4 | 변환표에 따라, 4문자씩 변환한다 | `QUJD, REVG, Rw` (문자열) |
5 | 마지막 문자열이 2문자 부족하므로, 2문자 분량의 `=` 기호를 추가하여 4문자로 한다 | `QUJD, REVG, Rw==` (문자열) |
6 | 연결하여 Base64 문자열로 만든다 | `QUJDREVGRw==` (문자열) |
4. RFC 문서
RFC 1421은 현재는 사용되지 않는 PEM 프로토콜에서 Base64 인코딩을 정의했다.[4] 이 RFC에서는 대문자와 소문자 로마자(`A`–`Z`, `a`–`z`), 숫자(`0`–`9`), `+` 및 `/` 기호로 구성된 64자 문자 집합을 사용하며, `=` 기호는 패딩 접미사로 사용된다.
RFC 2045는 MIME에서 Base64 전송 인코딩을 정의한다.[5] MIME의 Base64 인코딩은 RFC 1421 버전의 PEM을 기반으로 하며, 동일한 64자 문자 집합 및 인코딩 메커니즘을 사용하고 `=` 기호를 출력 패딩에 사용한다. MIME은 Base64로 인코딩된 줄의 최대 길이를 76자로 지정하며, 표준 64개 인코딩 문자 집합 외부의 문자는 무시해야 하지만, 대부분의 구현에서는 CR/LF 줄 바꿈 쌍을 사용하여 인코딩된 줄을 구분한다.
RFC 3548은 Base16, Base32, Base64 인코딩에 대한 RFC 1421과 RFC 2045의 내용을 통합한 정보 제공 목적의 문서이다.[6] 이 RFC는 인코딩 알파벳 이외의 문자를 사용한 메시지 생성을 허용하지 않으며, 디코더는 인코딩 알파벳 이외의 문자가 포함된 데이터를 거부해야 한다.
RFC 4648은 RFC 3548을 대체하며, Base64, Base32, Base16 인코딩에 대해 설명한다.
RFC 4880은 OpenPGP에서 Radix-64 인코딩을 정의한다. Radix-64는 MIME에서 정의하는 Base64 인코딩과 동일하며, 추가적으로 24비트 CRC 체크섬을 포함한다.
5. 변형
Base64는 다양한 환경에 맞게 변형되어 사용된다.
- URL-safe Base64: URL에서 문제가 될 수 있는 '+'와 '/' 문자를 각각 '-', '_' 문자로 대체한다. (RFC 4648 §5) 유튜브와 같은 사이트에서 이 방식을 사용한다.[12]
- 파일 이름-safe Base64: 파일 이름에서 문제가 될 수 있는 문자를 대체한다.
- UTF-7: Modified BASE64를 사용하여 UTF-16을 7비트 ASCII 문자로 변환한다. (RFC 2152) '=' 패딩 기호는 사용하지 않는다.
- OpenPGP: Radix-64 인코딩은 Base64와 동일하며, 추가적으로 24비트 CRC 체크섬을 포함한다. (RFC 4880)
- 기타: 정규 표현식, XML 등 특정 환경에서 사용되는 변형들이 있다.
변형 | 62번째 문자 | 63번째 문자 | 패딩 | 1행 고정 길이 여부 | 행 최대 길이 | 줄 바꿈 문자 | 지정 문자 외 사용 가능 여부 | 행 체크섬 |
---|---|---|---|---|---|---|---|---|
개인 정보 보호 강화 메일(PEM) Base64 (RFC 1421, 폐기) | + | / | = (필수) | 예 (최종 행 제외) | 64 | CR+LF | 금지 | (없음) |
MIME Base64 전송 인코딩 (RFC 2045) | + | / | = (필수) | 아니요 (가변) | 76 | CR+LF | 허용 (파기됨) | (없음) |
표준 Base64 인코딩 (RFC 4648 §4) | + | / | = (필수) | 예 (최종 행 제외) | 64 또는 76 (줄 바꿈이 필요한 경우) | CR+LF (줄 바꿈이 필요한 경우) | 금지 | (없음) |
OpenPGP용 Radix-64 (RFC 4880) | + | / | = (필수) | 아니요 (가변) | 76 | CR+LF | 금지 | 24비트 CRC (Radix-64 인코딩, pad 문자 포함) |
UTF-7 변형 Base64 (RFC 1642, 폐기) | + | / | (없음) | 아니요 (가변) | (없음) | (없음) | 금지 | (없음) |
파일명 변형 Base64 (비표준) | + | - | (없음) | 아니요 (가변) | (파일 시스템 한계, 보통 255) | (없음) | 금지 | (없음) |
URL 애플리케이션 변형 Base64 (base64url 인코딩) | - | _ | (없음) | 아니요 (가변) | 애플리케이션 의존적 | (없음) | 금지 | (없음) |
XML 이름 토큰용 수정 Base64 (Nmtoken) | . | - | (없음) | 아니요 (가변) | XML 파서 의존적 | (없음) | 금지 | (없음) |
XML 식별자용 수정 Base64 (Name) | _ | : | (없음) | 아니요 (가변) | XML 파서 의존적 | (없음) | 금지 | (없음) |
프로그램 식별자용 수정 Base64 (변종 1, 비표준) | _ | - | (없음) | 아니요 (가변) | 언어·시스템 의존적 | (없음) | 금지 | (없음) |
프로그램 식별자용 수정 Base64 (변종 2, 비표준) | . | _ | (없음) | 아니요 (가변) | 언어·시스템 의존적 | (없음) | 금지 | (없음) |
정규 표현식 변형 Base64 (비표준) | ! | - | (없음) | 아니요 (가변) | 애플리케이션 의존적 | (없음) | 금지 | (없음) |
6. 활용 사례
베이스64는 다양한 상황에서 활용될 수 있다.
- 전자 메일: SMTP 등 7비트 문자열만 주고받을 수 있는 환경에서 첨부 파일 등 바이너리 형식의 데이터를 전송할 때 표준적으로 이용된다.[25]
- HTTP Basic 인증: 사용자 이름과 비밀번호를 콜론(`:`)으로 구분하여 Base64로 인코딩한 문자열이 사용된다.
- 전자 게시판: 이미지나 텍스트 문서를 압축한 파일 등 바이너리 데이터를 주고받기 위해 사용된다.
- 데이터 URI 스킴: 파일 내용을 Base64로 인코딩하여 표현할 수 있다. 예를 들어, 배경 이미지 및 글꼴은 별도의 파일로 제공되는 대신 `data:` URI로 CSS 스타일시트 파일에 지정할 수 있다.
- XML, HTML: 바이너리 데이터를 포함시키기 위해 사용된다. 예를 들어, Firefox의 내보낸 `bookmarks.html` 파일의 favicons.
- 자바스크립트: `atob()`, `btoa()` 메서드를 사용하여 Base64 인코딩 및 디코딩 기능을 제공한다. (HTML5)[12]
- 암호화폐: 공개 키를 Base64로 인코딩된 텍스트 문자열로 표현하여 사용자의 지갑 소프트웨어에 쉽게 복사하여 붙여넣을 수 있다.
- 체크섬 또는 공개 키 지문: 사람이 신속하게 확인해야 하는 바이너리 데이터는 종종 쉽게 확인할 수 있도록 Base64로 표현된다.
- QR 코드: 바이너리 데이터를 포함하는 QR 코드는 때때로 원시 바이너리 데이터를 단순히 저장하는 대신 Base64로 인코딩하여 저장한다.
7. 문제점
베이스64 인코딩을 수행하면 데이터량이 크게 증가한다.[25] 원본 데이터보다 대략 4/3 정도 크기가 늘어난다. 특히 큰 파일을 송수신할 때는 전자 메일 외의 다른 수단을 이용하는 것이 더 빠를 수 있다. 또한, 영문 텍스트에 특수 문자가 섞여 있는 경우에는 특수 문자만 인코딩하는 것이 데이터 효율이 더 좋고, 디코딩을 하지 않아도 대략적인 내용을 파악할 수 있다는 장점이 있다. (Quoted-printable 참조)
참조
[1]
웹사이트
Base64 encoding and decoding – Web APIs
https://developer.mo[...]
MDN Web Docs
[2]
웹사이트
When to base64 encode images (and when not to)
https://www.davidbca[...]
2011-08-28
[3]
IETF
The Base16, Base32, and Base64 Data Encodings
Internet Engineering Task Force
2010-03-18
[4]
IETF
Privacy Enhancement for InternetElectronic Mail: Part I: Message Encryption and Authentication Procedures
Internet Engineering Task Force
2010-03-18
[5]
IETF
Multipurpose Internet Mail Extensions: (MIME) Part One: Format of Internet Message Bodies
Internet Engineering Task Force
2010-03-18
[6]
IETF
The Base16, Base32, and Base64 Data Encodings
Internet Engineering Task Force
2010-03-18
[7]
conference
Base64 Malleability in Practice
https://eprint.iacr.[...]
2022-05-30
[8]
IETF
Privacy Enhancement for Internet Electronic Mail
Internet Engineering Task Force
2010-03-18
[9]
IETF
UTF-7 A Mail-Safe Transformation Format of Unicode
Internet Engineering Task Force
2010-03-18
[10]
IETF
UTF-7 A Mail-Safe Transformation Format of Unicode
Internet Engineering Task Force
2010-03-18
[11]
IETF
OpenPGP Message Format
Internet Engineering Task Force
2010-03-18
[12]
웹사이트
Here's Why YouTube Will Practically Never Run Out of Unique Video IDs
https://www.mentalfl[...]
2016-03-23
[13]
웹사이트
7.3. Base64 utility methods
https://w3c.github.i[...]
World Wide Web Consortium
2018-01-02
[14]
문서
[15]
웹사이트
Encode PDF (Portable Document Format) File (.pdf) to Base64 Data
https://base64.onlin[...]
2024-03-21
[16]
웹사이트
Edit fiddle
http://jsfiddle.net/[...]
[17]
웹사이트
The GEDCOM Standard Release 5.5
http://homepages.roo[...]
Homepages.rootsweb.ancestry.com
2012-06-21
[18]
웹사이트
src/lib/libc/crypt/bcrypt.c r1.1
https://cvsweb.openb[...]
1997-02-13
[19]
웹사이트
6PACK a "real time" PC to TNC protocol
https://web.archive.[...]
2013-05-19
[20]
웹사이트
Shell Arithmetic
https://www.gnu.org/[...]
2020-04-08
[21]
문서
[22]
문서
[23]
문서
[24]
문서
[25]
문서
[26]
문서
[27]
문서
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com