Computer Science/Network

Base64 μΈμ½”λ”©μ΄λž€ λ¬΄μ—‡μΌκΉŒ? Base64 μΈμ½”λ”©μ˜ 원리, μ‚¬μš©ν•˜λŠ” 이유, 그리고 μΈμ½”λ”©μ˜ 본질

ν”„λ‘œκ·Έλž˜λ¨Έ μ˜€μ›” 2026. 4. 21.

πŸ“κ°œμš”

λ°±μ—”λ“œ κ°œλ°œμ„ ν•˜λ‹€ λ³΄λ©΄ Base64λ₯Ό μƒκ°λ³΄λ‹€ μžμ£Ό λ§ˆμ£ΌμΉ˜κ²Œ λ©λ‹ˆλ‹€. νŒŒμΌ μ—…λ‘œλ“œ APIλ₯Ό λ§Œλ“€ λ•Œλ„ λ³΄κ²Œ λ˜κ³ , JWTλ₯Ό λ‹€λ£° λ•Œλ„ λ³΄κ²Œ λ˜λ©°, μΈμ¦μ„œλ‚˜ ν‚€ νŒŒμΌμ„ μ²˜λ¦¬ν•  λ•Œλ„ μžμ—°μŠ€λŸ½κ²Œ λ“±μž₯ν•©λ‹ˆλ‹€. κ·ΈλŸ°λ° λ§‰μƒ “Base64κ°€ μ •ν™•νžˆ λ¬΄μ—‡μΈκ°€μš”?”라고 μ§ˆλ¬Έμ„ λ°›μœΌλ©΄, λ‹¨μˆœνžˆ “λ¬Έμžμ—΄λ‘œ λ°”κΏ”μ£ΌλŠ” λ°©μ‹μž…λ‹ˆλ‹€” μ •λ„λ‘œλ§Œ μ„€λͺ…ν•˜κ³  λ„˜μ–΄κ°€λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€. μ‹€λ¬΄μ—μ„œλŠ” μ΄ μ •도 μ΄ν•΄λ§ŒμœΌλ‘œλ„ μ‚¬μš©ν•  μˆ˜λŠ” μžˆμ§€λ§Œ, μ‘°κΈˆλ§Œ λ” κΉŠμ΄ λ“€μ–΄κ°€ λ³΄λ©΄ μ™œ μ΄λŸ° λ°©μ‹μ΄ ν•„μš”ν•œμ§€, μ–΄λ–€ μ›λ¦¬λ‘œ λ™μž‘ν•˜λŠ”μ§€, λ¬΄μ—‡κ³Ό ν—·κ°ˆλ¦¬κΈ° μ‰¬μš΄μ§€κΉŒμ§€ μ •ν™•νžˆ μ΄ν•΄ν•˜κ³  κ³„μ‹œλŠ” κ²ƒμ΄ ν›¨μ”¬ μ€‘μš”ν•©λ‹ˆλ‹€.

 


특히 Base64λŠ” λ¬Έμž μΈμ½”λ”©, μ••μΆ•, μ•”ν˜Έν™”μ™€ μžμ£Ό ν˜Όλ™λ©λ‹ˆλ‹€. μ‹€μ œλ‘œ κ°œλ°œμ„ ν•˜λ‹€ 보면 “이거 Base64둜 μ•”ν˜Έν™”λœ κ°’ μ•„λ‹Œκ°€μš”?” λ˜λŠ” “UTF-8μ΄λž‘ Base64κ°€ λΉ„μŠ·ν•œ κ°œλ…μΈκ°€μš”?” 같은 질문이 자주 λ‚˜μ˜΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ Base64λŠ” 이런 κ°œλ…λ“€κ³Ό 결이 λ‹€λ¦…λ‹ˆλ‹€. κ·Έλž˜μ„œ 이번 κΈ€μ—μ„œλŠ” Base64λ₯Ό λ‹¨μˆœνžˆ “μ™Έμ›Œμ„œ μ“°λŠ” 기술”이 μ•„λ‹ˆλΌ μ™œ ν•„μš”ν•œμ§€, μ–΄λ–€ μ›λ¦¬λ‘œ λ™μž‘ν•˜λŠ”μ§€, 어디에 μ‚¬μš©λ˜λŠ”μ§€, 무엇과 λ‹€λ₯Έμ§€κΉŒμ§€ ν•œ λ²ˆμ— μ •λ¦¬ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

 

 

πŸ€”Base64λŠ” 무엇인가?

Base64λ₯Ό ν•œ λ¬Έμž₯으둜 μ •μ˜ν•˜λ©΄, λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λ₯Ό ν…μŠ€νŠΈλ‘œ μ•ˆμ „ν•˜κ²Œ ν‘œν˜„ν•˜κΈ° μœ„ν•œ μΈμ½”λ”© λ°©μ‹μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ ν•΅μ‹¬μ€ “λ°”μ΄λ„ˆλ¦¬λ₯Ό ν…μŠ€νŠΈμ²˜λŸΌ λ³΄μ΄κ²Œ λ°”κΎΌλ‹€”λŠ” μ μž…λ‹ˆλ‹€.

 


컴퓨터 λ‚΄λΆ€μ—μ„œ λ°μ΄ν„°λŠ” κ²°κ΅­ λ°”μ΄νŠΈ λ‹¨μœ„λ‘œ λ‹€λ€„μ§‘λ‹ˆλ‹€. μ΄λ―Έμ§€ νŒŒμΌλ„, PDF도, μ˜€λ””μ˜€ νŒŒμΌλ„, μ‹¬μ§€μ–΄ μš°λ¦¬κ°€ λ‹€λ£¨λŠ” λ¬Έμžμ—΄μ‘°μ°¨λ„ κ²°κ΅­μ€ λ°”μ΄νŠΈμ—΄μž…λ‹ˆλ‹€. κ·ΈλŸ°λ° λͺ¨λ“  μ‹œμŠ€ν…œμ΄ μ΄λŸ° λ°”μ΄νŠΈλ“€μ„ κ·ΈλŒ€λ‘œ μ•ˆμ „ν•˜κ²Œ μ£Όκ³ λ°›μ„ μˆ˜ μžˆλŠ” κ²ƒμ€ μ•„λ‹™λ‹ˆλ‹€. νŠΉνžˆ κ³Όκ±°μ˜ λ§Žμ€ ν”„λ‘œν† μ½œκ³Ό μ‹œμŠ€ν…œμ€ ν…μŠ€νŠΈ μ€‘심, λ” μ •ν™•νžˆλŠ” ASCII λ¬Έμž μ€‘μ‹¬μœΌλ‘œ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŸ° ν™˜κ²½μ—μ„œλŠ” νŠΉμ • λ°”μ΄νŠΈ κ°’이 μ œμ–΄ λ¬Έμžλ‘œ ν•΄μ„λ˜κ±°λ‚˜, μ€„λ°”κΏˆμœΌλ‘œ μ˜€μΈλ˜κ±°λ‚˜, λ¬Έμžμ—΄μ˜ μ’…λ£Œλ‘œ λ°›μ•„λ“€μ—¬μ Έ λ°μ΄ν„°κ°€ μ†μƒλ  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

 


