๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

Base64 Encoding vs Base64UrlSafe vs FormData ๋ณธ๋ฌธ

Study/Java

Base64 Encoding vs Base64UrlSafe vs FormData

Shinjio 2024. 11. 5. 21:12
๋ฐ˜์‘ํ˜•

์šด์˜ํ™˜๊ฒฝ์— ์ ์šฉ๋œ ์†”๋ฃจ์…˜ ์ค‘ Rest API๋ฅผ ํ†ตํ•ด ๋“ฑ๋ก๊ณผ ์กฐํšŒ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋กœ์ง์—์„œ ๋“ฑ๋ก์€ ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰๋˜์ง€๋งŒ, ๋“ฑ๋ก๋œ ์ •๋ณด๋กœ ์กฐํšŒ ์‹œ ์กฐํšŒ๊ฐ€ ์•ˆ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์˜€๋‹ค.

 

ํ™•์ธ ๊ฒฐ๊ณผ, ์—ฐ๊ณ„ ์„œ๋น„์Šค์—์„œ ์šฐ๋ฆฌ ์†”๋ฃจ์…˜์˜ RestAPI ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ URL์— ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์„œ ๋ณด๋‚ด๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๋•Œ user์˜ id๋ฅผ Base64 ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋ณด๋‚ด๋Š” ๊ฒฐ๊ณผ, Base64 ์ธ์ฝ”๋”ฉ์— ํฌํ•จ๋˜๋Š” ๋ฌธ์ž์—ด ์ค‘ + ๋ฌธ์ž์—ด์ด URL์—์„œ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ Space๋กœ ์ธ์‹๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ •์ƒ์ ์ธ ์กฐํšŒ๊ฐ€ ์ง„ํ–‰๋˜์ง€ ์•Š์•˜๋‹ค. 

 

ํ•ด๋‹น ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ์ด๋ฒˆ์—๋Š” Base64์™€ ๊ด€๋ จ๋œ ํฌ์ŠคํŒ…์„ ์ง„ํ–‰ํ•ด ๋ณด์•˜๋‹ค.


๐Ÿ”Ž Base64 Encoding

Base64 ์ธ์ฝ”๋”ฉ์ด๋ž€ ์ด์ง„(binary) ๋ฐ์ดํ„ฐ๋ฅผ 6bit์”ฉ ์ž˜๋ผ์„œ 64๊ฐœ์˜ ๋ฌธ์ž(์•„์Šคํ‚ค์ฝ”๋“œ)๋กœ ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. Base64๋Š” 6bit๋‹น 2bit์˜ OverHead ๋ฐœ์ƒ์œผ๋กœ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ณด๋‹ค 30% ์ด์ƒ ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

 

โœ” Base64 Encoding ์›๋ฆฌ

์˜ˆ๋ฅผ ๋“ค์–ด apple ์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ Base64 Encoding์„ ํ•ด๋ณด์ž.

์•„์Šคํ‚ค์ฝ”๋“œํ‘œ์—์„œ a๋Š” ์ด์ง„์ˆ˜๋กœ 01100001, p๋Š” 01110000, l์€ 01101100, e๋Š” 01100101์ด๋‹ค.

์œ„์˜ ์ด์ง„์ˆ˜๋ฅผ ๋ชจ๋‘ ์—ฐ๊ฒฐํ•˜๋ฉด 0110000101110000011100000110110001100101์ด ๋œ๋‹ค.

์ด ์ด์ง„์ˆ˜๋ฅผ 6bit ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๋ฉด

 

011000 010111 000001 110000 011011 000110 010100  
24 23 1 48 27 6 20 padding
Y X B w b G U =

 

์œ„์™€ ๊ฐ™์ด ๋ฐ”๋€Œ๊ณ , ๊ฐ 6bit๋กœ ๋‚˜๋ˆˆ ์ด์ง„์ˆ˜๋ฅผ ์‹ญ์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ Base64 ์ƒ‰์ธํ‘œ์— ๋”ฐ๋ผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด YXBwbGU=์ด ๋œ๋‹ค.

 

โœ”  Base64 Encoding์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์ด๋ ‡๊ฒŒ Base64 ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ํ†ต์‹ ๊ณผ์ •์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ์˜ ์†์‹ค์„ ๋ง‰๊ธฐ ์œ„ํ•จ์ด๋‹ค.

ํ”Œ๋žซํผ ๋…๋ฆฝ์ ์œผ๋กœ Binary Data(์ด๋ฏธ์ง€๋‚˜ ์˜ค๋””์˜ค)๋ฅผ ์ „์†กํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ, ASCII๋กœ Encodingํ•˜์—ฌ ์ „์†กํ•˜๊ฒŒ ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ASCII๋Š” 7bits Encoding์ธ๋ฐ ๋‚˜๋จธ์ง€ 1bit๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ์‹œ์Šคํ…œ ๋ณ„๋กœ ์ƒ์ดํ•˜๋‹ค.
  2. ์ผ๋ถ€ ์ œ์–ด ๋ฌธ์ž์˜ ๊ฒฝ์šฐ ์‹œ์Šคํ…œ ๋ณ„๋กœ ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋กœ ASCII๋Š” ์‹œ์Šคํ…œ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. Base64๋Š” ASCII ๋ฌธ์ž์—ด ์ค‘ ์ œ์–ด ๋ฌธ์ž์™€ ์ผ๋ถ€ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ์ œ์™ธํ•œ 64๊ฐœ์˜ ์•ˆ์ „ํ•œ ์ถœ๋ ฅ ๋ฌธ์ž๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹œ์Šคํ…œ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ์ „์†ก ๋˜๋Š” ์ €์žฅ๋˜๋Š” ๊ฑธ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

 


