developer tip

JWT 토큰을 취소하려면 어떻게해야합니까?

copycodes 2020. 12. 8. 08:25
반응형

JWT 토큰을 취소하려면 어떻게해야합니까?


Spring Security OAuth2 및 JWT 토큰을 사용하고 있습니다. 내 질문은 : JWT 토큰을 어떻게 취소 할 수 있습니까?

여기 http://projects.spring.io/spring-security-oauth/docs/oauth2.html 에서 언급했듯이 취소는 새로 고침 토큰으로 수행됩니다. 그러나 작동하지 않는 것 같습니다.


일반적으로 가장 쉬운 대답은 JWT 토큰을 취소 할 수 없다고 말하는 것입니다 . 하지만 이는 사실이 아닙니다 . 정직한 대답은 JWT 해지를 지원하는 비용이 대부분의 경우 가치가 없거나 JWT의 대안을 분명히 재고 할만큼 충분히 크다는 것입니다.

그러나 일부 시나리오에서는 JWT와 즉각적인 토큰 취소가 모두 필요할 수 있으므로 필요한 사항을 살펴 보겠습니다.하지만 먼저 몇 가지 개념을 다룰 것입니다.

JWT ( Learn JSON Web Tokens )는 토큰 형식을 지정하기 만하면됩니다.이 해지 문제는 일반적으로 자체 포함 또는 값별 토큰으로 알려진 형식에 사용되는 모든 형식에도 적용됩니다. 후자의 용어가 마음에 듭니다. 참조 토큰과 잘 대조되기 때문입니다.

가치 별 토큰 -토큰 수명을 포함한 관련 정보가 토큰 자체에 포함되어 있으며 정보가 신뢰할 수있는 출처에서 생성 된 것으로 확인할 수 있습니다 (구출을위한 디지털 서명).

참조 토큰 -관련 정보가 서버 측 저장소에 보관되고 토큰 값을 키로 사용하여 획득됩니다. 서버 측 저장소이기 때문에 관련 정보는 암시 적으로 신뢰됩니다.

JWT Big Bang 이전에 우리는 이미 인증 시스템에서 토큰을 다루었습니다. 응용 프로그램이 사용자 로그인시 세션 식별자를 만드는 것이 일반적이었습니다. 그러면 사용자가 매번 로그인 프로세스를 반복 할 필요가 없었습니다. 이 세션 식별자는 서버 측 저장소의 키 인덱스로 사용되었으며 최근에 읽은 내용과 비슷하게 들리면 실제로 참조 토큰으로 분류됩니다.

동일한 비유를 사용하여 참조 별 토큰에 대한 폐기를 이해하는 것은 간단합니다. 해당 키에 매핑 된 서버 측 스토리지를 삭제하기 만하면 다음 번에 키가 제공 될 때 유효하지 않습니다.

가치 별 토큰의 경우 그 반대를 구현하면됩니다. 토큰 취소를 요청할 때 토큰을 고유하게 식별 할 수있는 것을 저장하여 다음에 토큰을받을 때 취소되었는지 추가로 확인할 수 있습니다. 이와 같은 것이 확장되지 않을 것이라고 이미 생각하고 있다면 토큰이 만료 될 때까지만 데이터를 저장하면되며 대부분의 경우 토큰의 해시 만 저장할 수 있으므로 항상 그렇게 할 수 있습니다. 알려진 크기의 것이어야합니다.

마지막으로 OAuth 2.0에 중점을두기 위해 가치 별 액세스 토큰의 취소는 현재 표준화되지 않았습니다. 그럼에도 불구하고 OAuth 2.0 토큰 취소는 특히 권한 부여 서버와 리소스 서버가이를 처리하는 사용자 지정 방법에 동의하는 한 여전히 달성 할 수 있다고 명시합니다.

전자의 경우 ( 자체 포함 된 토큰 ), 즉각적인 액세스 토큰 취소가 필요할 때 권한 부여 서버와 리소스 서버 간의 일부 (현재 비 표준화 된) 백엔드 상호 작용을 사용할 수 있습니다.

권한 부여 서버와 리소스 서버를 모두 제어하는 ​​경우이 작업은 매우 쉽습니다. 반면에 인증 서버 역할을 Auth0과 같은 클라우드 공급자 또는 Spring OAuth 2.0과 같은 타사 구성 요소에 위임하는 경우 이미 표준화 된 것만 얻을 수 있으므로 다른 방식으로 접근해야 할 가능성이 큽니다.

흥미로운 참조

이 문서에서는 그렇게 할 수있는 다른 방법을 설명 : 블랙리스트 JWT는 그것은 몇 가지 흥미로운 pratices를 포함하고 패턴은 다음 RFC7523