이 λ¬Έμ œλ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ“±μž₯ν•œ κ²ƒμ΄ λ°”λ‘œ Base64μž…λ‹ˆλ‹€. μ›λ³Έμ΄ λ°”μ΄λ„ˆλ¦¬μ΄λ”λΌλ„, μ΄λ₯Ό μ•ˆμ „ν•œ λ¬Έμž μ§‘ν•©μœΌλ‘œ λ°”κΎΈμ–΄ ν…μŠ€νŠΈ κΈ°λ°˜ μ‹œμŠ€ν…œμ—μ„œλ„ λ¬Έμ œ μ—†μ΄ μ „달할 μˆ˜ μžˆλ„둝 λ§Œλ“  κ²ƒμž…λ‹ˆλ‹€. μ¦‰ Base64의 λ³Έμ§ˆμ€ λ°μ΄ν„°λ₯Ό μˆ¨κΈ°λŠ” κ²ƒμ΄ μ•„λ‹ˆλΌ, μ „달 κ°€λŠ₯ν•œ ν˜•νƒœλ‘œ λ°”κΎΈλŠ” κ²ƒμ΄λΌκ³  λ³΄μ‹œλ©΄ λ©λ‹ˆλ‹€.

 

 

 

β“κ·ΈλŸΌ 인코딩은 λ¬΄μ—‡μΌκΉŒ?

Base64λ₯Ό μ œλŒ€λ‘œ μ΄ν•΄ν•˜λ €λ©΄ “인코딩”μ΄λΌλŠ” 단어뢀터 μ •ν™•νžˆ 짚고 λ„˜μ–΄κ°€μ•Ό ν•©λ‹ˆλ‹€. κ°œλ°œμ„ ν•˜λ‹€ 보면 μΈμ½”λ”©μ΄λΌλŠ” 말을 λ„ˆλ¬΄ 넓은 의미둜 μ‚¬μš©ν•˜κ²Œ λ˜λŠ”λ°, 사싀 인코딩은 μ–΄λ–€ 데이터λ₯Ό λ‹€λ₯Έ ν‘œν˜„ λ°©μ‹μœΌλ‘œ λ°”κΎΈλŠ” κ·œμΉ™μž…λ‹ˆλ‹€. 즉, λ°μ΄ν„°μ˜ 의미λ₯Ό λ°”κΎΈλŠ” 것이 μ•„λ‹ˆλΌ ν‘œν˜„ λ°©μ‹λ§Œ λ°”κΎΈλŠ” κ²ƒμž…λ‹ˆλ‹€.

 

 

예λ₯Ό λ“€μ–΄ UTF-8은 문자λ₯Ό λ°”μ΄νŠΈλ‘œ λ°”κΎΈλŠ” κ·œμΉ™μž…λ‹ˆλ‹€. "κ°€"λΌλŠ” 문자λ₯Ό μ €μž₯ν•˜κ±°λ‚˜ μ „μ†‘ν•˜λ €λ©΄, λ¨Όμ € 이것을 λ°”μ΄νŠΈλ‘œ λ°”κΏ”μ•Ό ν•˜λŠ”λ°, κ·Έλ•Œ μ–΄λ–€ λ°”μ΄νŠΈ μ‘°ν•©μœΌλ‘œ ν‘œν˜„ν• μ§€ μ •ν•˜λŠ” κ·œμΉ™μ΄ UTF-8 같은 문자 μΈμ½”λ”©μž…λ‹ˆλ‹€. 반면 Base64λŠ” 이미 μ‘΄μž¬ν•˜λŠ” λ°”μ΄νŠΈμ—΄μ„ λ‹€μ‹œ ν…μŠ€νŠΈ ν˜•νƒœμ˜ λ¬Έμžμ—΄λ‘œ ν‘œν˜„ν•˜λŠ” κ·œμΉ™μž…λ‹ˆλ‹€. λ‘˜ λ‹€ μΈμ½”λ”©μ΄μ§€λ§Œ, λŒ€μƒκ³Ό λͺ©μ μ΄ μ™„μ „νžˆ λ‹€λ¦…λ‹ˆλ‹€.

 

μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. 문자 인코딩은 문자λ₯Ό λ°”μ΄νŠΈλ‘œ λ°”κΎΈλŠ” κ·œμΉ™μž…λ‹ˆλ‹€.
    예: ASCII, EUC-KR, UTF-8, UTF-16
  2. Base64 같은 ν‘œν˜„ 인코딩은 λ°”μ΄νŠΈλ₯Ό λ‹€μ‹œ μ•ˆμ „ν•œ ν…μŠ€νŠΈ λ¬Έμžμ—΄λ‘œ λ°”κΎΈλŠ” κ·œμΉ™μž…λ‹ˆλ‹€.

즉 UTF-8은 "문자 → λ°”μ΄νŠΈ"이고, Base64λŠ” "λ°”μ΄νŠΈ → μ•ˆμ „ν•œ 문자"μž…λ‹ˆλ‹€. 이 차이λ₯Ό μ΄ν•΄ν•˜μ§€ λͺ»ν•˜λ©΄ Base64λ₯Ό 문자 인코딩과 λΉ„μŠ·ν•œ κ²ƒμœΌλ‘œ μ˜€ν•΄ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

 

 

πŸ”„οΈμ™œ Base64κ°€ ν•„μš”ν• κΉŒ?

Base64κ°€ ν•„μš”ν•œ μ΄μœ λŠ” λͺ…ν™•ν•©λ‹ˆλ‹€. λͺ¨λ“  μ‹œμŠ€ν…œμ΄ λ°”μ΄λ„ˆλ¦¬λ₯Ό μ•ˆμ „ν•˜κ²Œ λ‹€λ£¨μ§€λŠ” λͺ»ν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ˜ˆμ „λΆ€ν„° λ§Žμ€ 톡신 ν”„λ‘œν† μ½œμ€ ν…μŠ€νŠΈλ₯Ό μ£Όκ³ λ°›λŠ” 데 μ΅œμ ν™”λ˜μ–΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 특히 μ΄λ©”μΌμ΄λ‚˜ 일뢀 ν…μŠ€νŠΈ 기반 전솑 λ°©μ‹μ—μ„œλŠ” λ°”μ΄λ„ˆλ¦¬ 데이터가 ν¬ν•¨λ˜λ©΄ λ¬Έμ œκ°€ 생기기 μ‰¬μ› μŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ°”μ΄λ„ˆλ¦¬ 데이터 μ•ˆμ—λŠ” λ‹€μŒκ³Ό 같은 값듀이 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 0x00 : null λ°”μ΄νŠΈ
  • 0x0A : μ€„λ°”κΏˆ
  • 0x0D : 캐리지 리턴
  • 0xFF : ν™•μž₯ λ°”μ΄νŠΈ

