JWT 뜯어보기
JWT를 조각내 헤더와 내용을 읽어 줍니다. 로그인이 안 될 때 십중팔구 만료(exp)가 지났거나 발급처(iss)·대상(aud)이 어긋난 것이라, 눈으로 확인하는 것만으로 절반은 풀립니다.
넣은 것은 기기를 벗어나지 않습니다. 브라우저 안에서만 처리하고 어디에도 보내거나 저장하지 않습니다.
세 조각으로 된 글자
JWT 는 점으로 나뉜 세 조각입니다 — 헤더, 내용, 서명. 앞의 둘은 JSON 을 URL 안전 Base64 로 적은 것이고, 셋째는 앞의 둘을 열쇠로 서명한 값입니다. 여기서는 앞의 둘만 풀어 보여 주고 셋째는 읽지 않습니다. 헤더의 alg 가 어떤 서명인지, kid 가 어느 열쇠인지 말하고, 내용에는 sub·iss·aud·exp 같은 주장(claim)이 담깁니다.
인코딩이지 암호화가 아닙니다
Base64 는 열쇠 없이 되돌리는 표기법이라 토큰을 쥔 사람은 누구나 안을 읽습니다. 서명은 내용이 바뀌지 않았음을 보장할 뿐 감추지는 않습니다. 그래서 내용에 비밀번호나 개인정보를 담으면 안 됩니다. 정말 감춰야 하면 JWE 라는 다른 규격이 있는데, 그것은 조각이 다섯이고 둘째 조각이 JSON 이 아니라 여기서는 풀리지 않습니다.
시각은 초 단위입니다
exp·iat·nbf 는 1970년부터 흐른 초입니다 — 밀리초가 아닙니다. 발급 코드가 밀리초를 넣으면 만료가 수만 년 뒤로 찍혀 영원히 살아 있는 토큰이 됩니다. 이 화면은 그 셋을 이 기기의 시각으로 바꿔 보여 주고, exp 가 지났으면 표시합니다. 발급 서버와 검증 서버의 시계가 몇 초 어긋나 갓 발급한 토큰이 「아직 유효하지 않음」으로 거절되는 일도 있습니다.
만료가 아닌데 거절될 때
iss 가 검증하는 쪽이 기대하는 발급처와 다르거나, aud 에 그 서비스가 없으면 서명이 멀쩡해도 거절됩니다. aud 는 문자열 하나일 수도 배열일 수도 있습니다. 로그인은 되는데 다른 API 에서 401 이 난다면 대개 이것입니다 — 그 API 용 토큰이 아닌 것입니다.
읽히지 않을 때 먼저 볼 곳
붙여넣는 즉시 읽습니다. 조각을 풀지 못했다는 말이 나오면 토큰 자체보다 둘레를 보세요 — 헤더에서 복사하며 딸려 온 Bearer , 쿠키의 token=, 감싼 따옴표, 중간에 끼어든 줄바꿈이 흔한 원인입니다. 앞뒤 공백은 떼지만 그 밖의 것은 조각의 일부로 읽어 실패합니다. 점이 하나뿐인 두 조각짜리는 서명이 없는 것으로 보고 그대로 읽어 줍니다.
만료 표시는 이 기기의 시계입니다
지났는지는 서버가 아니라 이 컴퓨터의 시각과 견줍니다. 시계가 어긋난 기기에서는 살아 있는 토큰이 지난 것으로, 지난 토큰이 살아 있는 것으로 보일 수 있습니다. exp·iat·nbf 는 숫자일 때만 시각 줄에 섭니다 — 따옴표로 감싼 "1700000000" 은 내용에는 보이지만 시각으로 풀리지 않는데, 규격을 어긴 발급 코드의 흔적입니다.
자주 묻는 질문
서명도 검증하나요?
하지 않습니다. 검증하려면 비밀키나 공개키가 있어야 하는데, 그것을 웹페이지에 붙여넣게 하는 것은 위험한 습관을 가르치는 일입니다. 여기서는 안에 무엇이 들었는지 읽어 주기만 합니다 — 서명이 맞는지는 서버에서 확인하세요.
토큰을 붙여넣어도 되나요?
이 페이지는 서버로 아무것도 보내지 않으므로 브라우저 밖으로 나가지 않습니다. 다만 JWT는 그 자체가 열쇠이니, 살아 있는 운영 토큰은 어디에든 붙여넣지 않는 편이 좋습니다.
서명도 검사해 주나요?
아닙니다. 뜯어 읽기만 합니다. 서명을 검사하려면 발급한 쪽의 비밀키나 공개키가 있어야 하는데, 그것을 브라우저에 넣는 것은 위험합니다. 여기서 보는 것은 「무엇이 담겼나」이고, 「진짜인가」는 서버가 판단할 일입니다.
남의 토큰을 붙여넣어도 되나요?
이 화면에서는 토큰이 브라우저 밖으로 나가지 않습니다. 다만 JWT 의 내용은 암호화된 것이 아니라 그냥 인코딩된 것이라, 토큰을 가진 사람은 누구나 안을 읽을 수 있습니다. 화면을 공유하거나 캡처할 때 조심하세요.
지났다고 나오는데 서버는 받아 줍니다.
서버가 만료를 보지 않거나 몇 분의 여유를 두는 경우, 또는 이 기기의 시계가 빠른 경우입니다. 반대로 여기서는 살아 있는데 거절당하면 서버 시계가 빠르거나 nbf 가 아직 오지 않은 것입니다. 어느 쪽이든 판단은 서버가 하고, 이 화면은 이 기기의 시각으로 읽은 것을 보여 줄 뿐입니다.
붙여넣은 코드가 서버로 가나요?
가지 않습니다. 브라우저 안에서만 처리하고 어디에도 보내거나 저장하지 않습니다. 사내 설정 파일이나 운영 쿼리처럼 밖으로 내보내기 곤란한 것도 그래서 쓸 수 있습니다. 인터넷을 끊고도 동작합니다.