클라이언트와 서버간에 한글이 포함된 전문을 주고 받을 때 한글이 깨지게 되는 경우가 종종 있다. 한글 인코딩이 깨지지 않기 위한 손쉬운 방법은 문자열을 서버로 전달하기 전에 BASE64 인코딩을 하고 서버에서 디코딩을 하는 것이다.

간단히 아스키문자들만 인(디)코딩해도 되는 경우라면 브라우져에서는 atob, btoa 를 사용할 수 있다. 하지만 이 함수들은 한글이 포함된 문자열(Unicode)은 인코딩/디코딩을 할 수 없고 Node 환경에서도 사용할 수가 없다.

본 글에서는 한글을 포함한 자바스크립트의 UTF8 문자열을 인코딩/디코딩을 하는 방법을 알아본다.


클라이언트(브라우져)에서

TextEncoderbase64-js 를 사용해서 Base64Encode, Base64Decode 함수를 정의할 수 있다. TextDecoder 는 Node 환경에서 사용할 수 없다.

function Base64Encode(str, encoding = 'utf-8') {
    var bytes = new (TextEncoder || TextEncoderLite)(encoding).encode(str);        
    return base64js.fromByteArray(bytes);
}

function Base64Decode(str, encoding = 'utf-8') {
    var bytes = base64js.toByteArray(str);
    return new (TextDecoder || TextDecoderLite)(encoding).decode(bytes);
}


서버(Node)에서

function base64encode(plaintext){
    return Buffer.from(plaintext, "utf8").toString('base64');
}

function base64decode(base64text){
    return Buffer.from(base64text, 'base64').toString('utf8');
}


Ref.