μ•žμ„œ λ§ν•œ 바와 같이 이런 값듀은 ν…μŠ€νŠΈ ν”„λ‘œν† μ½œ μ•ˆμ—μ„œ λ‹€μŒκ³Ό 같은 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. λ¬Έμžμ—΄μ˜ 끝으둜 잘λͺ» 인식될 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. μ€„λ°”κΏˆμ΄λ‚˜ μ œμ–΄ 문자둜 해석될 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. 전솑 κ³Όμ •μ—μ„œ 깨질 수 μžˆμŠ΅λ‹ˆλ‹€.
  4. 쀑간 μ‹œμŠ€ν…œμ΄ 잘λͺ» μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ μ΄λ―Έμ§€λ‚˜ λ¬Έμ„œ, μΈμ¦μ„œ, μ„œλͺ…κ°’, ν•΄μ‹œκ°’ 같은 λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό 직접 λ³΄λ‚΄λŠ” λŒ€μ‹ , λͺ¨λ‘κ°€ μ•ˆμ „ν•˜κ²Œ λ‹€λ£° 수 μžˆλŠ” λ¬Έμžλ“€λ‘œ λ°”κΎΌ λ’€ λ³΄λ‚΄λŠ” 방식이 ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€. Base64λŠ” λ°”λ‘œ 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 널리 μ‚¬μš©λ˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.

 

 

βœ”οΈBase64의 핡심 원리

Base64의 핡심은 64개의 문자둜 데이터λ₯Ό ν‘œν˜„ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이름 κ·ΈλŒ€λ‘œ 64개의 문자 집합을 μ‚¬μš©ν•©λ‹ˆλ‹€. 일반적으둜 μ‚¬μš©ν•˜λŠ” 문자 집합은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • A-Z : 26개
  • a-z : 26개
  • 0-9 : 10개
  • + : 1개
  • / : 1개

총 64κ°œμž…λ‹ˆλ‹€.

μ™œ ν•˜ν•„ 64κ°œμΌκΉŒμš”? μ΄μœ λŠ” 64κ°€ 2^6이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

Base64λŠ” 데이터λ₯Ό 6λΉ„νŠΈ λ‹¨μœ„λ‘œ μͺΌκ°œμ–΄ ν•΄μ„ν•©λ‹ˆλ‹€. μ»΄ν“¨ν„°μ˜ κΈ°λ³Έ μ €μž₯ λ‹¨μœ„λŠ” 8λΉ„νŠΈ, 즉 1λ°”μ΄νŠΈμΈλ°, Base64λŠ” 이 λ°”μ΄νŠΈ 흐름을 6λΉ„νŠΈμ”© μž˜λΌμ„œ 각 값을 ν•˜λ‚˜μ˜ λ¬Έμžμ— λŒ€μ‘μ‹œν‚΅λ‹ˆλ‹€. 각 λ¬ΈμžλŠ” 0λΆ€ν„° 63κΉŒμ§€μ˜ 값을 ν‘œν˜„ν•œλ‹€κ³  μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€. 

6λΉ„νŠΈμ—μ„œ μ΅œλŒ€λ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” μˆ«μžλŠ” 63이고 μ΅œμ†ŒλŠ” 0 이기 λ•Œλ¬Έμ— 이 64개 κΈ€μžλ₯Ό μ΄μš©ν•΄μ„œ 각 6λΉ„νŠΈμ— ν•΄λ‹Ήν•˜λŠ” 수의 값을 λ‚˜νƒ€λ‚΄λŠ” κ²ƒμž…λ‹ˆλ‹€. 

 

 

예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό 같은 λ°©μ‹μž…λ‹ˆλ‹€.

  • 0 → A
  • 1 → B
  • 25 → Z
  • 26 → a
  • 51 → z
  • 52 → 0
  • 61 → 9
  • 62 → +
  • 63 → /

즉, Base64 μΈμ½”λ”©μ΄λž€ 원본 λ°”μ΄νŠΈμ—΄μ„ 6λΉ„νŠΈ λ‹¨μœ„μ˜ κ°’λ“€λ‘œ μž¬κ΅¬μ„±ν•œ λ’€, κ·Έ 값을 λ¬Έμžν‘œμ— λŒ€μ‘μ‹œν‚€λŠ” κ³Όμ •μž…λ‹ˆλ‹€.

 

 

πŸ”’Base64 인코딩 κ³Όμ •

이 뢀뢄은 κΈ€λ‘œλ§Œ 보면 쑰금 좔상적일 수 있기 λ•Œλ¬Έμ—, 많이 μ‚¬μš©ν•˜λŠ” μ˜ˆμ‹œμΈ "Man"을 κΈ°μ€€μœΌλ‘œ λ‹¨κ³„λ³„λ‘œ λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

"Man"이 "TWFu"κ°€ λ˜λŠ” κ³Όμ •

  1. λ¨Όμ € "Man"의 각 문자λ₯Ό ASCII λ°”μ΄νŠΈλ‘œ λ°”κΏ‰λ‹ˆλ‹€.
    • M = 77
    • a = 97
    • n = 110
  2. 이λ₯Ό 2μ§„μˆ˜ 8λΉ„νŠΈλ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€.
    • M = 01001101
    • a = 01100001
    • n = 01101110
  3. μ„Έ λ°”μ΄νŠΈλ₯Ό ν•˜λ‚˜λ‘œ μ΄μ–΄λΆ™μž…λ‹ˆλ‹€.
    • 01001101 01100001 01101110
  4. 총 24λΉ„νŠΈκ°€ λ§Œλ“€μ–΄μ§€λ―€λ‘œ 이λ₯Ό 6λΉ„νŠΈμ”© λ‚˜λˆ•λ‹ˆλ‹€.
    • 010011
    • 010110
    • 000101
    • 101110
  5. 각 6λΉ„νŠΈλ₯Ό 10μ§„μˆ˜ κ°’μœΌλ‘œ λ°”κΏ‰λ‹ˆλ‹€.
    • 010011 = 19
    • 010110 = 22
    • 000101 = 5
    • 101110 = 46
  6. 각 값을 Base64 λ¬Έμžν‘œμ— λŒ€μ‘μ‹œν‚΅λ‹ˆλ‹€.
    • 19 → T
    • 22 → W
    • 5 → F
    • 46 → u
  7. μ΅œμ’… κ²°κ³ΌλŠ” "TWFu"κ°€ λ©λ‹ˆλ‹€.

이 과정을 보면 Base64κ°€  λΉ„νŠΈ λ‹¨μœ„ μž¬λ°°μ—΄κ³Ό 문자 λ§€ν•‘λ§ŒμœΌλ‘œ λ™μž‘ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

β‰οΈμ™œ 3λ°”μ΄νŠΈκ°€ 4λ¬Έμžκ°€ 될까?

Base64λ₯Ό 이해할 λ•Œ κ°€μž₯ μ€‘μš”ν•œ ꡬ쑰 쀑 ν•˜λ‚˜κ°€ λ°”λ‘œ μ΄κ²ƒμž…λ‹ˆλ‹€. Base64λŠ” 6λΉ„νŠΈ λ‹¨μœ„λ‘œ 데이터λ₯Ό ν‘œν˜„ν•˜λŠ”λ°, 원본 λ°μ΄ν„°λŠ” 8λΉ„νŠΈ λ‹¨μœ„μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ 계산해보면 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. 원본 3λ°”μ΄νŠΈλŠ” 3 × 8 = 24λΉ„νŠΈμž…λ‹ˆλ‹€.
  2. Base64λŠ” 6λΉ„νŠΈμ”© 자λ₯΄λ―€λ‘œ 24 ÷ 6 = 4μž…λ‹ˆλ‹€.
  3. λ”°λΌμ„œ 3λ°”μ΄νŠΈ μž…λ ₯은 4개의 Base64 문자 좜λ ₯으둜 λ³€ν™˜λ©λ‹ˆλ‹€.

