암호화 vs 인코딩

누피밥·2025년 2월 8일
0

보안

목록 보기
1/2

데이터를 변환하는 방법에는 암호화(Encryption)인코딩(Encoding)이 있습니다. 둘 다 데이터를 변환하는 과정이지만, 목적과 방식이 다릅니다. 이 글에서는 암호화와 인코딩의 차이점을 쉽게 이해할 수 있도록 설명해 보겠습니다.

암호화와 인코딩의 공통점

둘 다 데이터를 변환하는 과정입니다.
원본 데이터를 다른 형태로 변경하여 저장하거나 전송할 수 있도록 합니다.

하지만, 암호화는 보안을 위한 것이고, 인코딩은 데이터를 효율적으로 저장하거나 전송하기 위한 것이라는 차이점이 있습니다.

암호화 vs 인코딩 비교 표

목적데이터를 변환하여 호환성 및 가독성을 높이기 위함데이터를 보호하기 위함
복원 가능 여부누구나 쉽게 디코딩 가능키 없이는 복호화 불가능
예제UTF-8, Base64, URL EncodingAES, RSA, DES

인코딩이란?

인코딩(Encoding)은 데이터를 변환하여 전송하거나 저장하기 쉽게 만드는 과정입니다. 암호화와 달리 보안 목적이 아니라, 데이터의 호환성을 높이는 것이 목적입니다.

1. Base64 인코딩 예제

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는 바이너리 데이터를 문자 데이터로 변환하여 텍스트 환경에서 저장할 때 유용합니다.

2. URL 인코딩 예제

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)는 데이터를 보호하기 위해 보안 키를 사용하여 변환하는 과정입니다. 암호화된 데이터는 올바른 키 없이 복호화할 수 없습니다.

1. 대칭키(AES) 암호화

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는 빠르고 강력한 보안성을 제공하지만, 키가 노출되면 보안이 취약해질 수 있습니다.

2. 비대칭키(RSA) 암호화

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는 보안을 위해 데이터를 암호화할 때 사용됩니다.

0개의 댓글