Base64 인코딩/디코딩 치트시트: Windows, Linux, Mac 명령 예제
Windows, Linux, Mac에서 Base64 인코딩 및 디코딩을 수행하세요.
이 치트시트는 certutil, PowerShell, base64를 사용하여 Windows, Linux, macOS에서 Base64를 인코딩하고 디코딩하는 방법을 보여줍니다. 각 시스템마다 다른 플래그도 포함합니다.

이 가이드는 개발자 도구: 최신 개발 워크플로 완전 가이드의 일부입니다. Base64는 모든 3바이트의 입력을 A–Z, a–z, 0–9, +, /에서 선택한 4개 문자로 매핑합니다. 디코딩에는 키가 필요하지 않습니다. 알파벳과 패딩 문자 =만 있으면 원래 바이트를 복원할 수 있습니다.
Linux의 base64는 -w 0이 설정되지 않는 한 76자마다 줄바꿈합니다. macOS의 base64는 -b로 줄바꿈 위치를 설정하지 않는 한 한 줄을 작성합니다. Windows의 certutil -encode는 줄바꿈된 텍스트 주위에 인증서 배너를 추가합니다. 아래 Linux 명령어들은 GNU coreutils 9.7, uutils coreutils 0.10.0, BusyBox 1.37.0, OpenSSL 3.5.5로 실행되었습니다. macOS 명령어는 OS X 10.7부터 해당 바이너리에 문서화된 -i, -D, -b 플래그를 사용합니다.
Windows에서 Base64 인코딩/디코딩
Windows에는 base64 명령어가 기본적으로 제공되지 않습니다. Certutil과 PowerShell이 내장되어 있습니다.
Certutil을 사용한 명령 프롬프트
-
명령 프롬프트를 엽니다.
-
파일을 Base64로 인코딩합니다:
certutil -encode input.bin output.b64input.bin을 파일 경로로,output.b64을 원하는 출력 파일 이름으로 대체합니다. 파일은-----BEGIN CERTIFICATE-----로 시작하고, 줄바꿈된 Base64가 이어지며,-----END CERTIFICATE-----로 끝납니다. -
배너 줄을 제거하고 본문만 출력합니다:
certutil -encode input.bin tmp.b64 && findstr /v /c:- tmp.b64 && del tmp.b64findstr /v /c:-는-를 포함하는 모든 줄을 제거하므로 두 개의 배너가 삭제됩니다. 본문은 여전히 줄바꿈된 상태입니다. PowerShell의[Convert]::ToBase64String은 한 줄로 결과를 반환합니다.
Windows에서 Base64 디코딩 (Certutil)
certutil -decode encoded.b64 decoded.bin
certutil -decode는 -encode가 작성한 배너 파일을 받아들입니다. 또한 원시 Base64 파일도 받아들입니다.
PowerShell을 사용한 인코딩/디코딩
PowerShell의 [Convert]::ToBase64String은 한 줄을 작성하고 배너를 추가하지 않습니다. 더 많은 셸 자동화를 보려면 PowerShell 치트시트를 참조하세요.
파일 인코딩:
[Convert]::ToBase64String([System.IO.File]::ReadAllBytes("C:\path\to\file.bin"))
문자열 인코딩 (UTF-8):
[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("Hello, World!"))
# 출력: SGVsbG8sIFdvcmxkIQ==
Encoding.Unicode는 UTF-16LE입니다. 동일한 문자는 SABlAGwAbABvACwAIABXAG8AcgBsAGQAIQA=로 인코딩됩니다. Linux의 base64는 UTF-8 바이트로 SGVsbG8sIFdvcmxkIQ==를 생성합니다.
Base64를 문자열로 디코딩:
[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("SGVsbG8sIFdvcmxkIQ=="))
# 출력: Hello, World!
Base64를 파일로 디코딩:
[System.IO.File]::WriteAllBytes("decoded.bin", [Convert]::FromBase64String((Get-Content encoded.b64 -Raw)))
FromBase64String은 공백, 탭, 줄바꿈을 허용합니다. BEGIN CERTIFICATE 배너에서는 예외가 발생하므로 certutil 파일은 certutil -decode를 거쳐야 하거나(또는 먼저 배너를 제거해야 합니다).
Linux에서 Base64 인코딩/디코딩
base64 --version은 PATH에 있는 바이너리를 나타냅니다. base64 (GNU coreutils)로 시작하는 줄은 GNU입니다. Ubuntu 25.10과 26.04에서는 /usr/bin/base64가 rust-coreutils의 uutils입니다. 여기서 확인한 26.04 패키지는 uutils coreutils 0.10.0이었습니다. GNU coreutils 9.7은 gnu-coreutils 패키지의 gnubase64입니다.
둘 다 위치 인자 파일, -d / --decode, -i / --ignore-garbage, -w / --wrap을 지원합니다. 기본 줄바꿈 길이는 76입니다. -w 0으로 비활성화할 수 있습니다. uutils 0.10.0은 -D도 -d의 별칭으로 처리합니다. GNU coreutils 9.7은 -D에서 invalid option -- 'D'로 종료됩니다.
이러한 원라이너의 파이프와 따옴표 처리는 Bash 치트시트에서 다룹니다.
파일을 Base64로 인코딩
base64 input_file > output_file
예시:
base64 myfile.txt > encoded.txt
인코딩된 내용을 터미널에 출력하려면:
base64 myfile.txt
문자열을 Base64로 인코딩
printf '%s' 'Hello, World!' | base64 -w 0
# 출력: SGVsbG8sIFdvcmxkIQ==
printf '%s'은 전달한 바이트를 기록하고 멈춥니다. -n이 없는 echo는 줄바꿈을 추가하므로 동일한 텍스트는 SGVsbG8sIFdvcmxkIQo=로 인코딩됩니다. bash에서는 echo -n "Hello, World!" | base64 -w 0이 printf 줄과 일치합니다. echo -n은 모든 sh에 호환되지 않습니다.
줄바꿈 비활성화 (-w 0)
GNU와 uutils는 표준 출력이 파일이나 파이프일 경우를 포함하여 76자마다 줄바꿈합니다. JSON, 환경 변수, URL, Kubernetes의 data 값에는 한 줄이 필요합니다. Terraform의 base64encode()는 표준 Base64 한 줄을 반환하므로, 이것과 비교되는 CLI 출력을 생성하려면 줄바꿈을 비활성화해야 합니다:
base64 -w 0 input_file > output_file
Linux에서 Base64 디코딩
base64 -d encoded_file > decoded_file
# 또는
base64 --decode encoded_file > decoded_file
예시:
printf '%s' 'SGVsbG8sIFdvcmxkIQ==' | base64 -d
# 출력: Hello, World!
GNU coreutils 9.5 이상과 uutils 0.10.0은 = 패딩이 생략된 표준 Base64를 디코딩합니다. printf '%s' 'SGVsbG8' | base64 -d는 Hello를 출력합니다. 인코더는 여전히 패딩을 출력합니다. 이전 버전의 GNU base64는 패딩이 없는 입력을 거부했습니다.
-i / --ignore-garbage는 디코딩 중에 알파벳 외부의 문자를 건너뜁니다. 줄바꿈은 이미 허용됩니다. 공백은 -i가 설정되어 있지 않으면 허용되지 않습니다:
printf '%s' 'SGVs bG8=' | base64 -di
# 출력: Hello
GNU와 uutils에서는 -i가 파일 이름을 받지 않습니다. base64 -i input_file은 input_file을 인코딩합니다. 이름은 위치 인자이고 -i는 디코딩 변경에만 사용되기 때문입니다. macOS에서는 -i가 입력 파일 플래그입니다.
OpenSSL
OpenSSL 3.5.5는 64자마다 줄바꿈합니다. -A를 사용하면 출력을 한 줄로 유지합니다:
printf '%s' 'data' | openssl base64 -e -A
# 출력: ZGF0YQ==
printf '%s' 'ZGF0YQ==' | openssl base64 -d -A
# 출력: data
-A가 없으면 긴 버퍼는 64자마다 끊겨 GNU base64와 다른 너비가 됩니다.
BusyBox
BusyBox 1.37.0은 -d와 -w COL (기본 76, 0은 줄바꿈 비활성화)을 허용합니다. --decode는 unrecognized option '--decode'로 실패하고, -D는 invalid option -- 'D'로 실패합니다. 디코딩은 이미 알파벳 외부의 문자를 건너뜁니다: printf '%s' 'SGVs!bG8=' | busybox base64 -d는 Hello를 출력합니다. -i는 허용되지만 help 줄에 나타나지 않습니다.
macOS에서 Base64 인코딩/디코딩
macOS에는 BSD base64가 제공됩니다. 파일 이름은 -i로 전달합니다. -i 없이 표준 입력 리디렉션이 작동합니다: base64 < input_file.
파일을 Base64로 인코딩
base64 -i input_file > output_file
예시:
base64 -i myfile.txt > encoded.txt
터미널에 출력하려면:
base64 -i myfile.txt
기본 줄바꿈 간격은 0이므로 인코딩된 텍스트는 한 줄입니다. -b count는 count자마다 줄바꿈을 삽입합니다. base64 -w 0은 Linux 옵션이며 macOS 바이너리는 사용하지 않습니다. base64 -b 0 -i input_file이 명시적인 한 줄 형식입니다.
인코딩 및 클립보드 복사
base64 -i input_file | pbcopy
Mac에서 Base64 디코딩
base64 -D -i encoded_file > decoded_file
-D는 디코딩입니다. 이 -i와 -D 플래그는 OS X 10.7부터 macOS 인터페이스였습니다. base64 -d를 호출하는 Linux 스크립트는 macOS에서 base64 -D를 호출해야 합니다.
구현 방식별 플래그
| 플래그 | GNU coreutils 9.7 | uutils 0.10.0 | BusyBox 1.37.0 | macOS |
|---|---|---|---|---|
-d / --decode |
디코딩 | 디코딩 (-D는 별칭) |
-d만; --decode는 오류 |
-D 사용 |
-i |
디코딩 중 --ignore-garbage |
디코딩 중 --ignore-garbage |
허용되지만 --help에 없음; 비알파벳 바이트는 이미 건너뜀 |
입력 파일 |
-w N |
N 열마다 줄바꿈 (기본 76); 0은 비활성화 |
동일한 기본값과 0 |
동일; 장 플래그 없음 | 이 플래그 아님; -b 사용 |
-b N |
허용되지 않음 | 허용되지 않음 | 허용되지 않음 | N자마다 줄바꿈 (기본 0) |
| help 텍스트 알파벳 | RFC 4648 | RFC 3548 | (RFC 줄 없음) | RFC 4648 |
RFC 4648은 RFC 3548를 폐지합니다. 두 문서의 표준 알파벳은 A–Z, a–z, 0–9, +, /입니다.
base64 -i file은 Linux에서 인코딩합니다. -i가 boolean이고 file이 위치 운산자이기 때문입니다. macOS에서 동일한 명령도 인코딩합니다. -i가 file을 입력 경로로 소비하기 때문입니다. base64 -D -i file은 macOS와 uutils 0.10.0에서 디코딩합니다.
JWT를 위한 Base64url
JWT 헤더와 페이로드 세그먼트는 base64url (RFC 4648 섹션 5)을 사용합니다: -와 _가 +와 /를 대체하며, = 패딩은 일반적으로 생략됩니다. 표준 base64 -d는 entonces 실패합니다. uutils 0.10.0에서 오류는 invalid input입니다.
GNU basenc (Ubuntu 26.04의 gnubasenc)는 패딩이 없는 형식을 허용합니다:
printf '%s' 'aGVsbG8_Ky93b3JsZA' | gnubasenc --base64url -d
# 출력: hello?+/world
uutils 0.10.0의 basenc --base64url -d는 4의 배수가 되도록 패딩을 복원해야 합니다. ==가 추가된 동일한 세그먼트는 디코딩됩니다. JWT 스타일 토큰을 위해 인코딩 후 패딩을 제거하세요:
printf '%s' 'hello?+/world' | basenc --base64url -w 0 | tr -d '='
# 출력: aGVsbG8_Ky93b3JsZA
jq는 @base64d로 JWT 세그먼트를 디코딩하며, 이는 JWT 토큰 디코딩 및 출력에서 다룹니다.
PowerShell도 동일한 알파벳을 구성할 수 있습니다:
$b = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("hello?+/world"))
$b.TrimEnd("=").Replace("+","-").Replace("/","_")
일반적인 사용 예
| 사용 예 | 명령 / 방법 |
|---|---|
| JWT 헤더/페이로드 | base64url, 보통 패딩 없음. GNU basenc --base64url -d 또는 jq의 @base64d |
| HTTP Basic Auth | printf '%s' 'user:pass' | base64 -w 0 → Authorization: Basic dXNlcjpwYXNz |
| 파일로부터 Kubernetes secret | kubectl create secret generic mysecret --from-file=key=file.bin |
| 문자열로부터 Kubernetes secret | kubectl create secret generic mysecret --from-literal=key=value |
| cURL Basic Auth | curl -u user:pass 또는 -H "Authorization: Basic $(printf '%s' 'user:pass' | base64 -w 0)" |
| HTML의 Data URI | Linux에서 data:image/png;base64,$(base64 -w 0 image.png) |
kubectl create secret은 --from-literal과 --from-file 값을 스스로 base64-인코딩합니다. --from-literal=key=$(base64 -w 0 file.bin)처럼 값을 base64 -w 0로 접두하면 두 번째 인코딩이 저장되고, 이후의 base64 -d는 여전히 Base64를 반환합니다. Kubernetes 치트시트는 --from-literal=username=admin과 같은 평문 형식을 사용합니다.
매니페스트에서 각 data 값은 이미 표준 Base64 한 줄이며, stringData는 원시 문자열을 담습니다. API 서버는 stringData를 data로 병합합니다. Kubernetes 문서는 stringData가 서버 측 apply와 잘 맞지 않는다고 명시합니다. 객체는 인코딩된 텍스트이며, etcd는 휴면 암호화(encryption at rest)가 켜져 있지 않으면 암호화되지 않은 상태로 저장합니다.
curl -u는 Authorization: Basic 헤더를 작성합니다. user:pass로부터 이 헤더를 구성하는 방법은 cURL 치트시트에서 다룹니다.
디코딩 실패 시
base64 --version은 -D 또는 -w가 이상한 동작을 할 때의 체크입니다. GNU 줄과 uutils 줄은 다르며, Linux의 -D는 uutils 줄과 일치합니다.
빈 줄로 끝나는 디코딩된 값은 echo로부터의 줄바꿈을 포함합니다. 그 입력을 printf '%s'로 다시 인코딩하세요.
base64 file | wc -l은 인코더가 출력한 줄바꿈된 줄의 수를 출력합니다. Linux에서 1보다 큰 수는 -w 0 없이 명령이 실행되었음을 의미합니다.
- 또는 _를 포함하는 텍스트에서 invalid input은 base64url 알파벳이며, JWT 세그먼트의 전형적인 특징입니다. basenc --base64url로 디코딩하고, uutils 0.10.0에서는 길이가 4의 배수가 될 때까지 =를 추가하세요.