base64 vs base64 url safe 그리고 예제!

H_dev·2022년 4월 26일
3

😁 Base64

8비트의 이진 데이터를 문자코드에 영향을 받지 않는 공통 ASCII 문자 들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식

데이터를 base64로 변환하는 것을 인코딩한다, 그 반대를 디코딩 한다고 표현한다. 그리고 6bit씩 잘라서 표현한다.
데이터를 64진법으로 표현하는 방식 / 웹에서 주고받을 때 인코딩 디코딩 주로 함

인코딩 ex)

  • ASCII 문자 a = 97
    -> 2진수 변환 = 0110 0001 후 6개비트로 해야 하기 때문에 0으로 자릿수보정 011000 010000
    -> 자릿수 보정한 것 -> base64는 6bit 묶음을 4세트로 모아 변환하는데 빈 공간은 ‘=’으로 대체
    -> 011000은 24, 010000은 16 = 각각 Y, Q로 변환되고 뒤는 빈공간이기 때문에 ==으로 채워져 YQ== 이라는 값이 나옴

디코딩 ex)

  • 먼저 a의 경우 YQ== 인데 다시 6비트씩의 이진수로 변환한다.
    -> Y = 24, Q = 16 -> 0110 0001 -> 011000010000 디코딩 할 때는 8bit씩 묶는다.
    -> 그럼 01100001 이 묶이고 채워준 0000은 없어진다.
    -> 변환된 2진수를 10진수로 변환 -> 97을 ASCII 표에서 찾으면 a가 그대로 나오게 된다.

😉 Base64 Url Safe

Base64를 사용하면서, 마지막 62,63번 글자가 +,/ 인 것과 pad(=) 가 url에서 사용하는 문자라는 문제 등이 제기 되었다.
(+는 띄어쓰기 의미, /는 경로구분자, =는 name과 value사이에 쓰는 기호)

이 문자들을 전송하게 되면 정상적으로 전송되지 않는 문제가 발생한다고 한다.따라서 이 오류를 막기위해 등장한 것이 Url safe이다. (62,63 변경) Pad(=)는 그대로 가져가지만, 브라우저에서 인식하지 않게끔 한다.


예제코드

임의의 문자열을 인코딩하고 디코딩 해보는 샘플코드를 작성한다.

JAVA 8부터는 표준 API로 Base64 기능을 제공한다고 한다. java.util.Base64를 사용해보도록 하자

encoding 및 decoding

public class Base64Test {

	public static void main(String[] args) {
		
		String sampleText = "dh in ds";
		System.out.println("인코딩할 문자열 : " + sampleText);
		//encoding
		String encodingText = Base64.getEncoder().encodeToString(sampleText.getBytes());
		System.out.println("base64로 인코딩된 문자열: " + encodingText);
		// ZGggaW4gZHM=

		//decoding
		//String new 할때, 바이트 배열이 문자열로 변환됨
		String decodingText = new String(Base64.getDecoder().decode(encodingText));
		System.out.println("base64로 디코딩된 문자열: " + decodingText);
		
	}
}
  • 먼저 임의의 문자열을 생성했다 "dh in ds"

  • Base64.getEncoder().encodeToString() 이 코드는 인코딩을 하는데 문자열로 리턴을 한다는 의미이다. 필요한 매개변수는 byte[] 이다. getBytes(sampleText) 해서 넣어주자

  • 출력해보면 인코딩된 문자열이 정상적으로 출력된다.

  • 다음은 다시 원래대로 돌려보는 과정이다.

  • Base64.getDecoder().decode(encodingText) 말 그대로 디코딩을 한다. 하지만 toString이 없고 직접 넣어야한다.

  • 방법은 쉽다. toString을 해봤는데 객체자체를 값으로 표현해서 쓰지않았고, new String을 해주면 알아서 byte 배열이 문자열로 변환된다.


다음은 url도 다뤄보자
public class Base64UrlSafeText {

	public static void main(String[] args) {
		// 아무거나 넣은 url 준비
		String sampleUrl = "https://www.google.com/search?q=Base64+encode";
		
		String encodingUrl = Base64.getUrlEncoder().encodeToString(sampleUrl.getBytes());
		
		// aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g_cT1CYXNlNjQrZW5jb2Rl
		System.out.println(encodingUrl);
		
		String decodingUrl = new String(Base64.getUrlDecoder().decode(encodingUrl));
		System.out.println(decodingUrl);
	}

}
  • 위의 과정과 동일하다.

  • 다만 Base64가 url을 위한 메서드를 제공해준다는 것 뿐이다.


마침

취업을 하게돼서 전에 했던 프로젝트들에 대한 정리는 추후에 하도록 해야겠다.
당장 공부할게 많아서 바쁜 날들이 될 것 같다. 화이팅!!!!

profile
성장 개발일지

1개의 댓글

comment-user-thumbnail
2022년 4월 27일
  1. 헥사인코딩 알아보기
  2. 디코딩할때 여러 문자열 추가해서 해보기
답글 달기