이 κ΅¬μ‘°λŠ” Base64 μΈμ½”λ”©μ˜ κΈ°λ³Έ νŒ¨ν„΄μž…λ‹ˆλ‹€. μž…λ ₯ 데이터가 길어지더라도 λ‚΄λΆ€μ μœΌλ‘œλŠ” 계속 3λ°”μ΄νŠΈμ”© μ²˜λ¦¬λ˜μ–΄ 4λ¬Έμžμ”© 좜λ ₯λœλ‹€κ³  μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

 

 

 

⬆️Base64인코딩을 ν•˜λ©΄ 원본보닀 데이터 크기가 μ»€μ§€λŠ” 이유

Base64λ₯Ό 처음 μ ‘ν•˜μ‹œλŠ” λΆ„λ“€ μ€‘μ—λŠ” “μ΄μƒν•œ λ¬Έμžμ—΄λ‘œ λ°”λ€Œμ—ˆμœΌλ‹ˆ 데이터가 쀄어든 것 μ•„λ‹Œκ°€μš”?”라고 μƒκ°ν•˜μ‹œλŠ” κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” λ°˜λŒ€μž…λ‹ˆλ‹€. Base64λŠ” 데이터λ₯Ό μ••μΆ•ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 였히렀 원본보닀 μ•½ 33% 정도 크기가 μ¦κ°€ν•©λ‹ˆλ‹€.

 

μ΄μœ λ„ κ°„λ‹¨ν•©λ‹ˆλ‹€.

  1. 원본 3λ°”μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€.
  2. Base64둜 λ³€ν™˜ν•˜λ©΄ 4λ¬Έμžκ°€ λ©λ‹ˆλ‹€.
  3. 이 4λ¬ΈμžλŠ” 보톡 ASCII λ¬Έμžμ΄λ―€λ‘œ 1λ¬Έμžλ‹Ή 1λ°”μ΄νŠΈλ‘œ 생각할 수 μžˆμŠ΅λ‹ˆλ‹€.
  4. 결과적으둜 3λ°”μ΄νŠΈ → 4λ°”μ΄νŠΈκ°€ λ©λ‹ˆλ‹€.

μ¦κ°€μœ¨λ‘œ κ³„μ‚°ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • μ¦κ°€ν•œ 크기: 4 - 3 = 1
  • 원본 λŒ€λΉ„ μ¦κ°€μœ¨: 1 / 3 → 33.3%

즉 Base64λŠ” 전솑 ν˜Έν™˜μ„±μ„ μ–»λŠ” λŒ€μ‹ , 크기 μ¦κ°€λΌλŠ” λΉ„μš©μ„ μ§€λΆˆν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. κ·Έλž˜μ„œ λŒ€μš©λŸ‰ νŒŒμΌμ„ Base64둜 κ°μ‹Έμ„œ JSON에 λ„£λŠ” 방식은 μ‹€λ¬΄μ—μ„œ κ½€ λΉ„νš¨μœ¨μ μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

🟰 = νŒ¨λ”© λΆ™λŠ” 이유

Base64λŠ” 기본적으둜 3λ°”μ΄νŠΈ λ‹¨μœ„λ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€. 그런데 μž…λ ₯ 데이터 길이가 항상 3의 λ°°μˆ˜λŠ” μ•„λ‹™λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ§ˆμ§€λ§‰μ— 1λ°”μ΄νŠΈλ§Œ λ‚¨κ±°λ‚˜ 2λ°”μ΄νŠΈλ§Œ 남을 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ λ“±μž₯ν•˜λŠ” 것이 = νŒ¨λ”©μž…λ‹ˆλ‹€.

 

1λ°”μ΄νŠΈλ§Œ λ‚¨λŠ” 경우

예λ₯Ό λ“€μ–΄ "M" ν•˜λ‚˜λ§Œ μžˆλ‹€κ³  κ°€μ •ν•˜κ² μŠ΅λ‹ˆλ‹€.

  1. M의 ASCII 값은 77μž…λ‹ˆλ‹€.
  2. 2μ§„μˆ˜λ‘œλŠ” 01001101μž…λ‹ˆλ‹€.
  3. Base64λŠ” 6λΉ„νŠΈ λ‹¨μœ„λ‘œ μž˜λΌμ•Ό ν•˜λŠ”λ°, ν˜„μž¬λŠ” 8λΉ„νŠΈλΏμž…λ‹ˆλ‹€.
  4. λΆ€μ‘±ν•œ λΉ„νŠΈλŠ” 0으둜 μ±„μ›Œ κ³„μ‚°ν•©λ‹ˆλ‹€.
  5. 그리고 μ›λž˜ 데이터가 λΆ€μ‘±ν–ˆλ‹€λŠ” 사싀을 ν‘œμ‹œν•˜κΈ° μœ„ν•΄ κ²°κ³Ό 뒀에 ==λ₯Ό λΆ™μž…λ‹ˆλ‹€.

κ²°κ³ΌλŠ” "TQ=="κ°€ λ©λ‹ˆλ‹€.

 

 

2λ°”μ΄νŠΈκ°€ λ‚¨λŠ” 경우

μ΄λ²ˆμ—λŠ” "Ma"λ₯Ό λ³΄κ² μŠ΅λ‹ˆλ‹€.

  1. M = 01001101
  2. a = 01100001
  3. ν•©μΉ˜λ©΄ 16λΉ„νŠΈμž…λ‹ˆλ‹€.
  4. 6λΉ„νŠΈ λ‹¨μœ„λ‘œ 자λ₯΄λ©΄ λ§ˆμ§€λ§‰ 그룹이 λΆ€μ‘±ν•©λ‹ˆλ‹€.
  5. λΆ€μ‘±ν•œ 뢀뢄은 0으둜 μ±„μ›λ‹ˆλ‹€.
  6. λ§ˆμ§€λ§‰μ΄ μ™„μ „ν•œ 3λ°”μ΄νŠΈκ°€ μ•„λ‹ˆμ—ˆλ‹€λŠ” 것을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ = ν•˜λ‚˜λ₯Ό λΆ™μž…λ‹ˆλ‹€.

κ²°κ³ΌλŠ” "TWE="κ°€ λ©λ‹ˆλ‹€.

즉 =λŠ” μ‹€μ œ 데이터가 μ•„λ‹ˆλΌ, λ§ˆμ§€λ§‰ 블둝이 덜 μ°Όλ‹€λŠ” 것을 μ•Œλ €μ£ΌλŠ” ν‘œμ‹œμž…λ‹ˆλ‹€. λ””μ½”λ”©ν•˜λŠ” μͺ½μ—μ„œλŠ” 이 νŒ¨λ”©μ„ 보고 μ›λž˜ 데이터 길이λ₯Ό μ •ν™•νžˆ 볡원할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

πŸ”Έμ•”ν˜Έν™”μ™€ Base64 μΈμ½”λ”©μ˜ 차이