๐Ÿ”Ž Base64UrlSafe

์šฐ๋ฆฌ ์†”๋ฃจ์…˜๊ณผ ์—ฐ๊ณ„๋œ ์„œ๋ฒ„์—์„œ user_id๋ฅผ Base64๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ €์žฅํ•  ๋•Œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ €์žฅํ•˜๋Š” ๋กœ์ง์˜ ๊ฒฝ์šฐ POST ๋ฉ”์„œ๋“œ๋กœ request body ๋‚ด์— user_id ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— +, /๊ณผ ๊ฐ™์€ ๋ฌธ์ž๊ฐ€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ Base64๋กœ ์ธ์ฝ”๋”ฉํ•œ ๋ฐ์ดํ„ฐ๋ฅผ URL Param์„ ํ†ตํ•ด ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค๋ฉด, +, / ๋ฌธ์ž์—ด์„ ์ธ์‹ํ•˜๋Š”๋ฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

URL์—์„œ +๋Š” ๋„์–ด์“ฐ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, /๋Š” ๊ฒฝ๋กœ๊ตฌ๋ถ„์ž ๊ธฐํ˜ธ๋กœ ์ธ์‹ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

๋”ฐ๋ผ์„œ Base64UrlSafe๋Š” URL์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์•ฝ ๊ธฐํ˜ธ๋“ค์„ ์ •์ƒ์ ์œผ๋กœ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด +, /๋ฅผ -, _๋กœ ๋Œ€์ฒดํ•˜์—ฌ URL์—์„œ๋„ Base64 ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.

MEMO
์‹ค์ œ๋กœ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” /๋Š” ์ธ์‹์ด ๋˜๊ณ  =๋งŒ ๊ณต๋ฐฑ์œผ๋กœ ๋“ค์–ด์™”๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” param์˜ value๊ฐ’์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์—†์–ด๋„ ๋ฌธ์ž์—ด์˜ ์ผ๋ถ€๋กœ ์ธ์‹๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

 

Base64UrlSafe๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ Base64์—์„œ URL์„ ํ†ตํ•ด + ํ˜น์€ / ๊ธฐํ˜ธ๋ฅผ ๋ณด๋‚ด๊ณ  ์‹ถ์„ ๋•Œ๋Š” URL ์ธ์ฝ”๋”ฉ ํ‘œ์˜ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์ „์†กํ•˜๋ฉด ๋œ๋‹ค.

 

 


๐Ÿ”Ž Base64 vs ForData

์ด์ „์— ์˜ฌ๋ฆฐ React ๊ด€๋ จ ํฌ์ŠคํŒ…์—์„œ binary ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ Form Data๋ฅผ ์ด์šฉํ•˜์—ฌ ์ „์†กํ–ˆ๋Š”๋ฐ Base64๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ „์†กํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค.

 

  1. ๋ฐ์ดํ„ฐ ํ˜•์‹
    1. Base64 ์ธ์ฝ”๋”ฉ์€ Binary ๋ฐ์ดํ„ฐ๋ฅผ ํ…์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜
    2. FormData๋Š” Binary ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ „์†ก
  2. ์šฉ๋Ÿ‰
    1. Base64 ์ธ์ฝ”๋”ฉ์€ ๋ฐ์ดํ„ฐ์˜ ์šฉ๋Ÿ‰์„ ์ฆ๊ฐ€์‹œํ‚ด(์•ฝ 33%)
    2. FormData๋Š” Binary ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ „์†กํ•˜์—ฌ ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ ์—†์Œ
  3. ์ง€์› ๋ฒ”์œ„
    1. Base64 ์ธ์ฝ”๋”ฉ์€ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋‚˜ ํ”Œ๋žซํผ์—์„œ ์ง€์›
    2. FormData๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ. Node.js์™€ ๊ฐ™์€ ์„œ๋ฒ„์‚ฌ์ด๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ → ์ฃผ๋กœ ๋ธŒ๋ผ์šฐ์ € API์— ์ตœ์ ํ™”
  4. ์‚ฌ์šฉ ์šฉ๋„
    1. Base64 ์ธ์ฝ”๋”ฉ์€ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ „์†กํ•  ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, ์ด๋ฏธ์ง€๋‚˜ ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ํ…์ŠคํŠธ ํ˜•ํƒœ๋กœ ์ „์†กํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
    2. FormData๋Š” ํŒŒ์ผ ์—…๋กœ๋“œ๋‚˜ multipart ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, ์„œ๋ฒ„์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ
  5. ๋ณด์•ˆ
    1. Base64๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•ด ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ๊ฐ€ ์‰ฝ๊ฒŒ ๋””์ฝ”๋”ฉ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฏผ๊ฐํ•œ ์ •๋ณด์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ
    2. FormData๋Š” HTTPS๋ฅผ ํ†ตํ•œ ์•”ํ˜ธํ™” ํ•„์š”

 

๋ฆฌ์•กํŠธ์—์„œ ์—…๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” FormData๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๊ณ , ์„œ๋ฒ„์—์„œ DB์— ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ์—๋Š” Base64๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ํ…์ŠคํŠธ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•˜๋‹ค.

 


๐Ÿ“– ์ฐธ๊ณ ์ž๋ฃŒ

https://warpgate3.tistory.com/entry/Base64-Encoding

https://devuna.tistory.com/41

https://namu.wiki/w/URL escape code

https://velog.io/@plutoin/base64์™€-formData

๋ฐ˜์‘ํ˜•