안녕하세요
디바이스마트의 멋이밴놈 솔다입니다
코로나에 시달린지 1년하고도 몇개월이 지났습니다
최근 다시 신규 확진자가 증가하고 있는 추세라고합니다..ㅠㅠ
음식점이나 카페에 가면 QR코드로 체크인을 하는데
문득 이 QR코드에는 어떤 데이터가 들어을까 궁금해 졌습니다
지금부터 함께 알아보도록 하겠습니다
-
개인적으로 카카오톡 QR체크인을 애용하는데요
켜보면 이런식으로 나옵니다
개인정보보호를 위해 일부 모자이크처리하였습니다
15초의 시간동안 QR코드가 발행이 되는데요
이 QR코드에는 어떤 자료가 있을까요?
이를 확인하기 위해 2D 바코드 스캐너로 QR코드를 찍어봤습니다
"삑!"
메모장에 커서를 놓고 QR코드를 스캔하면
그 QR코드가 가지고 있는 데이터가 문자열로 표시됩니다
키보드가 한글 입력으로 되어있으면 영문 데이터가 한글로 써지니까
한영키를 눌러서 영문 입력으로 바꿔 준 뒤 스캔 해 줍니다
그러면 이런 정체불명의 데이터를 얻을 수 있습니다
우선 앞에 [002|]는 QR코드 생성기의 버전을 뜻하는 것 으로 추측됩니다
나머지 데이터들을 보면 대소문자의 영문자와 숫자가 무작위로 나열되어있습니다
언더바[_]도 몇개 보이네요
근데 자세히 보시면 온점[.]이 두개 들어가 있는 것을 보실 수 있습니다
온점 두개가 포함된 이 문자열은 JWT로 생성된 토큰 문자열입니다
-
그렇다면 JWT가 무엇인가요?
JSON Web Token의 약자입니다
JSON은 또 무엇인가요?
자바 스크립트에서 파생된 속성-값 쌍 표준을 말합니다
파이썬으로 치면 딕셔너리와 매우 유사합니다
위키백과에 예시가 나와있는데 이를 보면 감이 좀 오실겁니다
JSON은 위와 같은 형식으로 이루어진 데이터파일입니다
자 다시 JWT로 돌아와서
JSON으로 만든 웹토큰이라는 뜻인데
JSON이라는 표준이 있으면 JSON으로 그대로 쓰지 왜 또 복잡하게
JWT라는걸 만들었나요?
그건 JSON의 형식으로 작성된 인증키를
URL과 같이 특수문자가 제한된 환경에서 전달하기 위해 만들어 졌습니다
앞서 분석한 것 처럼 JWT를 보니 무작위 영문과 숫자, 온점[.]과 언더바[_]로 쓰여있습니다
URL에는 특수문자나 한글 등을 인코딩 없이 입력할 수 없기 때문에
JSON의 데이터를 URL로 이용할 수 있는 문자만으로 구성된 형식(Base64url 인코딩)
으로 변환한 토큰이라서 웹토큰이라는 이름이 붙여졌습니다
-
JMT...가 아니라 JWT는
두개의 온점이 말 그대로 포인트입니다
[헤더.데이터.서명]
위와 같은 형식으로 온점을 기점으로 구분이 되어있기 때문입니다
백문이 불여일견
수집한 JWT 데이터를 디코딩 해보겠습니다
-
디코딩에는 jwt.io라는 사이트를 활용했습니다
스크롤을 조금만 내리시면 왼쪽에 JWT 데이터를 입력할 수 있는 칸이 있습니다
바로 입력해주겠습니다
※문자열 앞의 [002|]부분은 빼주셔야합니다!
그러면 오른쪽에 자동으로 디코딩 한 데이터가 나옵니다
이것도 하나하나 자세히 살펴보도록 합시다
-
1번타자 헤더입니다
[typ]이라는 키에는 [JWT]라는 값이 부여되어있습니다
해당 json 데이터는 JWT의 형식이라는 뜻입니다
[alg]라는 키는 Algorithm의 약어로
서명시 어떤 알고리즘을 사용했는지 기록하는 키입니다
보시다시피 [HS256] 알고리즘이 적용되어있습니다
여기서 또 의문!
[HS256]은 어떤 알고리즘이에요?
[HS256]은 JWT를 서명하기위해 사용되는 전용 알고리즘 입니다
HMAC SHA-256을 사용한 대칭키 방식입니다
서버와 클라이언트 하나의 키로 인증을 하는 방식입니다
HMAC는 Hash-based Message Authentication Code의 약자입니다
뜻을 풀이하자면 해시기반 메시지 인증 코드 뜻입니다
해시는 암호화 알고리즘 중 하나인데
뒤에 나오는 SHA-256을 거쳐 나온 값을 의미합니다
SHA-256는 매우 흥미로운 암호화 알고리즘입니다
어떠한 값을 입력해도 256비트로 고정된 자리수의 결과값을 출력합니다
256비트를 문자열로 표현하면 64자리가 되는데
많은 블록체인에서 이 알고리즘을 채택하고 있습니다
그렇습니다
블록체인 하면 생각나는 '암호화폐'의 대표주자인
비트코인도 SHA-256 알고리즘을 사용하고있습니다
Awesome!
-
2번타자 데이터(페이로드)입니다
[sub]키는 Subject를 의미하며 암호화된 사용자 데이터로 추측됩니다
[iss]키는 Issuer를 의미하며 토큰 발급자를 의미합니다
값에는 제가 발급한 발급처인 카카오톡이 들어있네요
[exp]는 Expiration Time를 의미하며 토큰 만료시간 값입니다
카카오톡에서 발급 받으면 발급한 시점부터 15초동안 유효합니다
[version]키는 정확하지 않은데 토큰 발급처나 체크인 시스템의 버전넘버로 추측됩니다
-
3번타자는 시그니쳐가 와야하는데 따로 스크린샷은 없습니다
jwt.io에도 시그니쳐는 따로 공개되어있지 않습니다
이 부분은 비밀키(secret key)와 헤더, 페이로드를
Base64url로 인코딩하여 합쳐놓은 부분입니다
아쉽게도 비밀키를 알 수 없기때문에
복호화 해볼수는 없었습니다
-
체크인용 QR코드를 파해치다보니
꼬리에 꼬리를 물고 암호화 알고리즘까지 들여다 보게 되었습니다
인증 정보가 암호화되어 있기 때문에
코로나와 무관하게 체크인 QR코드를
다양한 분야에 적용도 가능하겠다는 가능성도 엿보입니다
여기까지 머리를 쥐어뜯어가며 봐주신 여러분께
감사의 말씀 드리며 포스팅 마치겠습니다
감사합니다
0 댓글