Base64λŠ” μ•”ν˜Έν™”κ°€ μ•„λ‹™λ‹ˆλ‹€. 단지 ν‘œν˜„ 방식이 바뀐 κ²ƒλΏμž…λ‹ˆλ‹€.

κ²°κ³Ό λ¬Έμžμ—΄μ΄ λ°”λ‘œ 읽기 μ–΄λ ΅λ‹€λŠ” 이유둜 μ•”ν˜Έν™”μ²˜λŸΌ 보일 μˆ˜λŠ” μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ Base64λŠ” λˆ„κ΅¬λ‚˜ κ·œμΉ™λ§Œ μ•Œλ©΄ μ¦‰μ‹œ μ›λž˜ λ°μ΄ν„°λ‘œ 볡원할 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ SGVsbG8=λΌλŠ” 값을 보면 얼핏 λ³΅μž‘ν•΄ λ³΄μ΄μ§€λ§Œ, Base64 디코딩을 해보면 λ°”λ‘œ "Hello"κ°€ λ‚˜μ˜΅λ‹ˆλ‹€. λ³„λ„μ˜ ν‚€κ°€ ν•„μš”ν•œ 것도 μ•„λ‹ˆκ³ , λ³΄μ•ˆμ„±μ„ μ œκ³΅ν•˜λŠ” 것도 μ•„λ‹™λ‹ˆλ‹€.

μ•”ν˜Έν™”μ™€ Base64의 μ°¨μ΄λŠ” λ‹€μŒμ²˜λŸΌ 정리할 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. μ•”ν˜Έν™”λŠ” ν‚€κ°€ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  2. μ•”ν˜Έν™”λŠ” ν‚€ μ—†μ΄λŠ” 원문을 μ•ŒκΈ° 어렡도둝 λ§Œλ“œλŠ” 것이 λͺ©μ μž…λ‹ˆλ‹€.
  3. Base64λŠ” ν‚€κ°€ ν•„μš” μ—†μŠ΅λ‹ˆλ‹€.
  4. Base64λŠ” 단지 λ°”μ΄νŠΈλ₯Ό ν…μŠ€νŠΈλ‘œ ν‘œν˜„ν•  λΏμž…λ‹ˆλ‹€.
  5. Base64λŠ” λ³΄μ•ˆ μˆ˜λ‹¨μ΄ μ•„λ‹™λ‹ˆλ‹€.

λ”°λΌμ„œ λ―Όκ°ν•œ 정보λ₯Ό Base64둜 λ°”κΎΈμ–΄ μ €μž₯ν•œλ‹€κ³  ν•΄μ„œ μ•ˆμ „ν•΄μ§€λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. λˆˆμ— 잘 μ•ˆ λ“€μ–΄μ˜¬ 뿐, 사싀상 λˆ„κ΅¬λ‚˜ 볡원할 수 μžˆλŠ” κ°’μž…λ‹ˆλ‹€.

 

 

πŸ”ΉUTF-8 같은 문자 인코딩과 Base64 μΈμ½”λ”©μ˜ 차이

Base64와 UTF-8은 λ‘˜ λ‹€ μΈμ½”λ”©μ΄λΌλŠ” 말을 μ‚¬μš©ν•˜μ§€λ§Œ, μ™„μ „νžˆ λ‹€λ₯Έ λ³€ν™˜μ˜ 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€. 이 뢀뢄은 μ‹€λ¬΄μ—μ„œ κ°€μž₯ 많이 ν˜Όλ™λ˜λŠ” 지점 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

 

μ•žμ„œ λ§ν•œ κ²ƒμ²˜λŸΌ UTF-8은 문자λ₯Ό λ°”μ΄νŠΈλ‘œ λ°”κΎΈλŠ” κ·œμΉ™μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ "κ°€"λΌλŠ” λ¬ΈμžλŠ” UTF-8μ—μ„œ νŠΉμ • λ°”μ΄νŠΈ μ‘°ν•©μœΌλ‘œ μ €μž₯λ©λ‹ˆλ‹€. 반면 Base64λŠ” κ·Έλ ‡κ²Œ λ§Œλ“€μ–΄μ§„ λ°”μ΄νŠΈλ₯Ό λ‹€μ‹œ μ•ˆμ „ν•œ ASCII λ¬Έμžμ—΄λ‘œ λ°”κΎΈλŠ” κ·œμΉ™μž…λ‹ˆλ‹€.

 

즉 λ¬Έμžμ—΄μ΄ Base64둜 바뀐닀고 말할 λ•Œ μ‹€μ œ λ‚΄λΆ€ 흐름은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. λ¨Όμ € 원본 λ¬Έμžμ—΄μ΄ μžˆμŠ΅λ‹ˆλ‹€.
  2. λ¬Έμžμ—΄μ„ UTF-8 같은 문자 μΈμ½”λ”©μœΌλ‘œ λ°”μ΄νŠΈμ—΄λ‘œ λ°”κΏ‰λ‹ˆλ‹€.
  3. κ·Έ λ°”μ΄νŠΈμ—΄μ„ Base64 κ·œμΉ™μœΌλ‘œ λ‹€μ‹œ λ¬Έμžμ—΄ν™”ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ "A"λΌλŠ” λ¬Έμžμ—΄μ„ Base64둜 λ°”κΎΌλ‹€λ©΄ μ‹€μ œλ‘œλŠ” λ‹€μŒκ³Ό 같은 νλ¦„μž…λ‹ˆλ‹€.

  1. 문자 'A'
  2. UTF-8 인코딩 → λ°”μ΄νŠΈ 0x41
  3. Base64 인코딩 → "QQ=="

즉 "QQ=="λŠ” 문자 'A' 자체λ₯Ό 직접 λ°”κΎΌ 것이 μ•„λ‹ˆλΌ, 0x41μ΄λΌλŠ” λ°”μ΄νŠΈλ₯Ό Base64둜 ν‘œν˜„ν•œ κ²°κ³Όμž…λ‹ˆλ‹€.

 

 

 

βœ…Base64λŠ” μ–΄λ””μ—μ„œ μ‚¬μš©λ κΉŒ?

Base64λŠ” 생각보닀 λ‹€μ–‘ν•œ κ³³μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€. 곡톡점은 λŒ€λΆ€λΆ„ ν…μŠ€νŠΈ 기반 ν™˜κ²½μ— λ°”μ΄λ„ˆλ¦¬λ₯Ό λ„£μ–΄μ•Ό ν•˜λŠ” μƒν™©μ΄λΌλŠ” μ μž…λ‹ˆλ‹€.

 

β‘  이메일 μ²¨λΆ€νŒŒμΌ

이메일은 μ „ν†΅μ μœΌλ‘œ ν…μŠ€νŠΈ 쀑심 ν”„λ‘œν† μ½œμž…λ‹ˆλ‹€. μ΄λ―Έμ§€λ‚˜ PDF 같은 μ²¨λΆ€νŒŒμΌμ„ λ„£μœΌλ €λ©΄ λ°”μ΄λ„ˆλ¦¬λ₯Ό κ·ΈλŒ€λ‘œ 보내기 μ–΄λ €μ› κΈ° λ•Œλ¬Έμ— MIMEκ³Ό Base64κ°€ ν•¨κ»˜ μ‚¬μš©λ©λ‹ˆλ‹€.

 

