참고
https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html
Base64 (Java Platform SE 8 )
This class consists exclusively of static methods for obtaining encoders and decoders for the Base64 encoding scheme. The implementation of this class supports the following types of Base64 as specified in RFC 4648 and RFC 2045. Basic Uses "The Base64 Alph
docs.oracle.com
직장 동료에게 뭐가 안된다고 해서 받던 코드에서 이런 문구가 있었다.
code = Base64Utils.encodeToString(code.getBytes());
Base64Utils ? 저런 내장 메소드가 있었나 해서 찾아보니 Spring-core에 내장되어 있는 클래스였다.
그래서 안을 까보니 밑에 사진 같은 형태였다.
encode? 쫓아가자
Java에서 제공하는 메소드를 사용하기 쉽게 만든 느낌?
저거 때문에 의존성 추가해서 사용하기 보단(물어본 직장 동료는 boot를 사용하고 있어서 spring-core가 없었음) 코드를 바꿔줬다.
code = new String(Base64.getEncoder().encode(code.getBytes()),"UTF-8");
Base64는 그냥 인코딩 방식 중 하나로 알고 있었는데 이번 기회에 다시 공부해봤다.
https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%9D%B4%EC%8A%A464
베이스64 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 컴퓨터 분야에서 쓰이는 Base 64 (베이스 육십사)란 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의
ko.wikipedia.org
Base 64
8비트 이진 데이터(ex. 실행파일, ZIP 파일)를 문자 코드에 영향을 받지 않은 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념. 단어의 의미는 64진법. 이름 그대로 0~63개의 ASCII 문자들을 써서 표현한다. 이 인코딩은 전자 메일을 통한 이진 데이터 전송 등에 많이 쓰이고 있다.
Base 64에는 어떤 문자와 기호를 쓰느냐에 따라 여러 변종이 있지만, 잘 알려진 것은 모두 처음 62개는 알파벳 A-Z, a-z와 0-9를 사용하고 있으며 마지막 두 개를 어떤 기호를 쓰느냐의 차이만 있다.
정확한 규격은 RFC 1421, RFC 2045에 정의된다. 연속된 8비트 바이트를 인코딩하도록 정의되어 있으며, 이는 대부분 시스템에서 파일의 정의와 들어맞는다. 베이스64 코딩을 거친 결과물은 원본보다 대략 4/3 정도 크기가 늘어나게 되며, 보통 의미없어 보이는 문자열이 나열된 형태가 된다.
RFC란?
RFC (Request for Comments)란? - RFC의 역사, RFC 종류, RFC 표준화 절차
RFC (Request for Comments)란?RFC (Request for Comments)란 미국의 국제 인터넷 표준화기구인 IETF(Internet Engineering Task Force)에서 제공, 관리하는 문서로, 인터넷 개발에 있어서 필요한 기술, 연구 결과, 절차 등
net-study.club
여기에 잘 설명되어 있음.
import java.util.Base64;
/**
* java.util.Base64 활용해보기
*/
public class MyBase64 {
public static void main(String[] args) {
/*
* public static String encodeToString(byte[] src)
* public static Base64.Encoder getEncoder()
* public static Base64.Encoder geturlStringEncoder()
* public static Base64.Encoder getMimeEncoder()
* public static Base64.Encoder getMimeEncoder(int lineLength,byte[] lineSeparator)
* public static Base64.Decoder getDecoder()
* public static Base64.Decoder geturlStringDecoder()
* public static Base64.Decoder getMimeDecoder()
* */
String urlString = "https://studyingdk.tistory.com/안녕";
String LineString = "줄바꿈 문자 잘 먹는지 알아보자\r\n" +
"내용추가~~~~~~~~\r\n" +
"!@#$%^&*()_-+=`";
// Basic Encoder
Base64.Encoder basicEncoder = Base64.getEncoder();
String basicEncoded = basicEncoder.encodeToString(LineString.getBytes());
System.out.println("==================================Basic Encoder========================================");
System.out.println("Basic Encoded: " + basicEncoded);
// Basic Decoder
Base64.Decoder basicDecoder = Base64.getDecoder();
byte[] basicDecodedBytes = basicDecoder.decode(basicEncoded);
String basicDecoded = new String(basicDecodedBytes);
System.out.println("=======================================================================================");
System.out.println("Basic Decoded: " + basicDecoded);
// url Encoder
Base64.Encoder urlStringEncoder = Base64.getUrlEncoder();
String urlStringEncoded = urlStringEncoder.encodeToString(urlString.getBytes());
System.out.println("\n=================================url Encoder===========================================");
System.out.println("url Encoded: " + urlStringEncoded);
// url Decoder
Base64.Decoder urlStringDecoder = Base64.getUrlDecoder();
byte[] urlStringDecodedBytes = urlStringDecoder.decode(urlStringEncoded);
String urlStringDecoded = new String(urlStringDecodedBytes);
System.out.println("=======================================================================================");
System.out.println("url Decoded: " + urlStringDecoded);
// MIME Encoder
Base64.Encoder mimeEncoder = Base64.getMimeEncoder();
String mimeEncoded = mimeEncoder.encodeToString(LineString.getBytes());
System.out.println("\n=================================MIME Encoder==========================================");
System.out.println("MIME Encoded: " + mimeEncoded);
// MIME Decoder
Base64.Decoder mimeDecoder = Base64.getMimeDecoder();
byte[] mimeDecodedBytes = mimeDecoder.decode(mimeEncoded);
String mimeDecoded = new String(mimeDecodedBytes);
System.out.println("=======================================================================================");
System.out.println("MIME Decoded: " + mimeDecoded +"");
// Custom MIME Encoder with line length and line separator
Base64.Encoder customMimeEncoder1 = Base64.getMimeEncoder(50, new byte[] { '\r', '\n' });
String customMimeEncoded1 = customMimeEncoder1.encodeToString(LineString.getBytes());
System.out.println("\n==================================Custom MIME Encoder1========================================");
System.out.println("Custom MIME Encoded1: " + customMimeEncoded1);
Base64.Encoder customMimeEncoder2 = Base64.getMimeEncoder(1000, new byte[] { '\r', '\n' });
String customMimeEncoded2 = customMimeEncoder2.encodeToString(LineString.getBytes());
System.out.println("====================================Custom MIME Encoder2======================================");
System.out.println("Custom MIME Encoded2: " + customMimeEncoded2);
}
}
● public static String encodeToString(byte[] src)
ㆍ 주어진 바이트 배열을 Base64로 인코딩하여 그 결과를 문자열로 반환.
ㆍ 반환된 문자열에는 어떠한 줄 바꿈 문자(라인 구분자)도 추가되지 않는다.
decode 처럼 바이트 타입을 만들어서 해줘도 되지만 String 타입으로 바꿔주는 변환 메소드가 있어서 이것을 사용하였다.
● public static Base64.Encoder getEncoder()
ㆍ 기본(Base64) 인코더를 반환.
ㆍ 이 인코더는 RFC 4648 및 RFC 2045에서 정의된 "The Base64 Alphabet"을 사용한다.
ㆍ 인코딩된 데이터에는 어떠한 줄 바꿈 문자(라인 구분자)도 추가되지 않는다.
● public static Base64.Decoder getDecoder()
ㆍ 기본(Base64) 디코더를 반환.
ㆍ 디코더는 기본 64진법 알파벳 외의 문자가 포함된 데이터를 거부한다.
일반적으로 사용했던 getEncoder, getDecoer (밑에 메소드는 어떤 곳에서 활용되는지 잘 모르겠다..ㅠ)
● public static Base64.Encoder getUrlEncoder()
ㆍ URL 및 파일 이름에 안전한(Base64) 인코더를 반환.
ㆍ RFC 4648에서 정의된 "URL and Filename safe Base64 Alphabet"을 사용.
ㆍ 인코딩된 데이터에는 어떠한 줄 바꿈 문자(라인 구분자)도 추가되지 않는다.
● public static Base64.Decoder getUrlDecoder()
ㆍ URL 및 파일 이름에 안전한(Base64) 디코더를 반환한다.
ㆍ 디코더는 기본 64진법 알파벳 외의 문자가 포함된 데이터를 거부한다.
● public static Base64.Encoder getMimeEncoder()
ㆍ MIME(Base64) 인코더를 반환.
ㆍ RFC 2045에서 정의된 "The Base64 Alphabet"을 사용.
ㆍ 인코딩된 출력은 76자 이하의 줄로 표현되어야 하며, 줄 바꿈 문자는 캐리지 리턴 '\r' 다음에 바로 라인 피드 '\n'로 구성되어야 한다.
ㆍ 인코딩된 출력의 끝에는 라인 구분자가 추가되지 않는다.
● public static Base64.Decoder getMimeDecoder()
ㆍ MIME(Base64) 디코더를 반환한다.
ㆍ 디코더는 기본 64진법 알파벳 외의 문자가 포함된 데이터를 거부하며, 라인 구분자나 다른 알파벳 테이블에 없는 문자를 무시한다.
● public static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)
ㆍ 사용자 정의 MIME(Base64) 인코더를 반환.
ㆍ lineLength는 각 줄의 최대 길이를 나타내며, lineSeparator는 줄 바꿈 문자를 나타낸다.
위에 메소드와 무슨 차이인지 설명만 봤을때는 몰랐는데 예제코드에서 보면 lineLength를 주면 해당 줄 보다 크기가 커지면 다음줄로 넘어간다. 2번째 파라미터는 무슨 의미인지..? (getEncoder의 결과값과는 똑같이 나온다)
'01. Java > 02. etc' 카테고리의 다른 글
[Java]Apache POI (0) | 2023.12.01 |
---|---|
java.util.UUID (0) | 2023.11.21 |
java.lang.System (0) | 2023.11.20 |
java.util.Properties (0) | 2023.11.20 |