- Base64 인코딩은 바이너리 데이터를 ASCII 텍스트로 바꿔, 저장·전송 과정에서 데이터가 잘못 해석될 가능성을 줄이는 방식임
- 암호화가 아니라 표현 방식 변경이므로, 인코딩된 데이터는 원래 텍스트나 파일 데이터로 쉽게 되돌릴 수 있음
- 64개 문자는 6비트로 표현 가능해 Base64 한 글자는 6비트 데이터를 담고, 3바이트(24비트)는 네 개의 Base64 문자로 바뀜
- HTML의 Data URLs, 이메일의 바이너리 전송, 텍스트 중심 네트워크나 URL처럼 원시 바이너리가 문제를 일으킬 수 있는 환경에서 유용함
- Ruby, C#, PHP, JavaScript, 터미널의
base64명령 등 여러 언어와 도구가 인코딩·디코딩 기능을 제공함
Base64가 바꾸는 것
- Base64 인코딩은 바이너리 데이터를 텍스트, 더 구체적으로 ASCII 텍스트로 변환함
- 결과는 아래 64개 문자만 사용함
A-Za-z0-9+/
- 이 문자 집합은
<,>,\n같은 문자가 오래된 컴퓨터나 프로그램에서 잘못 해석되는 상황을 피하기 위한 안전한 문자 집합으로 쓰임 "Ruby on Rails"를 Base64로 인코딩하면UnVieSBvbiBSYWlscw==가 됨- Base64는 암호화가 아님
- 인코딩된 데이터는 원래 텍스트로 쉽게 되돌릴 수 있음
- 데이터를 숨기지 않고 데이터의 표현만 바꿈
Base64를 쓰는 상황
- Data URLs는 이미지 같은 파일 데이터를 HTML 안에 직접 넣을 수 있게 하며, 이때 Base64 인코딩된 텍스트를 사용함
- 예시 형식은
data:[<mime type>][;charset=<charset>][;base64],<encoded data>임 - 이메일에서는 서버가 줄바꿈을 바꿀 수 있는 환경에서도 바이너리 데이터를 안전하게 담기 위해 Base64가 쓰여 왔음
- HTML 소스에 이미지 데이터를 직접 넣을 때는
<와>같은 문자가 태그로 해석되지 않도록 인코딩이 필요함 - 텍스트 또는 US-ASCII 데이터를 처리하도록 설계된 네트워크를 통해 바이너리 데이터를 저장하거나 전송할 때도 사용할 수 있음
- URL에 넣기 어려운 문자가 포함된 데이터를 전달할 때도 Base64가 쓰일 수 있음
- Base 계열 인코딩은 객체를 텍스트 편집기로 다룰 수 있게 해 여러 애플리케이션에서 활용됨
인코딩 알고리듬
- Base64 인코딩은 다음 순서로 진행됨
- 텍스트를 바이너리 표현으로 변환함
- 비트를 6비트씩 나눔
- 각 6비트 그룹을 0부터 63까지의 십진수로 변환함
- 이 숫자를 Base64 알파벳의 대응 문자로 바꿈
- 마지막 그룹의 비트가 부족하면
=또는==를 패딩으로 붙일 수 있음 - 64개 문자를 표현하려면 6비트가 필요함
2^6 = 64- Base64 숫자 하나는 6비트 데이터를 나타냄
- 바이트는 8비트이고, 8과 6의 가장 가까운 공배수는 24임
- 24비트는 3바이트임
- 24비트는 네 개의 6비트 Base64 숫자로 표현됨
“Akshay” 인코딩 예시
"Akshay"는 각 문자를 ASCII 숫자로 바꾼 뒤 바이너리로 변환하면 다음과 같음01000001 01101011 01110011 01101000 01100001 01111001
- 이를 6비트 그룹으로 나누면 다음과 같음
010000 010110 101101 110011 011010 000110 000101 111001
- 각 그룹을 십진수로 바꾸면 다음 값을 얻음
16 22 45 51 26 6 5 57
- Base64 알파벳으로 변환하면 다음 문자가 됨
Q W t z a G F 5
- 따라서
"Akshay"의 Base64 표현은QWtzaGF5임 - 같은 방식으로 이미지, PDF, 텍스트, 비디오 같은 파일도 바이너리로 바꾼 뒤 Base64로 인코딩하면 ASCII 텍스트로 저장하거나 전송할 수 있음
언어와 도구에서의 사용
- Ruby는
Base64모듈로 인코딩과 디코딩을 처리함Base64.encode64("Ruby on Rails")Base64.decode64(encoded)
- C#은 문자열을 바이트 배열로 바꾼 뒤
Convert.ToBase64String으로 인코딩하고,System.Convert.FromBase64String으로 디코딩함 - PHP는 최상위 함수인
base64_encode와base64_decode를 제공함 - JavaScript는
btoa()로 인코딩하고atob()로 디코딩함 - 터미널에서도
base64명령으로 인코딩과 디코딩을 수행할 수 있음echo "akshay" | base64는YWtzaGF5Cg==를 출력함echo "YWtzaGF5Cg==" | base64 -d는akshay를 출력함