세션 기반 인증과 토큰 기반 인증에서는 JWT 기반 인증 방식의 stateless한 특성으로 인해 토큰이 탈취 당할 경우, 무효화 할 방법이 없다는 단점과 그 단점을 보완하기 위해서 고안된 2가지 방법에 대해 알아보았다.
하지만, 그 2가지 방법에도 단점이 존재하기 때문에 완벽한 해결법은 아니다.
첫째, 토큰의 유효 기간을 짧게 설정하는 방법은 다시 로그인 해야하는 주기가 짧아 사용자 경험을 저하시킨다.
둘째, Access Token과 Refresh Token을 함께 사용하는 방법은 Refresh 토큰을 데이터베이스에 저장해야 한다.
Access Token과 Refresh Token을 함께 사용하는 두번째 방법은 대중적으로 많이 채택되는 방법이지만, 여전히 아쉬운 점이 존재했다.
유효한 Refresh Token을 가지고 있는 사용자는 이미 로그인 한 사용자이니, 새로 로그인 할 필요없이 Access Token을 재발급
하는 것을 목적으로 하고 있다. 이는 즉, Refresh Token은 유효 기간이 끝나지 않은 경우에 한해, 로그인된 상태
를 나타낸다고 볼 수 있다.
이러한 Refresh Token을 데이터베이스에 저장하는 것은 더 이상 stateless 하다고 할 수 없을 것이다.
추가로, 두 방법 모두 탈취된 토큰이 만료되기 전까지 무효화할 수 없다는 공통적인 문제도 존재한다.
(Refresh Token을 사용하면 만료 시간을 짧게 가져갈 수 있자만, 여전히 만료 시간 전까지는 무효화할 수 없다.)
앞서 설명한 2가지 방법의 크리티컬한 문제점을 해결할 수 있는 방법을 찾기 위해, 아래 조건을 충족하는 방법을 고민했고,
IUWT 기반 토큰 인증 기술
논문을 찾았다.
이 논문에서는 위의 두가지 조건을 충족하는 대안을 제시하고 있는데, 기존 방법들의 한계를 보완하는 매력적인 대안이라고 판단되어 이번 포스팅에서 공유하고자 한다!
JWT 토큰 형식을 따르는 IUWT(Internet Protocol & Universally Unique Identifier Web Token)는 JWT 규약을 따른다.
토큰에 암호화 된 IP 주소와 UUID를 포함하고, 클라이언트가 제공한 IP 주소와 UUID와 토큰에 포함된 IP 주소와 UUID를 비교하여
토큰의 도용 여부를 신속하게 판단할 수 있도록 하는 기술로, 토큰의 만료 기간이 끝나지 않았더라도 무효화할 수 있다.
IUWT 기반 인증의 특징은 토큰의 탈취 여부를 판단하여, 토큰이 탈취된 후 토큰의 만료 기간까지 부정 사용될 수 없도록
토큰을 즉시 무효화 시키는데 있다.
서명의 변조 여부를 일차적으로 확인하는 것은 JWT와 동일하나, 추가로 IP와 UUID를 사용하여 토큰의 탈취 여부를 판단한다.
다음 프로세스는 클라이언트에서 인증이 필요하지 않은 요청을 보냈을 때, 서버에서 진행되는 프로세스이다.
Ex ) 서버에서 요구하는 사용자 정보 등록, 토큰 없이 로그인, 로그인하지 않은 사용자에게도 허용되는 요청
이처럼 로그인 여부와 관계없이 Unique한 UUID를 먼저 부여하면 사용자 인증이 필요 없는 요청에서 동일인 인식 기준으로 활용할 수 있다고 한다.
UUID를 생성한다.
생성된 UUID를 평문으로 쿠키에 저장한다.
(토큰 없이 로그인에 성공한 경우에만) 생성된 UUID를 AES encrypt를 사용해 암호화하여 토큰 내부에 저장한다.
IP 주소가 수시로 변경되는 모바일의 경우, 토큰에 포함된 UUID와 쿠키에 저장된 UUID를 비교함으로써
토큰 탈취 여부를 판단한다.
이렇게 IUWT 기반 토큰 인증 기술의 목적과 핵심 원리에 대해서 알아보았다.
마지막으로, 장점을 정리해보고 포스팅을 마무리 해보겠다!
1️⃣ 토큰의 탈취 여부를 쉽게 파악하고, 탈취된 토큰을 즉시 무효화 할 수 있다.
2️⃣ 토큰에 포함된 IP 주소와 UUID가 평문으로 노출되지 않도록 비밀 키로 암호화하기 때문에 Base64 디코딩으로는
정확한 정보를 알아낼 수 없다.
3️⃣ 토큰의 신뢰도가 높아져 만료 기간을 늘릴 수 있다. 이로 인해, 재로그인을 최소화하여 사용자 경험을 향상 시킬 수 있다.
4️⃣ Refresh Token을 생성할 필요가 없기 때문에 토큰 인증 방식의 매커니즘을 단순화 시킬 수 있다.
5️⃣ Refresh Token을 생성하여 데이터베이스에 저장할 필요가 없기 때문에 Stateless한 인증을 구현할 수 있다.