JWT 새로 고침 토큰 흐름


129

모바일 앱을 만들고 있으며 인증에 JWT를 사용하고 있습니다.

이를 수행하는 가장 좋은 방법은 JWT 액세스 토큰을 새로 고침 토큰과 쌍으로 연결하여 원하는만큼 자주 액세스 토큰을 만료시킬 수있는 것 같습니다.

  1. 새로 고침 토큰은 어떻게 생겼습니까? 임의의 문자열입니까? 그 문자열이 암호화되어 있습니까? 다른 JWT입니까?
  2. 새로 고침 토큰은 액세스를 위해 사용자 모델의 데이터베이스에 저장됩니다. 맞습니까? 이 경우 암호화해야 할 것 같습니다
  3. 사용자 로그인 후 새로 고침 토큰을 다시 보낸 다음 클라이언트가 별도의 경로에 액세스하여 액세스 토큰을 검색하도록해야합니까?

3
새로 고침 토큰을 사용하는 경우 사용자가 UI에서 토큰을 무효화 할 수있는 기능을 제공해야합니다. 예를 들어 한 달 동안 사용하지 않으면 자동으로 만료되는 것이 좋습니다.
Vilmantas Baranauskas

1
@jtmarmon : 클라이언트 측에 새로 고침 토큰을 어떻게 저장합니까? 안전한 Android 기기를 의미합니까?
j10 2017-06-17

답변:


39

JWT 및 새로 고침 토큰에 관한 것이기 때문에 이것이 OAuth 2.0에 관한 것이라고 가정합니다 ... :

  1. 액세스 토큰과 마찬가지로 원칙적으로 새로 고침 토큰은 설명하는 모든 옵션을 포함하여 무엇이든 될 수 있습니다. JWT는 Authorization Server가 상태 비 저장을 원하거나이를 제공하는 클라이언트에 일종의 "소유 증명"의미 체계를 적용하고자 할 때 사용할 수 있습니다. 새로 고침 토큰은 리소스 서버에 제공되지 않고 처음에 발급 한 권한 부여 서버에만 제공된다는 점에서 액세스 토큰과 다릅니다. 따라서 JWT-as-access-tokens에 대한 자체 포함 된 유효성 검사 최적화가 수행합니다. 갱신 토큰을 위해 보류하지 않음

  2. 이는 데이터베이스의 보안 / 액세스에 따라 다릅니다. 다른 당사자 / 서버 / 애플리케이션 / 사용자가 데이터베이스에 액세스 할 수있는 경우 예 (하지만 마일리지는 암호화 키를 저장하는 위치와 방법에 따라 다를 수 있습니다 ...)

  3. 권한 부여 서버는 클라이언트가 토큰을 얻기 위해 사용하는 권한에 따라 액세스 토큰과 새로 고침 토큰을 동시에 발급 할 수 있습니다. 사양에는 표준화 된 각 보조금에 대한 세부 정보와 옵션이 포함되어 있습니다.


31
2. 데이터베이스에 새로 고침 토큰의 해시를 저장 한 다음 사용자의 새로 고침 토큰의 해시를 저장된 해시와 비교해야합니다. "데이터베이스에 일반 텍스트 암호를 저장하지 마십시오"라는 규칙은 다음과 같습니다. 사용자를 위해 만든 임의의 암호와 같은 토큰을 고려하십시오.
Rohmer

2
또한 더 많은 보안을 제공하려면 새로 고침 토큰 순환도 수행하십시오. 이것의 중요성은 ITEF RFC 6749 에 이미 언급되어 있습니다. 올바르게 구현되면 토큰 도난 시나리오를 식별하는데도 도움이 될 수 있습니다. 즉, 공격자가 토큰 새로 고침을 도난당했습니다. 더 나은 설명을 찾고 있다면이 링크로 이동하십시오
Bhumil Sarvaiya

82

