nodejs

인코딩과 λ””μ½”λ”©(Encoder / Decoder)

javascriptλ₯Ό ν•˜λ‹€ 보면 인코딩과 디코딩에 λŒ€ν•˜μ—¬ μ•Œμ•„μ•Ό ν•  μ‹œκΈ°κ°€ 였게 λ©λ‹ˆλ‹€. ASCII 인코딩, URL인코딩, HTML 인코딩, Base64 인코딩 λΉ„κ΅ν•˜μ—¬ μ•Œμ•„ λ΄…μ‹œλ‹€. 그리고 javascriptμ—μ„œλŠ” decodeURIComponent(), encodeURIComponent(), encodeURI(), decodeURI() ν•¨μˆ˜λ₯Ό 톡해 인코딩과 디코딩을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.



image


인코딩(Encoding)μ΄λž€

μΈμ½”λ”©μ˜ μ •μ˜λŠ” μ—¬λŸ¬ 상황에 따라 λ‹€λ₯΄κ²Œ μ μš©λœλ‹€κ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 큰 λ²”μœ„μ—μ„œ μΈμ½”λ”©μ΄λž€ νŠΉμ • 정보λ₯Ό 정해진 κ·œμΉ™μ— 따라 λ³€ν™˜ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 컴퓨터 λ‚΄λΆ€μ—μ„œμ˜ 인코딩은 컴퓨터가 μŠ€μŠ€λ‘œκ°€ 이해할 수 μžˆλŠ” 0κ³Ό 1둜 λ³€ν™˜ν•˜λŠ” 것( 문자λ₯Ό λ°”μ΄νŠΈλ‘œ λ³€ν™˜ )도 μΈμ½”λ”©μ΄λΌλŠ” ν‘œν˜„μ„ ν•©λ‹ˆλ‹€. μΈμ½”λ”©μ˜ λͺ©μ μ— 따라 μ—¬λŸ¬ 인코딩이 μ‘΄μž¬ν•©λ‹ˆλ‹€. μ’…λ₯˜λ‘œλŠ” ASCII 인코딩, URL인코딩, HTML 인코딩, Base64 인코딩 등등이 μžˆμŠ΅λ‹ˆλ‹€.

λ””μ½”λ”©(Decoding)μ΄λž€

λ””μ½”λ”©μ΄λž€ μΈμ½”λ”©κ³ΌλŠ” λ°˜λŒ€ κ°œλ…μœΌλ‘œ μ»΄ν“¨ν„°μ˜ μ–Έμ–΄λ₯Ό μ‚¬λžŒμ΄ 이해 ν•  수 μžˆλ„λ‘ λ³€κ²½ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. μ»΄ν“¨μ„œκ°€ μΈμ‹ν•˜κ³  μžˆλŠ” λ°”μ΄νŠΈλ₯Ό μ‚¬λžŒμ΄ 인지 ν•  수 μžˆλ„λ‘ 문자둜 λ³€ν™˜ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.


ASCII μ•„μŠ€ν‚€

기본적으둜 μ»΄ν“¨ν„°λŠ” μ•ŒνŒŒλ²³μΈ a, b, c.. 쑰차도 무엇인지 μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€. 그리고 각각의 μ»΄ν“¨ν„°λ§ˆλ‹€ λ‹€λ₯Έ κ·œμΉ™μ„ 톡해 인코딩/디코딩을 ν•œλ‹€λ©΄ μ€‘κ΅¬λ‚œλ°©μ΄ λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이유둜 ꡭ제적으둜 ν†΅μΌλœ κ·œμΉ™μ„ λ§Œλ“€κ²Œ λ˜λŠ”λ° 이λ₯Ό μ•„μŠ€ν‚€ μ½”λ“œλΌκ³  ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ•„μŠ€ν‚€ μ½”λ“œλŠ” μ˜μ–΄λ§Œμ„ ν‘œν˜„νž™λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이유둜 λ‹€λ₯Έ λ‚˜λΌ μ–Έμ–΄λ₯Ό μ•„μŠ€ν‚€ μ½”λ“œλ‘œ μ‚¬μš©ν•˜λ©΄ 좩돌이 μΌμ–΄λ‚˜ κΈ€μžκ°€ κΉ¨μ§€κ²Œ λ©λ‹ˆλ‹€. λ”°λΌμ„œ μ—¬λŸ¬ 언어듀을 ν•©μΉ˜κΈ° μœ„ν•œ 기쀀이 ν•„μš”ν•΄μ§€κ²Œ λ©λ‹ˆλ‹€.

