오늘 뭐했냐/개발에 대한 주저리

23.09.21 Base64 인코딩

스스로에게 2023. 9. 21. 12:17

Base64

바이너리 데이터를 ASCII 문자열로 표현하기 위한 인코딩 방식입니다.

 

  1. 문자 세트: Base64 인코딩에 사용되는 문자 세트는 대문자 A-Z, 소문자 a-z, 숫자 0-9, 그리고 '+' 와 '/' 총 64개의 문자로 이루어져 있습니다. 또한,  *패딩에 '=' 문자가 사용됩니다.
    *패딩: 데이터를 특정 크기나 형식에 맞추기 위해 추가하는 여분의 데이터를 의미

  2. 작동 방식:
    • *바이너리 데이터를 3바이트씩 그룹화합니다. 즉, 24비트의 데이터 블록을 형성합니다.
    • 이 24비트 블록을 4개의 6비트 블록으로 나눕니다.
    • 각 6비트 블록은 Base64 문자 세트의 하나의 문자에 매핑됩니다.
    • 따라서, 3바이트의 바이너리 데이터는 4개의 Base64 문자로 변환됩니다.
    • 데이터의 길이가 3의 배수가 아닐 경우, '=' 문자로 패딩됩니다.

      *바이너리 데이터: 0과 1로 이루어진 데이터를 의미
  3. 예시:
    • 문자열 "Man"은 바이너리로 **01001101 01000001 01001110**입니다.
    • 이것을 6비트씩 나누면 **010011 010100 000101 001110**이 됩니다.
    • 이 6비트 값들은 Base64 문자 세트에 따라 T, W, F, **u**로 매핑됩니다.
    • 따라서, "Man"은 Base64로 **TWFu**로 인코딩됩니다.
  4. 활용:
    • 바이너리 데이터가 포함된 이메일, 웹 페이지 내 이미지 데이터 (Data URI) 등에서 활용됩니다.
    • 단순히 인코딩 방식이기 때문에 보안 기능은 제공하지 않습니다. 즉, Base64는 암호화 방식이 아닙니다.
  5. 장점:
    • 바이너리 데이터를 안전하게 텍스트 포맷으로 전송하거나 저장할 수 있습니다.
    • 대부분의 문자 인코딩 스키마와 호환됩니다.
  6. 단점:
    • Base64로 인코딩하면 원래 데이터보다 대략 33% 크기가 커집니다.
    • 인코딩/디코딩에는 약간의 오버헤드가 발생합니다.
  7. 패딩 추가 설명

3바이트 데이터의 인코딩:

  • 3바이트의 데이터는 24비트입니다.
  • 이 24비트를 4개의 6비트 청크로 나눕니다.
  • 각 6비트 청크는 Base64 문자열의 한 문자에 대응됩니다.
  • 따라서, 3바이트의 데이터는 항상 4개의 Base64 문자로 인코딩됩니다.

길이가 3의 배수가 아닌 데이터의 처리

  • 원본 데이터가 1바이트 또는 2바이트로 끝날 경우, 전체 길이를 3바이트로 만들기 위해 패딩이 필요하게 됩니다.
  • 1바이트의 데이터만 있을 경우, 이후 2바이트는 패딩 바이트로 취급되어 Base64 인코딩 시에 2개의 '=' 문자로 표현됩니다.
  • 2바이트의 데이터만 있을 경우, 마지막 1바이트는 패딩 바이트로 취급되어 Base64 인코딩 시에 1개의 '=' 문자로 표현됩니다.

 

  1. 1바이트 데이터의 경우:
    • 예: "A"
    • 바이트: 01000001
    • 이 8비트 데이터 뒤에 16비트의 패딩이 필요하게 됩니다.
    • 6비트로 나눈 후 Base64로 인코딩하면: QQ==
  2. 2바이트 데이터의 경우:
    • 예: "AB"
    • 바이트: 01000001 01000010
    • 이 16비트 데이터 뒤에 8비트의 패딩이 필요하게 됩니다.
    • 6비트로 나눈 후 Base64로 인코딩하면: QUI=
  3. 3바이트 데이터의 경우:
    • 예: "ABC"
    • 바이트: 01000001 01000010 01000011
    • 추가 패딩은 필요 없습니다.
    • 6비트로 나눈 후 Base64로 인코딩하면: QUJD

 

 

정리하면 알파벳 대소문자와 숫자를 0과 1로 이루어진 바이너리 데이터로 바꿔주는 것이다.