본문 바로가기

Java/Java 응용

Base64

컴퓨터 분야에서 쓰이는 Base 64 (베이스 육십사)란 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다.


베이스64 - 위키백과, 우리 모두의 백과사전

https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%9D%B4%EC%8A%A464


Base64는 암호화, 복호화하는 툴이다. 하지만 여기서 암호화라는 것은 정말 다른 사람들이 해독하지 못하게 막는다는 의미보다는 바로 어떤 의미인지 읽어낼 수 없게 만든다는 것에 초점이 맞춰져있을 것이다. 인코딩과 디코딩의 방법이 이미 공개되어있고 조금만 구글링해도 웹상에서 인코딩된 Base64 문자열을 디코딩해주는 사이트가 검색되는 마당에 진정한 의미의 암호화라고할 수 없을 것이다. 그래서 Base64는 언제 왜 쓸까라는 생각에 여러 경로로 확인해보고 개인적으로 생각을 정리해봤다.


첫번째로 URL 등에 파라미터 값이 드러나는 것을 막기 위해서 사용된다. 만일 Web에서 get방식으로 request를 하게 되었을 때, URL에 우리가 서버로 보내고자하는 파라미터 값이 적나라하게 드러나게 된다. 이 때 Base64로 인코딩하여 넘기게 되면 적어도 어떤 내용의 파라미터를 보내는지 바로 확인하지 못하도록 막을 수 있게 된다.


두번째로 띄어쓰기가 문제가 될 때 사용할 수 있다. 위의 경우와 같이 parameter가 있을 때 문자열이 띄어쓰기가 들어간다면 일반적으로 공란을 다른 문자로 치환하여 처리할 수 있다. 하지만 Base64로 인코딩할 경우 띄어쓰기 없이 쭉 이어진 하나의 문자열로 반환되기 때문에 이러한 문제가 발생하지 않는다.


세번째로 Character Set에 구애받지 않고 사용할 수 있다. 클라이언트 to 서버, 서버 to 서버 통신이나 서로 다른 플랫폼 간 데이터 전송 등이 이루어질 때 캐릭터 셋의 차이로 인하여 문자가 깨지는 경우가 많은데, Base64로 인코딩된 문자열은 모두 ASCII 영역의 문자로 치환되기 때문에 전송과정에서 문자열이 깨지는 것을 막을 수 있다. 


마지막으로 이미지나 다른 byte 기반 데이터를 문자열로 바꿔서 저장할 때 사용된다. 처음 Base64를 정의한 부분에서 밝혔다시피 8비트의 이진 데이터를 ASCII 영역 문자들로 전환하는데 사용된다. 이미지 등의 데이터 파일을 Base64로 인코딩한 문자열로 저장해두었다가 디코딩하여 파일로 복원하는 등 인코딩과 디코딩을 이용하여 다양한 종류의 데이터 파일을 문자열로 전환 활용이 가능하다.


위 내용은 OKKY에 올라왔던 Base64 사용 이유에 대한 여러 의견을 종합한 것과 그동안 업무 중에 느낀 점을 정리한 것이다.


OKKY - Base64 왜 사용하는 걸까요?

https://okky.kr/article/276104


기본적인 Java Base64 실습 코드는 다음과 같다.


import java.io.UnsupportedEncodingException;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;

public class Base64Test {
	private static Encoder encoder;
	private static Decoder decoder;

	public Base64Test() {
		encoder = Base64.getEncoder();
		decoder = Base64.getDecoder();
	}

	public static void main(String[] args) {
		// class 초기화 및 encoder, decoder 생성
		Base64Test base64 = new Base64Test();

		// 테스트용 문자열
		String text = "테스트용 텍스트입니다.";
		System.out.println("text: " + text);

		// encoding된 문자열을 반환
		String encodedString = stringEncoder(text);
		System.out.println("encodedString: " + encodedString);

		// encodedString을 다시 원래 문자열로 반환
		String decodedString = stringDecoder(encodedString);
		System.out.println("decodedString: " + decodedString);
	}

	// base64를 이용하여 encoding하는 method
	// 매개변수 String 타입
	private static String stringEncoder(String text) {
		String encodedString = null;

		byte[] textBytes = null;
		try {
			textBytes = text.getBytes("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		// encodeToString를 이용하여 byte배열로 전환된 문자열을 암호화
		encodedString = encoder.encodeToString(textBytes);

		// encoding된 문자열을 return
		return encodedString;
	}

	// base64를 이용하여 decoding하는 method
	// 매개변수 (base64방식으로 encoding된) String 타입
	private static String stringDecoder(String encodedString) {
		String decodedString = null;

		// 인코딩된 문자열을 decoder를 이용하여 decoding함
		byte[] decodedBytes = decoder.decode(encodedString);
		try {
			// byte 배열로 decoding된 문자열을 String으로 전환
			decodedString = new String(decodedBytes, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		// decoding된 문자열을 반환
		return decodedString;
	}
}

'Java > Java 응용' 카테고리의 다른 글

Lombok 시작하기  (0) 2019.03.15
Java xml parser  (0) 2018.06.12
Java 프로그램에서 Proxy 사용  (0) 2018.04.20