• 사용 의의

    • 문자를 컴퓨터가 처리할 수 있는 이진 데이터(0과 1)의 조합으로 변환
  • UTF

    • UTF (Universal Coded Character Set Transformation Format)
    • 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준
  • UTF-8

    • Universal Coded Character Set Transformation Format 8bit 을 의미한다.
    • 8비트 * n 크기의 가변 길이 문자 인코딩 방식이다.
      • ASCII는 1 바이트(8비트)로 128(2^7)개의 문자를 표현하므로 ASCII는 UTF-8의 부분집합으로도 볼 수 있다.
    • UTF-8 문자의 크기는 1바이트에서 4바이트 사이이다.
      • 영어는 1바이트로 표현되고, 한국어나 중국어와 같은 문자는 3바이트로 표현된다.
    • 가장 많이 쓰이는 인코딩 방식이다.
    • 실제 사용 예시
      • UTF-8 인코딩을 적용할 시, (Kotlin 기준으로) List<Int> 타입의 결과를 리턴하는 경우가 종종 있다.
        • (Kotlin 기준으로) Int는 4바이트로 표현되며, 이는 UTF-8 문자 크기에 부합한다.
      • (Dart 기준) 대칭키 암호화 알고리즘인 AES 256의 키로 UTF-8 문자열을 입력하는 Dart 예시
        • const aesKey = 'E4rqzxa37VCwz7I/enrUy1S/xwH6BR=='; // 32개의 문자로 구성된 UTF-8 문자열
        • final key = enc.Key.fromUtf8(aesKey);
        • 어째서 32개의 문자를 사용하는가?
          • AES 256 은 256 비트 사이즈의 키를 사용한다.
          • "256 비트 = 32개의 문자 = 32 바이트"이고 1 바이트는 하나의 ASCII 문자에 대응된다.
  • UTF-16

    • 16비트 * n 크기의 가변 길이 문자 인코딩 방식이다.
    • UTF-8 vs UTF-16 둘 중 어느것을 써야 하는가?
      • 최소로 필요한 바이트 수가 1이냐, 2이냐에 달렸다.
      • 데이터 저장 및 통신이 필요하다고 가정할 시, 필요로 하는 데이터의 최소 사이즈에 맞춰 선택하면 된다.
  • Base64

    • 바이너리 데이터를 텍스트 형식으로 표현하기 위해 사용된다.

    • 다음의 예시를 가정하자.

      • static String encryptAES(String plaintext) {

         final key = enc.Key.fromUtf8(aesKey);
        
         final iv = enc.IV.fromUtf8(aesIv);
        
         final encrypter = enc.Encrypter(enc.AES(key, mode: enc.AESMode.cbc, padding: EncryptionModes.AESPADDING));
        
         final encrypted = encrypter.encrypt(plaintext, iv: iv);
        
         return encrypted.base64;
        

        }

    • encrypted 자체는 바이너리 데이터이기 때문에 base64 인코딩을 적용해 문자열로 변경하도록 한다.

    • 필요성

      • 이메일, HTTP 요청, URL 등의 많은 프로토콜은 바이너리가 아닌, 텍스트 기반으로 데이터를 처리한다.
    • 어떻게 인코딩 되는가?

      • Base64는 8비트 바이너리 데이터를 6비트 단위로 나누어 처리한다.
    • 이름의 유래

      • 6비트는 64가지 (2^6) 값을 표현할 수 있다.
      • 알파벳, 대소문자, 숫자, +, /의 64개 문자로 매핑하여 표현한다.
        • 0-25는 A-Z
        • 26-51은 a-z
        • 52-61은 0-9
        • 62는 +
        • 63은 /
    • 패딩 적용

      • 인코딩 결과의 길이가 4바이트 배수가 되도록 추가 문자(=)를 사용한다.
      • 예시
        • 8비트 원본 데이터: 01001101
        • 6비트 단위로 나누기: 010011 01
        • 부족한 비트 채우기: 010011 010000 (4비트를 추가하여 2개의 6비트 블록 생성)
        • Base64 인코딩 문자로 변환: 010011 -> T, 010000 -> Q
        • 4바이트의 배수가 되도록 '=' 문자 채워넣기: TQ==
  • URL 인코딩

    • 필요성
      • URL은 ASCII 문자로만 구성되어야 하기 때문
    • 인코딩 방법
      • URL에서 사용할 수 없는 문자나 특별한 의미를 가진 문자 선택 (예: 한글, 공백, 특수 문자 등)
      • 선택된 문자의 UTF-8 바이트 시퀀스를 생성
      • % 다음에 해당 바이트의 16진수 표현으로 인코딩한 결과를 붙인다.
      • 과정
        • 안 -> U+C548
        • 유니코드: 1100 0101 0100 1000
        • UTF-8 변환 (한글이므로 3바이트): 1110 1100 1001 0101 1000 1000
          • 붉은색은 고정된 자리이다.
        • 16진수: EC 95 88
        • 결과: %EC%95%88
    • 입력값에 따른 인코딩 결과
      • 공백(스페이스) -> %20
      • @ -> %40
      • Hello World! -> Hello%20World%21
      • 안녕하세요 -> %EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94
      • search?query=hello world -> search?query=hello%20world