JWT 만료와 시간 클레임 — exp·nbf·iat
JWT 만료와 시간 클레임 — exp·nbf·iat
JWT를 검증할 때 가장 흔히 하는 일이 '이 토큰 만료됐나?'를 확인하는 거예요. 그 기준이 되는 값이 바로 페이로드의 시간 관련 클레임이에요. exp(만료), nbf(적용 시작), iat(발급 시각) 셋은 모두 RFC 7519 §4.1에 등록된 클레임으로, NumericDate라는 형태로 시간을 담아요. 각각이 정확히 무엇을 뜻하고 어떻게 다뤄야 하는지 보면 검증 로직이 명확해져요.
본문
RFC 7519의 시간 클레임은 모두 값으로 NumericDate를 요구해요. NumericDate는 1970-01-01T00:00:00Z UTC부터 지정 시각까지의 초(秒) 수를 나타내는 JSON 숫자예요(윤초는 무시). 즉 자바스크립트의 Date.now()를 1000으로 나눈 값이라고 생각하면 돼요.
exp — 만료 시각
exp(expiration time)는 그 시각 이후로 JWT를 처리에 받아들이면 안 된다는 기준을 식별해요. 검증 시에는 현재 시각이 exp에 적힌 만료 시각보다 이전인지 확인해요. 만료된 토큰은 거부돼야 해요.
nbf — 적용 시작 시각
nbf(not before)는 그 시각 이전에는 JWT를 처리에 받아들이면 안 된다를 정의해요. 현재 시각이 nbf에 적힌 시각 이후 또는 같아야 처리가 가능해요. 발급자가 토큰을 '미리' 나눠주고 특정 시각부터 유효하게 하고 싶을 때 써요.
iat — 발급 시각
iat(issued at)은 JWT가 발급된 시각을 식별해요. 이를 통해 토큰의 나이(age)를 알 수 있어요. 예를 들어 '너무 오래된 토큰은 갱신을 요구'하는 정책에 쓰일 수 있어요.
클록 스큐(clock skew) 여유
exp와 nbf 검증에서 구현체는 약간의 여유(보통 몇 분 이내) 를 허용할 수 있어요. 이는 발급 서버와 검증 서버의 시계가 조금 어긋나 있는 상황을 감안하기 위한 거예요. 보통 '몇 분'을 넘지 않게 둬요.
사용은 선택(OPTIONAL)
이 클레임들은 필수가 아니에요. 서명 검증만으로 충분한 시나리오도 있지만, 토큰 탈취 위험을 낮추기 위해 exp는 실무에서 거의 필수적으로 넣는 편이에요. 만료 검증을 하지 않으면 탈취된 토큰을 무기한으로 쓸 수 있게 되니까요. 어떤 클레임을 쓰고 언제 필수/선택으로 둘지는 각 애플리케이션이 정해요.
시간 검증 예시(의사코드)
if now >= exp: reject # 만료됨
if now < nbf: reject # 아직 유효 시작 전
if now - iat > max_age: reject # 발급 후 지나치게 오래됨