목록으로
Network

JWT - 토큰처리 방법(2)

Dev Park
7/26/2023
51 views

서론

저번글에서는 JWT의 토큰 처리 방식 중 크게 상태 저장방식과 상태 비저장방식으로 나눠서 알아봤다.
오늘은 실제 JWT를 어떻게 처리하면 좋을지에 대해서 같이 고민해보자.

어떤 처리방식이 좋을까?

상태 저장방식은 말 그대로 토큰의 상태를 저장하는 방식이다.
해당 방식은 데이터베이스에 토큰을 저장하여 인증시마다 토큰이 유효한지 데이터베이스를 조회해 알아낸다.
이는 보안상 유리하지만 성능적으로 불리하고, JWT의 장점이 퇴색된다.

그리고 상태 비저장방식은 데이터베이스에 토큰을 저장하지 않고 토큰 내부에 정보를 넣어 인증하는 방식이다.
이는 성능적으로 유리하지만 토큰이 갈취당할경우 서버에서 할 수 있는 조취가 한정되어있기때문에 보안 상 허점이 많다.

위 두 방식의 장점만을 더해서 처리할 수는 없을까?
그걸 같이 고민해보자.

JWT에는 크게 두가지 토큰이 있다.

JWT의 구성요소에는 두가지 토큰이 들어있다.
인증에 사용하는 AcessToken과 이 AcessToken을 재발급하는데 사용되는 RefreshToken으로 나누어진다.

AcessToken은 인증에 사용되는 토큰으로 일반적으로 수명이 짧고(15분에서 한시간) 자주 사용된다.
RefreshToken은 AcessToken을 재발급하는데 사용되며 수명이 길고(하루에서 일주일) 자주 사용되지 않는다.

두 방식을 혼용해서 처리해보자.

그렇다면 자주 사용하는 AcessToken을 상태 비저장방식으로 사용하고 수명이 긴 RefreshToken을 관리하기 쉽게 상태 저장방식으로 사용하면 되는 것이 아닐까?

실제로 많은 JWT 구현을 보면 해당 방식을 많이 사용한다.
AcessToken은 갈취당하더라도 수명이 짧기때문에 비교적으로 괜찮지만 RefreshToken은 수명이 길기때문에 갈취당하면 큰 문제가 생길 수 있다.

그렇기 때문에 AcessToken은 수명을 짧게 설정하여 비저장방식으로 인증을 받고, RefreshToken은 수명을 길게하고 데이터베이스에 저장해서 재발급시마다 토큰이 유효한지 데이터베이스를 통해 확인하면 보안상 더 안전해 질 것 이다.

매 토큰 인증시마다 데이터베이스에 접근하지 않아도되니 상태 저장방식에 비해 성능적으로 유리하고, 토큰을 갈취당하더라도 대응할 방법이 생기니 상태 비저장방식에 비해 보안상 유리하다.

이 방법이 완벽할까?

모든 보안적은 방법에는 완벽이라는 말은 없다.
분명 어딘가 허점이 존재하고 위의 방식이 토큰을 갈취당했을때를 대비하는 것인 만큼 토큰을 갈취당하지 않게 하는 것이 중요하다.
XSS공격이나 CSRF공격에 대비하고 토큰을 안전하게 보관하는 것이 1순위이다.