다음은 JWT 액세스 토큰을 취소하는 단계입니다.

  1. 로그인시 클라이언트에 대한 응답으로 2 개의 토큰 (액세스 토큰, 새로 고침 토큰)을 보냅니다.
  2. 액세스 토큰은 만료 시간이 짧고 새로 고침의 만료 시간이 길어집니다.
  3. 클라이언트 (프런트 엔드)는 로컬 저장소에 새로 고침 토큰을 저장하고 쿠키에 액세스 토큰을 저장합니다.
  4. 클라이언트는 API 호출에 액세스 토큰을 사용합니다. 그러나 만료되면 로컬 저장소에서 새로 고침 토큰을 선택하고 인증 서버 API를 호출하여 새 토큰을 가져옵니다.
  5. 인증 서버에는 새로 고침 토큰을 수락하고 유효성을 확인하고 새 액세스 토큰을 반환하는 API가 노출됩니다.
  6. 새로 고침 토큰이 만료되면 사용자는 로그 아웃됩니다.

더 자세한 정보가 필요하면 알려주세요. 코드 (Java + Spring boot)도 공유 할 수 있습니다.

질문 :

Q1 : 만료 시간이 긴 클레임 수가 적은 또 다른 JWT입니다.

Q2 : 데이터베이스에 없습니다. 백엔드는 어디에도 저장되지 않습니다. 그들은 개인 / 공개 키로 토큰을 해독하고 만료 시간으로도 유효성을 검사합니다.

Q3 : 예, 맞습니다.


28
나는 JWT가에 저장해야한다고 생각 localStorage하고,이 refreshToken에 보관해야합니다 httpOnly. 는 refreshToekn이 특별한주의와 함께 처리 할 수있다, 그래서 새로운 JWT를 얻을 수 있습니다.
Tnc Andrei

2
httpOnly에 저장한다는 것은 무엇을 의미합니까? 둘 다 localStorage에 저장하지 않는 이유는 무엇입니까?
Jay

8
새로 고침 토큰 사용의 이점을 놓치고 있는데, 액세스 토큰의 유효성을 연장하는 데 동일하지 않습니까?
user2010955 apr

3
@Jay Microsoft Developer Network에 따르면 HttpOnly는 Set-Cookie HTTP 응답 헤더에 포함 된 추가 플래그입니다. 쿠키를 생성 할 때 HttpOnly 플래그를 사용하면 보호 된 쿠키에 액세스하는 클라이언트 측 스크립트의 위험을 완화하는 데 도움이됩니다 (브라우저에서 지원하는 경우).
shadow0359

23
# 2는 매우 부정확합니다. 서버 측에 저장 될 새로 고침 토큰 HAS. 새로 고침 토큰에 대해 JWT의 "자체 포함"속성을 활용해서는 안됩니다. 이렇게하면 개인 키를 변경하는 것 외에 새로 고침 토큰을 취소 할 수있는 방법이 없습니다.
Jai Sharma

26

새로 고침 토큰이있는 JWT의 Node.js를 사용한구현을 기반으로합니다 .

1)이 경우에는 uid를 사용하며 JWT가 아닙니다. 토큰을 새로 고칠 때 새로 고침 토큰과 사용자를 보냅니다. JWT로 구현하면 JWT 내부에 있기 때문에 사용자를 보낼 필요가 없습니다.

2) 그들은 이것을 별도의 문서 (테이블)로 구현합니다. 사용자가 다른 클라이언트 응용 프로그램에 로그인 할 수 있고 앱별로 새로 고침 토큰을 가질 수 있기 때문에 의미가 있습니다. 사용자가 하나의 앱이 설치된 기기를 분실 한 경우 로그인 한 다른 기기에 영향을주지 않고 해당 기기의 새로 고침 토큰이 무효화 될 수 있습니다.

3)이 구현에서는 액세스 토큰과 새로 고침 토큰을 모두 사용하여 로그인 방법에 응답합니다. 이음새가 나에게 맞습니다.


"1)이 경우에는 uid를 사용합니다 ..."라는 말은 UUID를 의미 했습니까?
ozanmuyes

이 간단한 구현은 iat
어떻습니까

@adonese 만 보내면 내부 JWT가 있다는 뜻 refresh_token입니까? 그렇다면 OAuth RFC 6749 refresh_token는 리소스 서버로 전송하지 말라고 명시 적으로 말합니다 (그리고 리소스 서버 JWT로 전송 됨) : tools.ietf.org/html/rfc6749#section-1.5
Brenno Costa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.