[Java] Base64 인코딩, 디코딩하는 방법


Development note/Java  2019. 6. 17. 22:48

안녕하세요. 명월입니다.


이 글은 Java에서 Base64를 다루는 방법을 설명한 글입니다.


먼저 base64에 대해서 설명하겠습니다.

base64는 원래는 복잡한 이유와 설명이 있는 데 간단하게 설명하면 우리가 byte 형식으로 되어진 binary데이터를 프로그램 간에 좀 더 다루기 편하게 ascii코드로 이루어진 데이터를 base64라고 합니다.

더 간단하게 이야기 하면 「byte데이터나 stream 데이터를 string 형식으로 표시한 것입니다. 그러나 그 string형식도 encoding에 관계없는 ascii코드로 되어있다.」라고 알고 있으면 이해하기 쉽습니다.

먼저 간단한 파일을 읽어서 base64형식으로 변환하겠습니다.


제 pc의 d드라이브의 work라는 폴더에 hello world라고 작성한 텍스트 파일(test.txt)을 준비했습니다.

그리고 그걸 byte 형식으로 읽어 드려서 base64로 변환하겠습니다.

import java.io.File;
import java.io.FileInputStream;
import java.util.Base64;

public class ReadBase64 {
  public static void main(String[] args) {

    // d드라이브의 work라는 폴더의 test.txt 파일을 읽어드린다.
    byte[] binary = getFileBinary("d:\\work\\test.txt");
    
    // base64의 라이브러리에서 encodeToString를 이용해서 byte[] 형식을 String 형식으로 변환합니다.
    String base64data = Base64.getEncoder().encodeToString(binary);
    // 콘솔에 결과 출력
    System.out.println(base64data);
  }

  // 파일 읽어드리는 함수
  private static byte[] getFileBinary(String filepath) {
    File file = new File(filepath);
    byte[] data = new byte[(int) file.length()];
    try (FileInputStream stream = new FileInputStream(file)) {
      stream.read(data, 0, data.length);
    } catch (Throwable e) {
      e.printStackTrace();
    }
    return data;
  }
}

실행 결과 아래와 같은 결과를 얻었습니다.

그럼 다시 base64로 된 String형식의 데이터를 byte[] 형식으로 읽어서 출력하겠습니다.

import java.util.Base64;

public class ReadBase64 {
  public static void main(String[] args) {
    // 위에서 인코딩했던 base64 데이터입니다.
    String base64data = "SGVsbG8gd29ybGQ=";
    
    // byte형식으로 디코딩합니다.
    byte[] binary = Base64.getDecoder().decode(base64data);
    
    // 결과를 보기 위해 String으로 변환 후 출력하겠습니다.
    System.out.println(new String(binary));
  }
}

실행 결과 아래와 같은 결과를 얻었습니다.

base64의 형식을 byte형식으로 변환했습니다. 예로 binary 데이터가 텍스트 형식이기 때문에 String으로 변환해서 출력하니 Hello world의 결과가 나오네요..


프로그램 간의 통신 시에 사실 base64로 인코딩, 디코딩을 해서 전송을하면 byte 데이터가 늘어나기 때문에 비효율적이기는 합니다. 그대로 byte데이터를 전송하면 되기 때문이죠.

그러나 이 base64의 데이터가 필요할 때가 있긴 있습니다. 예를 들면 ajax로 파일 전송할 때등 말이죠.

[Jquery] ajax를 이용해 파일 업로드하는 방법 - https://nowonbun.tistory.com/475


또는 byte데이터를 그대로 보관하기는 그렇고 String형식으로 text의 파일로 저장할 때 등도 있습니다.(나름 보안입니다.)

무의미한 듯 의외로 많이쓰는 base64에 대한 소개였습니다.