LabHub

Keycloak 과 기업 인증 · 토큰 수명과 세션 관리 · 이론

무효화라는 어려운 문제

LabHub 에서 이어서 보기

한 줄 요약

JWT 는 발급 후 서버가 관여하지 않기 때문에 빠르다. 그리고 같은 이유로 취소하기 어렵다. 이 거래를 이해하고 수명으로 관리하는 것이 실무다.

왜 이게 필요했나

"로그아웃했는데 토큰이 아직 유효해요"는 JWT 를 쓰는 팀이 반드시 만나는 문제입니다. 세션 기반 인증에서는 서버가 세션 저장소에서 지우면 끝이었습니다. JWT 는 서버에 상태가 없으므로 지울 것이 없습니다.

해결책으로 블랙리스트를 떠올리게 됩니다. 취소된 토큰 ID 를 저장소에 넣고 매 요청 확인하는 것입니다. 그런데 이렇게 하면 매 요청 저장소 조회가 생기고, 무상태의 이점이 사라집니다. 세션 방식으로 돌아간 것과 크게 다르지 않습니다.

어떻게 동작하나

실무의 표준 답은 수명으로 관리하는 것입니다.

액세스 토큰을 짧게 둡니다. 5~15분이 권고 범위입니다. 탈취되어도 그 시간 뒤에는 무용지물이고, 권한을 회수해도 그 시간 안에 반영됩니다.

리프레시 토큰은 길게 두되 회전시킵니다. 갱신할 때마다 새것을 주고 옛것을 무효화합니다. 리프레시 토큰은 인증 서버가 상태를 갖고 있으므로 즉시 취소할 수 있습니다.

이 조합의 효과가 중요합니다. 로그아웃하면 리프레시 토큰을 취소합니다. 액세스 토큰은 남아 있지만 최대 15분 뒤 만료되고, 그 뒤로는 갱신이 안 되므로 세션이 실질적으로 끝납니다. 블랙리스트 없이 15분 이내의 무효화를 얻습니다.

정말로 즉시 끊어야 하는 경우 — 계정 도용 신고, 관리자 강제 로그아웃 — 만 예외적으로 블랙리스트를 씁니다. 모든 토큰이 아니라 그 사용자의 토큰만 대상이므로 저장소 부담이 작습니다.

현장에서 만나는 모습

Keycloak 에는 여러 수명 설정이 있어 헷갈립니다. 액세스 토큰 수명, SSO 세션 유휴 시간, SSO 세션 최대 시간, 리프레시 토큰(오프라인 세션) 수명이 각각 다른 것을 제어합니다. 유휴 시간은 활동이 없으면 만료되는 시간이고, 최대 시간은 활동이 있어도 강제로 끊는 시간입니다. 은행처럼 규제가 있는 곳에서는 최대 시간을 짧게 둡니다.

동시 로그인 제한도 자주 요구됩니다. Keycloak 은 세션 수 제한 기능을 제공하지만, 애플리케이션 차원에서 처리하려면 사용자별 세션 목록을 별도로 관리해야 합니다.

BFF 패턴도 세션 관리 관점에서 유리합니다. 토큰을 백엔드가 갖고 브라우저에는 세션 쿠키만 주면, 로그아웃 시 그 세션을 지우는 것으로 즉시 무효화가 됩니다. XSS 로 토큰이 털리는 경로도 사라집니다.

다음 확인에서 볼 것

이 모듈은 퀴즈로 수명 설계의 판단 기준을 점검하고 코스를 마칩니다.