인코딩 (Encoding)
사람이 인지가능한 문자(언어)를 약속된 규칙에 따라 컴퓨터가 이해 가능한 언어인 (0과 1)로 이루어진 코드로 바꾸는 작업을 통틀어 말한다고 한다.
즉 정해진 규칙에 따라 코드화, 암호화, 부호화 하는 것을 말한다.
이렇게 인코딩을 하는 이유는 정보의 형태의 표준화, 보안, 저장 공간 절약 등을 위해서 라고 한다.
종류로는 크게 문자 인코딩, 사진 & 오디오 & 비디오 인코딩 이렇게 나누어 진다고 한다.
내가 추가적으로 생각하는 바
위에서는 정의할 때 암호화? 이 부분이 마음에 걸렸다.
왜냐하면 암호화, 보안 관련은 말 그대로 암호화가(encryption) 책임진다.
그래서 둘의 차이에 대해 알아봐야 한다.
인코딩은 일단 사용자가 인지 가능한 데이터를 컴퓨터가 인지 가능한 데이터로 변경하는 것을 의미한다.
그렇기에 인코딩이 잘못되면 글자가 깨지는 현상을 우리는 확인 가능하다.
반대로 암호화는?
제 3자가 정보를 알아낼 수 없게 만드는 것이다.
그렇기에 이 둘은 공통적으로 목적에 따른 원하는 데이터로 변환하는 것이다.
그러나
인코딩의 경우에는 기존의 데이터를 변환하기 위해 공개적으로 사용하는 알고리즘을 사용한다.
ex) 아스키 문자
=> 그렇기에 누구나 쉽게 디코딩이 가능하다.
=> 따라서 보안 측면보다는 특정 목적을 위해서 데이터를 변환하는데 목적을 둔다.
암호화의 경우에는 당연하게도 복호화 과정이 엄청나게 어렵다.
실제로 복호화를 하기 위해서는 Key가 필요한데, 인코딩의 경우에는 없다.
따라서 나는 인코딩을 보안 목적으로 사용하는 것에는 조금 부정적인 시선이긴 하다.
이 부분에 대해서는 많은 분들의 피드백을 바란다.
문자 인코딩
문자를 byte로 인코딩을 시키는 것이다. 즉 사람이 쓰는 문자를 컴퓨터가 아는 바이너리 데이터로 변환하는 것을 의미한다.
이에는 6가지의 종류가 있다고 한다
- HTML 인코딩
- URL 인코딩
- UNICODE 인코딩
- Base64 인코딩
- ASCII 인코딩
- base16 인코딩
HTML 인코딩
말 그대로 HTML 파일이 올바르게 나타내기 위한 인코딩이라 생각하면 쉽다
URL 인코딩
인터넷을 통해 전송될 수 있는 포맷으로 문자를 변환 시키는 인코딩 방식이다.
ASCII character-set을 사용해 인터넷으로 URL을 보내는데 사용된다 한다.
그래서 URL을 보면 가끔씩 %기호로 시작하는 경우들이 있는데 이에 해당한다 생각하자.
UNICODE 인코딩
많은 인코딩 중 기준이 된다.
전 세계의 대부분의 언어를 인코딩 가능하고 표현또한 가능하다.
보통 UTF-8, UTF-16, UTF-32를 사용한다.
이들은 byte sequences에 따라 각 글자를 표현하는 것이 다르다.
일반적으로는 windows는 내부적으로 UTF-16을 사용, 리눅스는 UTF-8을 사용한다
BASE64 인코딩
얘는 바이너리 데이터를 ASCII 문자로 인코딩 하는데 사용한다.
보통 메일 시스템에서 주로 사용한다고 한다.
만약 어떤 파일이나 이미지가 base64인코딩 없이 메일 시스템에 온다면 메일 SMTP는 바이너리 데이터를 처리할 수 없어서 못보게 된다.
그리고 또한 바이너리 데이터를 쿠키 또는 다른 매개변수로 이동시키는데에도 사용하는데, 데이터를 읽을 수 없도록 만드는 게 목적이다.
다만 이런 경우 사이즈가 늘어나게 된다. => 즉 용량이 늘어나게 된다
그런데도 사용하는 이유로는 아스키 코드가 나오고 추후에 더 많은 언어들이 나옴으로서 아스키 코드를 확장 했는데, 이러면 시스템간 데이터를 전달할 때 오류가 나올 수 있다.
이 부분을 해결하고자 공통 ASCII의 안전한 출력 문자만 사용해 인코딩해 전달하는 것이다.
ASCII 인코딩
우리에게 유명한 아스키 코드관련 인코딩이라 생각하면 된다.
대부분의 현대 문자 인코딩 방법들이 다 아스키를 기본으로 하지만 훨 씬 더 많은 언어를 표현 가느앟다.
HEX(Base16) 인코딩
이는 정식적인 표준은 아니다.
각각의 byte를 두 자리의 base-16 인코딩으로 변환하고 일반적으로 이를 다시 아스키로 인코딩 한다.
비효율 적이지만 바이너리 데이터를 plain text로 나타낼때 주로 사용하낟.
base64와의 차이점은 그냥 어떻게 바이트를 나타내는지가 다른 것이다.
base64는 3 바이트당 4자, hex는 1 바이트당 2자를 사용하니 base64가 더 효율적이다.
사진 & 오디오 & 비디오 인코딩
간단하게 저장 공간을 절약하기 위해 사용한다.
워낙 현대 기준으로도 용량이 큰 것들이라, 효율적이고 압축된 포맷으로 인코딩이 진행된다.
디코딩(Decoding)
간단하다 인코딩의 반대이다.
즉 인코딩을 한 데이터를 다시 원래의 데이터로 복호화를 한다.
그럼 해시는 어떤 차이가 있는가?
일단 해시는 보안에서도 자주 사용하는 것이기에 해시, 인코딩, 암호화 이 개념이 햇갈렸었다.
해시의 경우에는 a를 넣으면 무조건 b라는 값이 나오게 해시 함수를 통해 결과를 낸다.
이 경우 장점이라고 한다면 해시는 접근이 일반적으로 O(1)로서 엄청 빠르고, 삭제 또한 빠르다. (충돌 없다 가정)
그런데 이 해시는 복호화가 불가능하다
해싱이라고 할때 암호화라고도 많이 부르는데 이 해싱은 암호화랑은 다르게 복호화가 불가능하다.
해시 함수는 임의의 길이를 갖는 비트열을 입력 받아 정해진 길이의 비트열을 반환하는 함수를 해시 함수라 하는데, 그렇기에 입력이 같으면 출력도 같다.
하지만 정 반대로 그 역은 성립하지 않는다.
예를 들어 해시 함수가 간단하게 x^2이라 가정하면, 2랑 -2 둘 다 4라는 결과를 낸다.
즉 해시함수는 정의역과 치역을 1:1로 매핑하지 않고, 해싱을 하면 정보 자체가 줄어들기 때문에 그렇다.
그래서 인코딩, 해싱, 암호화 전부 다 다르다고 생각하면 좋을 것 같다.
후기...
아 사실 이 부분에 대해 정리하는 이유는 내가 인코딩에 대해 무지했구나를 깨달았기 때문이었다...
해시도 정의에 대해서 알지 왜 복호화가 되지 않는가에 대한 이유를 제대로 몰랐었고,
특히 base64에 대해서는 더 깊고 자세하게 알아야 한다는 것을 알게 되었다.
특히 인코딩을 사용하면서 이것에 대한 깊게 공부해 볼 생각을 안했던 것은 내 방심이 맞았다. 다음 소마에서는 이런 실수가 없기를....
많은 반성... 또 반성을 해본다... 하지만 다음에 나올때는 이런 실수 없게 만드는 것이 목적이 아닌가! 화이팅!
참고자료
https://youreamazing.tistory.com/79
'CS > 잡 지식' 카테고리의 다른 글
Redis vs Memcached (0) | 2023.06.25 |
---|---|
(Nonblocking vs Blocking) vs (비동기 vs 동기) (0) | 2023.06.24 |
스레드(2) - 스레드 with Java (0) | 2022.12.26 |
스레드(1) - 멀티 프로세스(병렬처리) (1) | 2022.12.26 |
동시성 vs 병렬성 (2) | 2022.12.26 |
댓글