[security] JWT 새로 고침 토큰 흐름

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

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

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


답변

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

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

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

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


답변

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

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

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

질문 :

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

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

Q3 : 예, 맞습니다.


답변

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

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

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

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


답변