Unicode μœ λ‹ˆμ½”λ“œ

μœ„μ˜ μ•„μŠ€ν‚€ μ½”λ“œμ˜ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‚˜μ˜¨ 것이 λ°”λ‘œ μœ λ‹ˆμ½”λ“œμž…λ‹ˆλ‹€. μœ λ‹ˆμ½”λ“œλŠ” 기본적으둜 μ˜μ–΄λŠ” 1λ°”μ΄νŠΈλ‘œ ν‘œν˜„μ΄ 된고 ν•œκ΅­μ–΄λŠ” 2λ°”μ΄νŠΈλ‘œ ν‘œν˜„μ΄ λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν˜•μ‹μœΌλ‘œ νŠΉμ • μ–Έμ–΄μ—μ„œλŠ” 3λ°”μ΄νŠΈκΉŒμ§€ ν‘œν˜„μ΄ λ˜λŠ” λ¬Έμžλ“€μ΄ 생기닀 λ³΄λ‹ˆ, ν†΅μΌλœ 인코딩을 ν•˜κΈ° νž˜λ“€μ–΄ μ§‘λ‹ˆλ‹€. (μœ λ‹ˆμ½”λ“œλŠ” 기본적으둜 1λ°”μ΄νŠΈμ—μ„œ 4λ°”μ΄νŠΈκΉŒμ§€ μ‚¬μš©λœλ‹€.) λ”°λΌμ„œ UTF-7, UTF-8, UTF-16, UTF-32 인코딩과 같이 μ—¬λŸ¬ 인코딩 방식이 μƒκ²¨λ‚˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

UTF-8(8-bit Unicode Transformation Format)

UTF-8은 μ΄λ¦„μ—μ„œ μ•Œ 수 μžˆλ“―, 8λΉ„νŠΈ λ‹¨μœ„λ‘œ 인코딩을 ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λ§Œμ•½ 1λΉ„νŠΈλ‘œ ν‘œν˜„ κ°€λŠ₯ν•œ 문자λ₯Ό 4λΉ„νŠΈλ‘œ ν‘œν˜„ν•œλ‹€λ©΄ μžμ›λ‚­λΉ„κ°€ μ»€μ§€κ²Œ λ©λ‹ˆλ‹€. UTF-8은 문자의 ν‘œν˜„ λΉ„νŠΈμ— 따라 κ°€λ³€μ μœΌλ‘œ μ‘°μ ˆμ„ ν•˜κΈ° λ•Œλ¬Έμ— μžμ›λ‚­λΉ„λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ UTF-8의 μž₯점은 μœ λ‹ˆμ½”λ“œμ™€ λ°±ν”„λ‘œ ν˜Έν™˜μ΄ λœλŠ” μž₯점을 κ°€μ§‘λ‹ˆλ‹€.

URL 인코딩

ν™ˆνŽ˜μ΄μ§€μ— μ ‘μ†ν•˜κΈ° μœ„ν•΄ https://www.aaaa.aaa/home?han=111&py=222와 같은 μ£Όμ†Œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 기본적으둜 μ£Όμ†Œμ— μ˜λ¬Έμžμ™€ 숫자만 ν¬ν•¨λ˜μ–΄ μžˆλ‹€λ©΄, 인코딩이 ν•„μš” μ—†μ§€λ§Œ, νŠΉμˆ˜λ¬Έμžλ‚˜ ν•œκΈ€μ΄ ν¬ν•¨λ˜λŠ” 경우 κ°„ν˜Ή νŽ˜μ΄μ§€λ₯Ό λΆˆλŸ¬μ˜€μ§€ λͺ»ν•˜λŠ” κ²½μš°κ°€ λ°œμƒν•œλ‹€. λ”°λΌμ„œ μ™œκ³‘μ΄ κ°€λŠ₯ν•œ λ¬Έμžλ“€μ€ %XX 와 같이 16μ§„μˆ˜λ‘œ λ³€ν™˜μ„ ν•˜λŠ” 것을 URL 인코딩이라 ν•©λ‹ˆλ‹€.

HTML 인코딩

