JWT를 언제 사용해야 하는가?
인가(Authorization): JWT의 가장 일반적인 사용 사례는 인가이다.
한 번 로그인이 성공하면, 이후의 모든 요청은 JWT를 포함하고 있어서 해당 사용자가 특정 API나 리소스에 접근할 수 있도록 해준다.
SSO(싱글 사인온): JWT를 많이 사용하는 이유 중 하나이다. JWT는 오버헤드가 작고, 도메인 간 사용이 쉬운 이점이 있다.
보안적 측면
보안적인 측면에서, JWT 안에 역할이나 권한 정보를 포함시킬지에 대해서는 신중히 다시 생각할 필요가 있다.한 번 토큰을 생성하고 서명하면, 그 토큰이 만료될 때까지 해당 권한이 부여된 상태로 유지된다. 그런데 실수로 admin 권한을 넣었을 경우, 그 사용자는 만료 시점까지 관리자 권한을 가지고 활동할 수 있게 된다. 어떤 사람들은 “토큰 수명이 짧으니 괜찮다”고 말하지만, 이건 강력한 논거가 아니다. 왜냐하면 짧은 시간 안에도 누군가는 큰 피해를 줄 수 있기 때문이다.
일부는 블랙리스트 DB를 운영해서 토큰 무효화 문제를 해결하려고 한다. 하지만 그렇게 되면 결국 JWT의 장점인 무상태(stateless) 아키텍처가 깨진다. 왜냐하면 매 요청마다 DB를 조회해서 블랙리스트에 있는지 확인해야 하니까, 이건 결국 세션 상태를 관리하는 방식이다.
그래서 더 나은 방식은, 사용자 권한 정보를 **인증 서버(DB나 Redis 등)**에 저장해두고, 요청이 들어올 때마다 서버에서 현재 역할(role)을 조회하는 것이다. 이렇게 하면 권한을 실시간으로 제어하거나 취소(revoke)할 수 있다. 참고로 JWT 표준에서 정의한 claims들은 대부분 **“누구인가?”**를 판별하는 인증(authentication)에 관한 것이고, “무엇을 할 수 있는가?” 라는 인가(authorization)에 대해서는 다루지 않는다.
결론
1. JWT에 역할을 포함하는 경우
- 편의성이 중요하고
- 권한을 가져오기 위해 DB 호출을 피하고 싶으며
- 사용자가 짧은 시간 동안 잘못된 권한을 가질 수 있는 가능성에 대해 개의치 않고
- 권한 정보를 추가함으로써 JWT 페이로드 크기가 조금 증가하는 것을 감수할 수 있을 때
2. JWT에 역할을 포함하고, 블랙리스트도 함께 사용하는 경우
- 사용자가 잘못된 권한을 가지는 시간 창을 없애고 싶고
- 이를 위해 매 요청마다 블랙리스트를 확인하는 비용을 감수할 수 있으며
- JWT 페이로드 크기가 약간 커지는 것을 감수할 수 있을 때
3. JWT에 역할을 포함하지 않고, 매 요청마다 권한을 조회하는 경우
- 잘못된 권한을 가진 상태를 방지하고 싶으며
- 블랙리스트 방식의 오버헤드를 피하고 싶고
- JWT 페이로드 크기를 최소화하고 싶으며
- 요청마다(또는 필요할 때마다) 권한을 조회하는 비용을 감수할 수 있을 때
'백엔드' 카테고리의 다른 글
sse와 JWT Expired 충돌 (2) | 2025.07.02 |
---|---|
JWT 전달 방식에 대한 고찰 (Header VS Cookie) (0) | 2025.06.28 |
테스트코드 작성 요령 (1) | 2025.06.17 |
SSE와 Security Filter (3) | 2025.06.03 |
Yjs를 이용한 동시 편집 구현 (2) | 2025.06.01 |