β‘‘ JSON μ•ˆμ— λ°”μ΄λ„ˆλ¦¬ 데이터 포함

JSON은 ν…μŠ€νŠΈ ν¬λ§·μ΄λ―€λ‘œ λ°”μ΄λ„ˆλ¦¬ 자체λ₯Ό 직접 넣을 수 μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μž‘μ€ 파일, 이미지, μ„œλͺ…κ°’, 인증 κ΄€λ ¨ κ°’ 등을 λ¬Έμžμ—΄ ν•„λ“œμ— λ„£κ³  싢을 λ•Œ Base64둜 λ³€ν™˜ν•΄μ„œ μ „λ‹¬ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ API μš”μ²­ 본문에 이런 μ‹μœΌλ‘œ λ“€μ–΄κ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

{
  "filename": "sample.png",
  "content": "iVBORw0KGgoAAAANSUhEUgAA..."
}

 

β‘’ Data URI

HTMLμ΄λ‚˜ CSSμ—μ„œ μ™ΈλΆ€ 이미지 νŒŒμΌμ„ λ”°λ‘œ μ°Έμ‘°ν•˜μ§€ μ•Šκ³ , λ¬Έμ„œ μ•ˆμ— 직접 λ„£κ³  싢을 λ•Œ Base64λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />

 

β‘£ JWT

JWTλŠ” μ •ν™•νžˆλŠ” Base64κ°€ μ•„λ‹ˆλΌ Base64URL을 μ‚¬μš©ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ³Έμ§ˆμ μœΌλ‘œλŠ” 같은 κ³„μ—΄μ˜ 인코딩 λ°©μ‹μž…λ‹ˆλ‹€. 헀더, νŽ˜μ΄λ‘œλ“œ, μ„œλͺ…이 각각 Base64URL둜 ν‘œν˜„λ©λ‹ˆλ‹€.

 

β‘€ μΈμ¦μ„œμ™€ ν‚€ 파일

PEM ν˜•μ‹μ˜ μΈμ¦μ„œλ‚˜ κ³΅κ°œν‚€, κ°œμΈν‚€ νŒŒμΌμ„ 열어보면 본문이 κΈ΄ λ¬Έμžμ—΄λ‘œ λ“€μ–΄ μžˆλŠ”λ°, 이 λΆ€λΆ„ μ—­μ‹œ Base64μž…λ‹ˆλ‹€.

 

 

 

βš οΈμ‹€λ¬΄μ—μ„œ ν”νžˆ λ³΄μ΄λŠ” “λ¬Έμžμ—΄ Base64 인코딩”

μ‹€λ¬΄μ—μ„œ 보면 μœ„μ— λ‚΄μš©κ³ΌλŠ” λ‹€λ₯΄κ²Œ λ¬Έμžμ—΄μ„ Base64 인코딩 ν•˜λŠ” κ²½μš°λ„ λ”λŸ¬ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹€λ¬΄μ—μ„œ “λ¬Έμžμ—΄μ„ Base64 μΈμ½”λ”©ν•œλ‹€”라고 λ§ν•˜λŠ” κ²½μš°λ„, μ‹€μ œλ‘œλŠ” λ¬Έμžμ—΄ μžμ²΄λ₯Ό λ‹€λ£¨λŠ” κ²Œ μ•„λ‹ˆλΌ κ·Έ λ¬Έμžμ—΄μ΄ λ°”μ΄νŠΈλ‘œ λ³€ν™˜λœ κ²°κ³Όλ₯Ό Base64둜 μΈμ½”λ”©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

즉 κ²‰μœΌλ‘œλŠ” λ¬Έμžμ—΄μ„ Base64 μΈμ½”λ”©ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ, λ‚΄λΆ€μ μœΌλ‘œλŠ” μ—¬μ „νžˆ

λ¬Έμžμ—΄ → λ°”μ΄νŠΈ → Base64 λ¬Έμžμ—΄

이 νλ¦„μž…λ‹ˆλ‹€.

 

 

예λ₯Ό λ“€μ–΄ "μ•ˆλ…•ν•˜μ„Έμš”"λ₯Ό Base64 μΈμ½”λ”©ν•œλ‹€κ³  ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ‹€μ œλ‘œλŠ” μ΄λ ‡κ²Œ λ©λ‹ˆλ‹€.

  1. 원본 λ¬Έμžμ—΄: "μ•ˆλ…•ν•˜μ„Έμš”"
  2. UTF-8둜 λ°”μ΄νŠΈ λ³€ν™˜
  3. κ·Έ λ°”μ΄νŠΈλ₯Ό Base64 인코딩
  4. κ²°κ³Ό λ¬Έμžμ—΄ 생성

즉 μž…λ ₯은 λ¬Έμžμ—΄μ΄μ§€λ§Œ, Base64κ°€ μ²˜λ¦¬ν•˜λŠ” λŒ€μƒμ€ κ²°κ΅­ UTF-8 λ°”μ΄νŠΈμž…λ‹ˆλ‹€.

 

 

1οΈβƒ£μ‹€λ¬΄μ—μ„œ “λ¬Έμžμ—΄ Base64 인코딩”이 λ§Žμ€ κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” 이유

μ΄λ ‡κ²Œ λŠκ»΄μ§€λŠ” μ΄μœ λŠ” 두 κ°€μ§€μž…λ‹ˆλ‹€.

 

첫째, λ¬Έμžμ—΄μ΄ κ°€μž₯ ν”ν•œ μž…λ ₯ ν˜•νƒœμ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€

κ°œλ°œμžλŠ” 보톡 μ½”λ“œμ—μ„œ λ¬Έμžμ—΄μ„ 많이 λ‹€λ£Ήλ‹ˆλ‹€.

예:

  • JSON λ¬Έμžμ—΄
  • μ‚¬μš©μž μž…λ ₯ λ¬Έμžμ—΄
  • 토큰 λ¬Έμžμ—΄
  • 인증 정보 λ¬Έμžμ—΄

κ·Έλž˜μ„œ μ½”λ“œμƒμœΌλ‘œλŠ” string -> base64처럼 λ³΄μž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ λ‚΄λΆ€μ μœΌλ‘œλŠ” 항상:

  • string
  • UTF-8 bytes
  • base64 string

μˆœμ„œμž…λ‹ˆλ‹€.

 

λ‘˜μ§Έ, κ²°κ³Όλ₯Ό λ‹€μ‹œ λ¬Έμžμ—΄λ‘œ 써야 ν•˜λŠ” κ²½μš°κ°€ 많기 λ•Œλ¬Έμž…λ‹ˆλ‹€

HTTP 헀더, JSON ν•„λ“œ, DB varchar 컬럼, 둜그, μ„€μ • 파일 등은 λŒ€κ°œ λ¬Έμžμ—΄ μ€‘μ‹¬μž…λ‹ˆλ‹€.

즉 원본이 λ°”μ΄νŠΈλΌλ„ μ΅œμ’… μ €μž₯/전솑 맀체가 λ¬Έμžμ—΄μ΄κΈ° λ•Œλ¬Έμ— Base64λ₯Ό 많이 보게 λ©λ‹ˆλ‹€.