κ°œλ°œμ„ ν•˜λ‹€λ³΄λ©΄ ν•œκΈ€μ΄ κΉ¨μ Έμ„œ λ‚˜μ˜€λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ›Ή λΈŒλΌμš°μ €λ§ˆλ‹€ μ‚¬μš©ν•˜λŠ” 인코딩 방식이 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— μƒκΈ°λŠ” ν˜„μƒμž…λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν•˜λ‚˜μ˜ 인코딩 λ°©μ‹μœΌλ‘œ ν†΅μΌν•˜λŠ” 것이 ν•„μš”ν•©λ‹ˆλ‹€. ν•œκ΅­μ—μ„œλŠ” 보톡 인코딩 λ°©μ‹μœΌλ‘œ EUC-KRκ³Ό UTF-8을 주둜 μ‚¬μš©ν•©λ‹ˆλ‹€. λ‘˜μ΄ μΆ©λŒμ„ ν•œλ‹€λ©΄ λ‹Ήμ—°νžˆ ν•œκΈ€μ΄ 깨진닀. EUC-KR은 ASCII 인코딩 방식인 μ˜μ–΄λ§Œ 1byte둜 μΈμ½”λ”©ν•˜λŠ” 방식을 ν™•μž₯ν•˜μ—¬ 2byte둜 ν•œκΈ€μ„ 인코딩할 수 μžˆλ„λ‘ λ§Œλ“  것 μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이유둜 κ³΅ν†΅μœΌλ‘œ μ‚¬μš©λ˜λŠ” 인코딩 방식이 μ•„λ‹™λ‹ˆλ‹€. λ”°λΌμ„œ μš°λ¦¬λ‚˜λΌμ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜κ³  μ™Έκ΅­μ—μ„œλŠ” ν•œκΈ€μ΄ κΉ¨μ Έμ„œ λ‚˜μ˜¬ 수 밖에 μ—†μŠ΅λ‹ˆλ‹€. EUC-KR은 μš©λŸ‰μ΄ 적어 이전 인터넷 ν™˜κ²½μ΄ 쒋지 μ•Šμ€ κ³³μ—μ„œλŠ” μ„ ν˜Έν•˜μ§€λ§Œ, μ΅œκ·Όμ—λŠ” μ’€ 더 ν‘œμ€€ν™”λœ 3byte의 UTF-8 방식을 더 μ„ ν˜Έν•©λ‹ˆλ‹€.

Base64 인코딩

Base64 인코딩은 λ°”μ΄λ„ˆλ¦¬ 데이터(컴퓨터가 μ΄ν•΄ν•˜λŠ” 0κ³Ό 1둜 이루어진 데이터)λ₯Ό λ¬Έμžμ— 영ν–₯을 받지 μ•ŠλŠ” ASCII λ¬Έμžμ—΄λ‘œ λ³€κ²½ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ λ‹€λ₯Έ μΈμ½”λ”©κ³ΌλŠ” 무슨 차이점이 μžˆμ„κΉŒμš”? 각각의 ν”„λ‘œκ·Έλž¨μ΄ 데이터λ₯Ό 주고받을 λ•Œ, 인코딩 방식이 μ‘°κΈˆμ”© λ‹€λ₯Έ κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ²½μš°μ— 같은 데이터도 λ‹€λ₯΄κ²Œ 해석할 κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 데이터 전솑 μ‹œ λ‹€μ–‘ν•œ 문자(ν•œκ΅­μ–΄, 인도어, 일본어 λ“±λ“±)와 μƒκ΄€μ—†λŠ” ASCII λ¬Έμžμ—΄λ‘œλ§Œ κ΅¬μ„±ν•˜λŠ” Base64 인코딩을 μ‚¬μš©ν•˜μ—¬ 인코딩을 ν†΅μΌμ‹œν‚€λŠ”λ° λͺ©μ μ΄ μžˆλ‹€κ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μž₯점 λ•Œλ¬Έμ— μΆ”κ°€μ μœΌλ‘œλŠ” HTTP ν”„λ‘œν† μ½œμ—μ„œ 특수문자 νŒŒμ‹± 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 것도 κ°€λŠ₯ν•©λ‹ˆλ‹€. λ˜ν•œ μš©λŸ‰μ΄ 적은 파일 전솑 μ‹œμ—λ„ μ‚¬μš©λ©λ‹ˆλ‹€.


