본문 바로가기

Spring Boot

기본 인증과 인코딩 : 인코딩과 Base64URL

인코딩(Encoding)

영상 편집할때의 그 인코딩

 

 - 인코딩이 무엇인가?

 - 우리가 이미 쓰고 있는 인코딩의 예시(이모지, 한글, QR코드 등등..)

 - Base64, Base64URL의 원리

 - HTTP 헤더에서 인코딩이 필요한 이유

 - 인코딩의 암호화, 압축의 차이

 

인코딩의 개념, 필요성

1) 인코딩(Encoding)

데이터를 다른 표현 규칙으로 바꾸는 것. 중요한건 내용 자체는 변하지 않고, 표현 방식이 달라진다는 것임

가령 "A"라는 글자는 컴퓨터 내부에서 2진수(01000001)의 형태로 저장됨. 이걸 사람이 보기 편하게 A라고 인코딩하는 것

 

2) 인코딩이 왜 필요함?

 1. 소통을 위해서 : 서로 다른 언어나 기기에 같은 정보를 주고받기 위해서 필요함

 2. 전송 안정성 : 어떤 통로(스트림?)는 한글이나 특수문자를 제대로 읽지 못할 수 있음, 이럴때 인코딩을 해줘야함

 3. 저장 호환성 : 텍스트 파일, 이메일, 웹 요청 등에서 문제가 생기지 않도록 도울 수 있음

 

3) 인코딩 예시

문자 인코딩 : 카톡에서 보낸 이모티콘이 상대방에게도 똑같이 보이게끔 함(UTF-8과 같은 같은 규칙으로 표현해줌)

URL 인코딩 : 주소창에 공백 대신 %20이 들어감(https://www.naver.com/hello%20world)

동영상 인코딩 : 유튜브에서 같은 경상을 240p ~ 1080p 등으로 선택할 수 있게끔 함(영상 데이터를 다른 규칙으로 표현함)

QR코드 : 단순 흑백점들이 문자, 링크, 숫자로 변환되는 과정도 인코딩의 사례라고 볼 수 있음

 

인코딩 예시

 

 

Base64 인코딩

1) 왜 또다른 인코딩이 필요한가?

 - 이메일, HTTP헤더 같은 통로는 특수문자나 바이너리(사진, 음악 파일 등등..)를 직접 담기 어려움

 - 그래서 모든 데이터를 알파벳 + 숫자만으로 바꿔서 안전하게 보내는 방식이 필요한데, 그게 Base64라고 함

 

2) 원리

 - 3바이트(24비트)를 - > 6비트씩 잘라서 - > 4개의 문자로 바꿈

 - 총 64개의 안전한 문자(A-Z, a-z, 0-9, /)만 사용함

 - 나머지가 부족하면 = 기호로 채움

 

예 : "Man" -> "TWFu"

 - Man을 24비트로 바꿈, 01001101 01100001 01101110

 - 이걸 6비트씩 4개로 나눔, 010011 010110 000101 101110

 - 각 값을 Base64에 맵핑시킴, T W F u

 - Man - > TWFu 인코딩 완료

 

3) 예제

public class example {
	public static void main(String[] args) {
    	String text = "hello, world!";
        String encoded = Base64.getEncoder().encodeToString(text.getBytes());
        String decoded = new String(Base64.getDecoder().decode(encoded));
        System.out.println("인코딩: " + encoded);
        System.out.println("디코딩: " + decoded);
    }
}

 

결과

인코딩: aGVsbG8sIHdvcmxkIQ==
디코딩: hello, world!

 

 

Base64URL 인코딩

1) 얘는 뭐야?

URL에서 +, /, = 와 같은 문자가 문제를 일으킬 수 있음

그래서 이 문자들을 제거하고 바꾼게 Base64URL

aGVsbG8sIHdvcmxkIQ== 이렇게 생긴걸 aGVsbG8sIHdvcmxkIQ 이렇게 바꾼다\

 

 

HTTP 헤더에서 인코딩 활용

Basic 인증에서 아이디, 비밀번호를 username:password로 합친 후에 Base64로 인코딩함

서버는 이걸 디코딩해서 사용자를 확인한다

Authorization: Basic aGVsbG8sIHdvcmxkIQ==

 

Base64 인코딩 흐름 다이어그램

 

사용자가 클라이언트를 통해 아이디, 비밀번호 입력 - > 클라이언트가 username:password로 합친 후 base64 인코딩

- > 클라이언트가 서버에게 Authoriazation 헤더에 포함시켜서 전송 - > 디코딩 후 사용자를 확인 - > 인증 여부 응답