κ·Έλž˜μ„œ μ‹€λ¬΄μ—μ„œλŠ” “Base64λŠ” λ°”μ΄λ„ˆλ¦¬μš©”이라고 μ„€λͺ…ν•˜λ©΄μ„œλ„, μ •μž‘ μ½”λ“œμ—μ„œλŠ” λ¬Έμžμ—΄μ„ λ„£λŠ” λͺ¨μŠ΅μ΄ ν”ν•˜κ²Œ λ³΄μ΄λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

 

2️⃣ “λ¬Έμžμ—΄ Base64 인코딩” μ‚¬μš©ν•˜λŠ” 이유

그럼 μ™œ ꡳ이 λ¬Έμžμ—΄μ„ 또 Base64둜 λ°”κΏ€κΉŒμš”? λ¬Έμžμ—΄μ΄λ©΄ κ·Έλƒ₯ λ¬Έμžμ—΄λ‘œ 보내면 λ˜μ§€ μ•ŠλŠλƒλŠ” 의문이 생길 수 μžˆμŠ΅λ‹ˆλ‹€.
λ§žμŠ΅λ‹ˆλ‹€. 일반 ν…μŠ€νŠΈ λ¬Έμžμ—΄μ΄λΌλ©΄ ꡳ이 Base64둜 λ°”κΏ€ ν•„μš”κ°€ μ—†λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.
그런데 μ‹€λ¬΄μ—μ„œλŠ” μ•„λž˜ κ°™μ€ μ΄μœ λ‘œ λ¬Έμžμ—΄μ„ Base64둜 λ°”κΎΈλŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

 

β‘  μ•ˆμ „ν•œ 문자 μ§‘ν•©μœΌλ‘œ λ§žμΆ”κΈ° μœ„ν•΄

λ¬Έμžμ—΄ μ•ˆμ— λ‹€μŒ 같은 λ¬Έμžκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ€„λ°”κΏˆ
  • νƒ­
  • 곡백
  • ν•œκΈ€
  • 이λͺ¨μ§€
  • 특수문자
  • μ œμ–΄λ¬Έμž

이런 값듀은 μ–΄λ–€ μ‹œμŠ€ν…œμ—μ„œλŠ” 닀루기 κΉŒλ‹€λ‘­κ±°λ‚˜, μ€‘κ°„μ—μ„œ 깨질 수 μžˆκ±°λ‚˜, 포맷 μΆ©λŒμ„ μΌμœΌν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ μ•„μ˜ˆ λ¬Έμžμ—΄μ„ UTF-8 λ°”μ΄νŠΈλ‘œ λ§Œλ“  λ’€ Base64둜 λ°”κΎΈλ©΄ κ²°κ³ΌλŠ”:

  • 영문 λŒ€μ†Œλ¬Έμž
  • 숫자
  • +, /, =

μ •λ„μ˜ μ œν•œλœ μ•ˆμ „ 문자 μ§‘ν•©μœΌλ‘œλ§Œ κ΅¬μ„±λ©λ‹ˆλ‹€.

즉, 원본 λ¬Έμžμ—΄μ΄ λ³΅μž‘ν•˜λ”λΌλ„ μ•ˆμ „ν•œ ASCII 계열 λ¬Έμžμ—΄λ‘œ 평탄화할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

β‘‘ νŠΉμ • ν•„λ“œκ°€ “ν…μŠ€νŠΈ ν•œ 쀄”이어야 ν•  λ•Œ

μ–΄λ–€ μ‹œμŠ€ν…œμ€ 값을 ν•œ 쀄 λ¬Έμžμ—΄λ‘œλ§Œ λ°›λŠ”λ°, μ‹€μ œ κ°’ μ•ˆμ—λŠ” μ€„λ°”κΏˆμ΄λ‚˜ νŠΉμˆ˜λ¬Έμžκ°€ 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ˜ˆμ‹œ)

  • PEM μΈμ¦μ„œ λ³Έλ¬Έ
  • JSON 쑰각
  • XML 쑰각
  • 멀티라인 ν…μŠ€νŠΈ
  • μ„œλͺ… 원문

이럴 λ•Œ Base64둜 λ°”κΎΈλ©΄ μ€„λ°”κΏˆμ΄λ‚˜ 특수문자 문제λ₯Ό ν”Όν•˜κ³  ν•œ 쀄 ν…μŠ€νŠΈλ‘œ 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

β‘’ JSON/XML/μΏΌλ¦¬μŠ€νŠΈλ§μ— λ„£κΈ° μ‰½κ²Œ λ§Œλ“€κΈ° μœ„ν•΄

μ–΄λ–€ λ¬Έμžμ—΄μ€ 직접 λ„£μœΌλ©΄ escaping이 λ²ˆκ±°λ‘­μŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ JSON μ•ˆμ— μ•„λž˜ λ¬Έμžμ—΄μ„ λ„£λŠ”λ‹€κ³  μƒκ°ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

{"name":"홍길동","message":"hello\nworld"}

 

이걸 κ·ΈλŒ€λ‘œ λ‹€λ₯Έ 포맷 μ•ˆμ— λ‹€μ‹œ λ„£μœΌλ €λ©΄

  • λ”°μ˜΄ν‘œ μ΄μŠ€μΌ€μ΄ν”„
  • μ€„λ°”κΏˆ μ΄μŠ€μΌ€μ΄ν”„
  • λ¬Έμžμ…‹ 문제

등을 μ‹ κ²½ 써야 ν•©λ‹ˆλ‹€.

그런데 Base64둜 λ°”κΎΈλ©΄ κ·Έλƒ₯ ν‰λ²”ν•œ 영숫자 λ¬Έμžμ—΄μ²˜λŸΌ λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

πŸ‘Base64의 μž₯점

Base64λŠ” 였래된 λ°©μ‹μ΄μ§€λ§Œ μ§€κΈˆλ„ 널리 μ‚¬μš©λ˜λŠ” λ°μ—λŠ” λΆ„λͺ…ν•œ μ΄μœ κ°€ μžˆμŠ΅λ‹ˆλ‹€.

 

첫째, ν…μŠ€νŠΈ 기반 μ‹œμŠ€ν…œκ³Όμ˜ ν˜Έν™˜μ„±μ΄ λ›°μ–΄λ‚©λ‹ˆλ‹€. ASCII 쀑심 ν™˜κ²½μ—μ„œλ„ 비ꡐ적 μ•ˆμ „ν•˜κ²Œ λ‹€λ£° 수 μžˆλŠ” 문자만 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 전솑이 μ•ˆμ •μ μž…λ‹ˆλ‹€.

 

λ‘˜μ§Έ, κ΅¬ν˜„μ΄ λ‹¨μˆœν•©λ‹ˆλ‹€. Base64λŠ” 맀우 ν‘œμ€€ν™”λ˜μ–΄ 있고, 거의 λͺ¨λ“  언어와 ν”„λ ˆμž„μ›Œν¬μ—μ„œ 기본적으둜 μ§€μ›ν•©λ‹ˆλ‹€. Java, C#, JavaScript, Python λ“± λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄μ—μ„œ 라이브러리 없이도 μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ…‹μ§Έ, λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό μ§λ ¬ν™”λœ ν…μŠ€νŠΈ 포맷 μ•ˆμ— λ„£κΈ° μ‰½μŠ΅λ‹ˆλ‹€. JSON, XML, 이메일, 둜그, λ©”μ‹œμ§€ 큐 등에 λ°”μ΄λ„ˆλ¦¬λ₯Ό λ„£μ–΄μ•Ό ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

 