JavaScript ν•¨μˆ˜

encodeURI() decodeURI()

encodeURIλŠ” νŠΉμ •ν•œ 문자λ₯Ό UTF-8둜 μΈμ½”λ”©ν•˜μ—¬ μ—°μ†λœ μ΄μŠ€μΌ€μ΄ν”„ 문자둜 λ³€κ²½ν•΄ μ€λ‹ˆλ‹€. 기본적으둜 인터넷 url에 μ‚¬μš©ν•˜λŠ” :, ;, /, =, ?, & 등을 μ œμ™Έν•˜κ³  인코딩을 ν•©λ‹ˆλ‹€. decodeURIλŠ” encodeURI와 λ°˜λŒ€λ‘œ μΈμ½”λ”©ν•œ λ¬Έμžμ—΄μ„ λ””μ½”λ”©ν•˜λŠ” ν•¨μˆ˜λΌκ³  ν•  수 있고, λ³€κ²½ν•˜μ§€ μ•ŠλŠ” λ¬ΈμžλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #

encodeURIComponent() decodeURIComponent()

기본적으둜 μœ„μ˜ encodeURI()와 λ‹€λ₯΄κ²Œ encodeURIComponent()은 λͺ¨λ“  문자λ₯Ό μΈμ½”λ”©ν•©λ‹ˆλ‹€.


μ‹€μŠ΅

μ•„λž˜μ˜ λ‚΄μš©μ„ 톡해 μ§κ΄€μ μœΌλ‘œ μ‹€μŠ΅μ„ ν•΄λ΄…μ‹œλ‹€.

ν•œκΈ€ 인코딩

ν•œκ΅­μ–΄λŠ” λ³€ν™˜λ˜μ–΄ 인코딩이 λ˜μ–΄ ν‘œμΆœλ©λ‹ˆλ‹€.

javascript
let uri = 'κ°•'
console.log(encodeURI( uri ))
console.log(encodeURIComponent( uri ))
console.log(decodeURI( uri ))
console.log(decodeURIComponent( uri ))
 
'''
%EA%B0%95
%EA%B0%95
κ°•
κ°•
'''

μ˜μ–΄ 인코딩

μ˜μ–΄λŠ” λ³€ν™˜λ˜λŠ” 것이 μ—†μŠ΅λ‹ˆλ‹€.

javascript
let uri = 'hanpy'
console.log(encodeURI( uri ))
console.log(encodeURIComponent( uri ))
console.log(decodeURI( uri ))
console.log(decodeURIComponent( uri ))
 
'''
hanpy
hanpy
hanpy
hanpy
'''

숫자 인코딩

μˆ«μžλŠ” λ³€ν™˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

javascript
 

특수문자 인코딩

특수문자 같은 경우 encodeURI와 encodeURIComponent의 차이λ₯Ό μ•„λž˜μ™€ 같이 확인 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

javascript
let uri = ':, ;, /, =, ?, &'
console.log(encodeURI( uri ))
console.log(encodeURIComponent( uri ))
console.log(decodeURI( uri ))
console.log(decodeURIComponent( uri ))
 
'''
:,%20;,%20/,%20=,%20?,%20&
%3A%2C%20%3B%2C%20%2F%2C%20%3D%2C%20%3F%2C%20%26
:, ;, /, =, ?, &
:, ;, /, =, ?, &
'''

Url 인코딩

url 인코딩 μ‹œμ—λŠ” encodeURIλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

javascript
let uri = 'https://www.hanpy.com/encode?a=b&b=λ°°κ³ ν”„λ‹€'
console.log(encodeURI( uri ))
console.log(encodeURIComponent( uri ))
console.log(decodeURI( uri ))
console.log(decodeURIComponent( uri ))
 
'''
https://www.hanpy.com/encode?a=b&b=%EB%B0%B0%EA%B3%A0%ED%94%84%EB%8B%A4
https%3A%2F%2Fwww.hanpy.com%2Fencode%3Fa%3Db%26b%3D%EB%B0%B0%EA%B3%A0%ED%94%84%EB%8B%A4
https://www.hanpy.com/encode?a=b&b=λ°°κ³ ν”„λ‹€
https://www.hanpy.com/encode?a=b&b=λ°°κ³ ν”„λ‹€
'''