JWT는 취소 할 수 없습니다.

그러나 여기 에 새로운 교환 스키마를위한 JWT old 라는 대체 솔루션이 있습니다.

만료 시간 이전에 발급 된 토큰을 무효화 할 수 없기 때문에 항상 30 분과 같은 단시간 토큰을 사용합니다. 토큰이 만료되면 이전 토큰을 사용하여 새 토큰을 교환합니다. 중요한 점은 하나의 오래된 토큰이 하나의 새 토큰 교환 할 수 있다는 입니다.

중앙 인증 서버에서는 다음과 같은 테이블을 유지합니다.

table auth_tokens(
    user_id,
    jwt_hash,
    expire
)

JWT 문자열에 포함 된 user_id. jwt_hash는 SHA256과 같은 전체 JWT 문자열의 해시 값입니다. 만료 필드는 선택 사항입니다.

다음은 작업 흐름입니다.

  1. 사용자는 사용자 이름과 비밀번호로 로그인 API를 요청하고, 인증 서버는 하나의 토큰을 발급하고 토큰을 등록합니다 (테이블에 하나의 행을 추가합니다.).
  2. 토큰이 만료되면 사용자는 이전 토큰으로 교환 API를 요청합니다. 먼저 인증 서버는 만료 확인을 제외하고 기존 토큰을 정상적으로 확인한 다음 토큰 해시 값을 만든 다음 사용자 ID로 테이블 위를 조회합니다.
    • 발견 된 레코드와 user_id 및 jwt_hash가 일치하면 새 토큰을 발행하고 테이블을 업데이트하십시오.
    • 레코드를 찾았지만 user_id와 jwt_hash가 일치하지 않으면 누군가 이전에 새 토큰을 교환 한 토큰을 사용했음을 의미합니다. 토큰 해킹, user_id 별 레코드 삭제 및 경보 정보 응답
    • 기록을 찾을 수없는 경우 사용자는 다시 로그인하거나 비밀번호 만 입력해야합니다.
  3. 사용시 비밀번호 변경 또는 로그인 아웃시 사용자 아이디로 기록 삭제

토큰을 지속적으로 사용하려면 합법적 인 사용자와 해커 모두 새로운 토큰을 지속적으로 교환해야하지만, 하나만 성공할 수 있고, 하나가 실패하면 다음 교환 시간에 다시 로그인해야합니다.

따라서 해커가 토큰을 받으면 짧은 시간 동안 사용할 수 있지만 토큰 유효 기간이 짧기 때문에 합법적 인 사용자가 다음에 새 토큰을 교환하면 새 토큰으로 교환 할 수 없습니다. 이런 식으로 더 안전합니다.

해커가 없으면 일반 사용자도 주기적으로 (예 : 30 분마다) 새 토큰을 교환해야합니다. 이는 자동 로그인과 같습니다. 추가로드는 높지 않으며 애플리케이션의 만료 시간을 조정할 수 있습니다.

출처 : http://www.jianshu.com/p/b11accc40ba7


이것은 Spring 프레임 워크와 관련된 질문에 정확히 대답하지 않지만 여기에 JWT를 취소 할 수있는 기능이 필요한 경우 처음에 JWT를 사용하지 않고 대신 일반을 사용하는 이유에 대해 설명하는 기사가 있습니다. 불투명 한 무기명 토큰.

https://www.dinochiesa.net/?p=1388


One way to revoke a JWT is by leveraging a distributed event system that notifies services when refresh tokens have been revoked. The identity provider broadcasts an event when a refresh token is revoked and other backends/services listen for the event. When an event is received the backends/services update a local cache that maintains a set of users whose refresh tokens have been revoked.

This cache is then checked whenever a JWT is verified to determine if the JWT should be revoked or not. This is all based on the duration of JWTs and expiration instant of individual JWTs.

This article, Revoking JWTs, illustrates this concept and has a sample app on Github.


I found one way of resolving the issue, How to expire already generated existing JWT token using Java?

In this case, we need to use any DB or in-memory where,

Step 1: As soon as the token is generated for the first time for a user, store it in a db with the token and it's "issuedAt()" time.

I stored it in DB in this JSON format,

Ex: {"username" : "username", "token" : "token", "issuedAt" : "issuedAt" }

Step 2: Once you get a web service request for the same user with a token to validate, fetch "issuedAt()" timestamp from the token and compare it with stored(DB/in-memory) issued timestamp.

Step 3: If stored issued timestamp is new (using after()/before() method) then return that the token is invalid (in this case we are not actually expiring the token but we are stop giving access on that token).

This is how I resolved the issue.

참고URL : https://stackoverflow.com/questions/31919067/how-can-i-revoke-a-jwt-token

반응형