λ„·μ§Έ, 볡사와 λΆ™μ—¬λ„£κΈ°κ°€ μ‰½μŠ΅λ‹ˆλ‹€. λ°”μ΄λ„ˆλ¦¬ κ·ΈλŒ€λ‘œλŠ” 눈으둜 닀루기 μ–΄λ €μš°λ‚˜, Base64 λ¬Έμžμ—΄μ€ ν…μŠ€νŠΈμ²˜λŸΌ μ·¨κΈ‰ν•  수 μžˆμ–΄ 전달과 μ €μž₯이 νŽΈλ¦¬ν•©λ‹ˆλ‹€.

 

 

 

πŸ‘ŽBase64의 단점

λ¬Όλ‘  μž₯점만 μžˆλŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. μ‹€λ¬΄μ—μ„œλŠ” Base64의 단점도 λΆ„λͺ…νžˆ μ•Œκ³  μ‚¬μš©ν•˜μ…”μ•Ό ν•©λ‹ˆλ‹€.

 

첫째, 크기가 μ¦κ°€ν•©λ‹ˆλ‹€. μ•žμ„œ μ„€λͺ…λ“œλ¦° κ²ƒμ²˜λŸΌ 원본보닀 μ•½ 33% μ»€μ§‘λ‹ˆλ‹€. κ·Έλž˜μ„œ λŒ€μš©λŸ‰ νŒŒμΌμ„ Base64둜 감싸면 λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½κ³Ό λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μ¦κ°€ν•©λ‹ˆλ‹€.

 

λ‘˜μ§Έ, 인코딩과 λ””μ½”λ”© λΉ„μš©μ΄ λ°œμƒν•©λ‹ˆλ‹€. μ•„μ£Ό 큰 λΉ„μš©μ€ μ•„λ‹ˆμ§€λ§Œ, κ³ μ„±λŠ₯ ν™˜κ²½μ΄λ‚˜ λŒ€μš©λŸ‰ 처리 κ΅¬κ°„μ—μ„œλŠ” λ¬΄μ‹œν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

μ…‹μ§Έ, 큰 νŒŒμΌμ—λŠ” λΉ„νš¨μœ¨μ μž…λ‹ˆλ‹€. 특히 JSON μ•ˆμ— Base64 λ¬Έμžμ—΄λ‘œ λŒ€ν˜• λ°”μ΄λ„ˆλ¦¬λ₯Ό λ„£λŠ” 방식은 λ‹€μŒκ³Ό 같은 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. μ „μ†‘λŸ‰ 증가
  2. λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 증가
  3. νŒŒμ‹± λΉ„μš© 증가
  4. ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ μ–‘μͺ½μ˜ 처리 λΆ€λ‹΄ 증가

κ·Έλž˜μ„œ μ‹€λ¬΄μ—μ„œλŠ” μž‘μ€ λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°μ—λŠ” Base64λ₯Ό 쓰더라도, 큰 νŒŒμΌμ€ 보톡 λ©€ν‹°νŒŒνŠΈ μ—…λ‘œλ“œλ‚˜ 슀트리밍, ν˜Ήμ€ 파일 μŠ€ν† λ¦¬μ§€ μ—…λ‘œλ“œ ν›„ URL 전달 λ°©μ‹μœΌλ‘œ λΆ„λ¦¬ν•˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.

 

 

 

βž•μΆ”κ°€μ μœΌλ‘œ URL-safe Base64

일반 Base64λŠ” +, /, = 같은 문자λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 그런데 이 λ¬Έμžλ“€μ€ URL, 파일λͺ…, 쿼리슀트링 λ“±μ—μ„œλŠ” λΆˆνŽΈν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ +λŠ” 곡백처럼 처리될 수 있고, /λŠ” 경둜 κ΅¬λΆ„μžλ‘œ 해석될 수 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ URL ν™˜κ²½μ—μ„œ μ‚¬μš©ν•˜κΈ° μ‰½κ²Œ μ•½κ°„ λ³€ν˜•ν•œ 것이 Base64URLμž…λ‹ˆλ‹€. κ·œμΉ™μ€ λ‹¨μˆœν•©λ‹ˆλ‹€.

  1. +λ₯Ό -둜 λ°”κΏ‰λ‹ˆλ‹€.
  2. /λ₯Ό _둜 λ°”κΏ‰λ‹ˆλ‹€.
  3. = νŒ¨λ”©μ€ μƒλž΅ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€.

JWTκ°€ λ°”λ‘œ 이 Base64URL을 μ‚¬μš©ν•˜λŠ” λŒ€ν‘œμ μΈ μ‚¬λ‘€μž…λ‹ˆλ‹€. κ·Έλž˜μ„œ JWTλ₯Ό 보면 일반 Base64와 λΉ„μŠ·ν•˜λ©΄μ„œλ„ +, /, =κ°€ 잘 보이지 μ•ŠλŠ” μ΄μœ κ°€ 여기에 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

✨마무리

Base64λŠ” 였래된 κ°œλ…μ΄μ§€λ§Œ, μ§€κΈˆλ„ λ°±μ—”λ“œ μ‹€λ¬΄μ—μ„œ 맀우 자주 λ“±μž₯ν•˜λŠ” μ€‘μš”ν•œ κΈ°λ³ΈκΈ°μž…λ‹ˆλ‹€. 기술 μžμ²΄λŠ” λ‹¨μˆœν•΄ λ³΄μ΄μ§€λ§Œ, 어디에 쓰이고 μ™œ ν•„μš”ν•œμ§€, μ–΄λ–€ μ›λ¦¬λ‘œ λ™μž‘ν•˜λŠ”μ§€, 무엇과 ν˜Όλ™ν•˜λ©΄ μ•ˆ λ˜λŠ”μ§€λ₯Ό μ •ν™•νžˆ μ΄ν•΄ν•˜κ³  κ³„μ‹œλŠ”μ§€μ— 따라 섀계와 λ””λ²„κΉ…μ˜ 질이 λ‹¬λΌμ§‘λ‹ˆλ‹€.

κ²°κ΅­ Base64의 λ³Έμ§ˆμ€ λͺ…ν™•ν•©λ‹ˆλ‹€. λ‚΄μš©μ„ μˆ¨κΈ°λŠ” 기술이 μ•„λ‹ˆλΌ, λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό ν…μŠ€νŠΈ 기반 ν™˜κ²½μ—μ„œλ„ μ•ˆμ „ν•˜κ²Œ 전달할 수 μžˆλ„λ‘ ν‘œν˜„ 방식을 λ°”κΎΈλŠ” κΈ°μˆ μž…λ‹ˆλ‹€. 이 관점을 μ •ν™•νžˆ 작고 κ³„μ‹œλ©΄, μ•žμœΌλ‘œ Base64λ₯Ό λ§Œλ‚  λ•Œλ§ˆλ‹€ 훨씬 μ„ λͺ…ν•˜κ²Œ μ΄ν•΄ν•˜μ‹€ 수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

 

λŒ“κΈ€