데이터를 변환하는 방법에는 암호화(Encryption)와 인코딩(Encoding)이 있습니다. 둘 다 데이터를 변환하는 과정이지만, 목적과 방식이 다릅니다. 이 글에서는 암호화와 인코딩의 차이점을 쉽게 이해할 수 있도록 설명해 보겠습니다.
둘 다 데이터를 변환하는 과정입니다.
원본 데이터를 다른 형태로 변경하여 저장하거나 전송할 수 있도록 합니다.
하지만, 암호화는 보안을 위한 것이고, 인코딩은 데이터를 효율적으로 저장하거나 전송하기 위한 것이라는 차이점이 있습니다.
목적 | 데이터를 변환하여 호환성 및 가독성을 높이기 위함 | 데이터를 보호하기 위함 |
---|---|---|
복원 가능 여부 | 누구나 쉽게 디코딩 가능 | 키 없이는 복호화 불가능 |
예제 | UTF-8, Base64, URL Encoding | AES, RSA, DES |
인코딩(Encoding)은 데이터를 변환하여 전송하거나 저장하기 쉽게 만드는 과정입니다. 암호화와 달리 보안 목적이 아니라, 데이터의 호환성을 높이는 것이 목적입니다.
Base64는 텍스트 데이터를 이진(binary) 형태로 변환하는 과정입니다. 바이너리 데이터를 사람이 읽을 수 있는 ASCII 문자열로 변환하는 방식으로, 이메일 첨부파일, JSON 데이터 전송 등에 사용됩니다.
const text = "Hello, World!";
const encodedText = btoa(text); // Base64 인코딩
console.log(encodedText); // "SGVsbG8sIFdvcmxkIQ=="
const decodedText = atob(encodedText); // 디코딩
console.log(decodedText); // "Hello, World!"
Base64는 바이너리 데이터를 문자 데이터로 변환하여 텍스트 환경에서 저장할 때 유용합니다.
URL 인코딩은 특수문자를 안전하게 변환하여 URL에서 사용할 수 있도록 하는 방식입니다.
const url = "https://example.com?q=hello world!";
const encodedUrl = encodeURIComponent(url);
console.log(encodedUrl);
// "https%3A%2F%2Fexample.com%3Fq%3Dhello%20world%21"
const decodedUrl = decodeURIComponent(encodedUrl);
console.log(decodedUrl);
// "https://example.com?q=hello world!"
URL 인코딩을 사용하면 브라우저가 URL을 정상적으로 해석할 수 있습니다.
암호화(Encryption)는 데이터를 보호하기 위해 보안 키를 사용하여 변환하는 과정입니다. 암호화된 데이터는 올바른 키 없이 복호화할 수 없습니다.
AES(Advanced Encryption Standard)는 가장 많이 사용되는 대칭키 암호화 방식입니다. 같은 키를 사용하여 암호화와 복호화를 수행합니다.
const text = "Sensitive Data";
const key = CryptoJS.enc.Utf8.parse("1234567890123456"); // 16바이트 키
const encryptedText = CryptoJS.AES.encrypt(text, key).toString();
console.log(encryptedText);
const decryptedText = CryptoJS.AES.decrypt(encryptedText, key).toString(CryptoJS.enc.Utf8);
console.log(decryptedText); // "Sensitive Data"
AES는 빠르고 강력한 보안성을 제공하지만, 키가 노출되면 보안이 취약해질 수 있습니다.
RSA는 공개키와 개인키를 사용하는 비대칭키 암호화 방식입니다.
async function generateRSAKeyPair() {
return await window.crypto.subtle.generateKey(
{ name: "RSA-OAEP", modulusLength: 2048, hash: "SHA-256" },
true,
["encrypt", "decrypt"]
);
}
async function encryptData(publicKey, data) {
const encoded = new TextEncoder().encode(data);
const encrypted = await window.crypto.subtle.encrypt({ name: "RSA-OAEP" }, publicKey, encoded);
return encrypted;
}
async function decryptData(privateKey, encryptedData) {
const decrypted = await window.crypto.subtle.decrypt({ name: "RSA-OAEP" }, privateKey, encryptedData);
return new TextDecoder().decode(decrypted);
}
RSA는 보안성이 높지만, 연산 속도가 느리다는 단점이 있습니다.
인코딩(Encoding)은 데이터를 변환하여 호환성과 가독성을 높이는 기술이며, 누구나 디코딩할 수 있습니다. 암호화(Encryption)는 데이터를 보호하기 위한 보안 기술이며, 올바른 키 없이 복호화할 수 없습니다.
Base64, URL Encoding은 데이터를 변환하여 저장 또는 전송할 때 사용되며, AES, RSA는 보안을 위해 데이터를 암호화할 때 사용됩니다.