-
JWT는 왜 base64로 encoding 하는 걸까?각종 학습 요약/Concept 2022. 7. 28. 10:53
요즘 JWT를 공부하고 있는데요. 사용할 때 보면 약속이라도 한 듯이 encode/decode해서 사용하더라고요.
encrypt/decrypt도 아니고(그러니까 보안의 목적도 아니고), 굳이 난독화 해서 보낼 이유가 있나? 라는 생각이 들었어요.
JWT는 서버 부하를 줄여주기 위해 도입되는 컨셉트인데, 쓸데없는 연산처리를 덧붙인다고? 그럴리가 없을텐데. 그럼 이유가 있을텐데. 고런 의식의 흐름이 흘러갔습니다.그래서 일단 구글링을 해보았는데요. 시원하게 이해되는 명쾌한 답변은 얻지 못했습니다. 아쉽게도요.
그래도 찾아본 내용들을 바탕으로 개인적으로 생각을 해보았고, 제 나름대로 내린 답을 공유해보겠습니다. 비판적으로 수용해주세요. 😀JWT가 사용될 환경을 상상해보자
하나의 서버가 모든 것을 처리할 수 있는 규모의 서비스라면 사실 JWT는 별 필요가 없을 거에요.
JWT가 필요한 순간은 DB가 병목을 일으키고, 분산된 서버들 간에 세션을 공유하기 위해 여러가지 방법을 고안해야만 하고, MSA가 적용되고, 폴리글랏이 적용된 서비스.
어떤 서버는 OS가 Linux고, 어떤 서버는 MS Server, 어디는 Redhat, 또 어디는 언어가 Java, 어디는 Python, C#, Ruby... 이렇게 인가 정보를 공유하기 위해 너무 큰 비용이 들어갈 때, 인가 정보를 더이상 서버가 관리할 필요가 없도록 하는 것이 JWT인 것이죠.Base64 - 모든 데이터는 어차피
갑자기 좀 딴 얘기인데, 모든 데이터는 어차피 0과 1입니다. 그쵸? 컴퓨터가 연산을 하려면 0과 1로 표현되어야 하잖아요. 그게 문자든 숫자든 미디어든.
"hello"가 있다고 해볼게요. hello를 0과 1로 표현합니다. Windows에서요.
그 0과 1의 나열을 가져다가 Mac에서 써요. 그러면 hello 그대로 사용할 수 있을까요?데이터를 0과 1로 변환하는건 OS와 하드웨어 레벨에서 일어나는 일이죠. 지금은 간단히 OS라고 해볼게요.
한 데이터를 여러 OS에 넘나들며 사용할 필요가 있다면? 애초에 공통되게 해석할 수 있는 데이터여야 할 거에요.단순히 문자 데이터 같은건, 하다못해 CharacterSet만 바뀌어도 깨지고 난리가 나니까요. 0과 1로 바꿨을 때 보장이 안되겠죠.
그럼 이제 고민에 빠지는거죠. hello를 전달하고 싶은데, 어디서나 공통적으로 쓸 수 있는 형태로. 근데 0과 1로 바로 표현하는건 너무 빡세서 하드웨어가 해줄거고. 적당히 변환할 수 없을까.0과 1. 그러니까 숫자를 도입하면 0-9, 총 10개의 문자를 얻을 수 있습니다.
숫자 만큼이나 통용되는 문자셋이 있죠. A-Z의 알파벳. 대문자만 해도 26개에요. 52개. 도합이 62개네요. 2의 승수로 아름답게 표현하기 위해서..ㅋㅋ... 두 개의 문자만 더하면 64가 되네요. 64진법으로 표현할 수 있겠어요!네. 그래서 Base64를 사용하는 것이죠.
마무리 - 이유가 명확해졌다
어떤 OS, 어떤 환경, 어떤 언어로 넘겨지더라도 동일한 "hello" 데이터를 받을 수 있다면? 너무 좋겠죠.
동일한 인가 정보를 받을 수 있다면?? 너무너무너무너무 너어어어어무 좋겠죠.
그런데 인가 정보를 담고 있는게 JWT잖아? base64로 인코딩하면 잘 넘겨지잖아? 너어어어어무 좋은 거잖아.
네 그렇게 되는 것입니다. 이것이 제가 납득하게 된, JWT를 base64로 사용하는 이유였습니다.- 추가: safe-encoding이기 때문에 url, session, cookie, 어디에든 넣어줄 수 있습니다!
'각종 학습 요약 > Concept' 카테고리의 다른 글
Concept: 영속성Persistence이란? (0) 2022.07.05 Concept: 시간복잡도의 기본적인 이해 (2) 2022.05.31 Concept : 재귀(Recursion)의 기본 개념 이해하기 (4) 2022.05.24 컴퓨터의 이해 (0) 2022.04.26 프로그래밍의 이해 (0) 2022.04.26