REST API 보안 저장 토큰 vs. JWT vs OAuth


104

모바일 응용 프로그램과 API의 양이 매일 증가하고 있기 때문에 여전히 REST API를 보호하기위한 최상의 보안 솔루션을 찾고 있습니다.

다른 인증 방법을 시도했지만 여전히 약간의 오해가 있으므로 더 경험이 많은 사람의 조언이 필요합니다.

내가이 모든 것을 이해하는 방법을 알려 드리겠습니다. 무언가를 잘못 이해하면 알려주십시오.

일반적으로 WEB뿐만 아니라 REST API가 상태 비 저장 상태 인 한, 각 요청 (쿠키, 토큰 등)마다 인증 데이터를 보내야합니다. 사용자를 인증하기 위해 널리 사용되는 세 가지 메커니즘을 알고 있습니다.

  1. HTTPS를 사용한 토큰. 나는이 접근법을 여러 번 사용하여 HTTPS로 충분합니다. 사용자가 올바른 비밀번호와 로그인을 제공하면 토큰이 응답하여 추가 요청에 사용됩니다. 토큰은 서버에 의해 생성되고 예를 들어 별도의 테이블 또는 사용자 정보가 저장된 것과 같은 테이블에 저장됩니다. 따라서 각 요청 서버에 대해 사용자에게 토큰이 있고 데이터베이스와 동일한 지 확인합니다. 모든 것이 매우 간단합니다.

  2. JWT 토큰. 이 토큰은 자체 설명이 가능하며 토큰 자체에 대한 모든 필요한 정보가 포함되어 있습니다.이 토큰은 비밀 키워드로 서버에서 생성 (서명)되기 때문에 만료 날짜 또는 기타 클레임 등을 변경할 수 없습니다. 이것도 분명합니다. 그러나 개인적으로 하나의 큰 문제는 토큰을 무효화하는 방법입니다.

  3. OAuth 2. 서버와 클라이언트간에 직접 통신이 설정 될 때이 방법을 사용해야하는 이유를 모르겠습니다. 내가 이해하는 한 OAuth 서버는 제한된 범위의 토큰을 발행하여 다른 응용 프로그램이 암호 및 로그인을 저장하지 않고 사용자 정보에 액세스 할 수 있도록하는 데 사용됩니다. 이것은 사용자가 일부 페이지에 가입하기를 원할 때 소셜 네트워크에 대한 훌륭한 솔루션입니다. 예를 들어 서버는 트위터 나 페이스 북에서 사용자 정보를 가져오고 사용자 데이터 등으로 등록 필드를 채울 수있는 권한을 요청할 수 있습니다.

온라인 상점을위한 모바일 클라이언트를 고려하십시오.

첫 번째 질문 첫 번째 유형 토큰보다 JWT를 선호해야합니까? 모바일 클라이언트에서 로그인 / 로그 아웃 사용자가 필요한 한 토큰을 저장하거나 JWT의 경우 로그 아웃시 토큰이 무효화되어야합니다. 토큰 중 하나를 무효화하는 데 다른 접근 방식이 사용됩니다. 유효하지 않은 토큰 목록 (블랙리스트)을 작성하는 것입니다. 흠. 테이블 / 파일은 토큰이 테이블에 저장되고 사용자와 연관되고 로그 아웃시 제거 된 경우보다 훨씬 더 큽니다.

JWT 토큰의 장점은 무엇입니까?

OAuth에 대한 두 번째 질문은 서버와 직접 통신하는 경우 사용해야합니까? 클라이언트와 서버 사이에 토큰을 발행하기위한 하나 이상의 계층의 목적은 있지만 oauth 서버가 아니라 기본 서버와 통신합니다. 알다시피 OAuth 서버는 타사 앱에 사용자 개인 정보에 액세스 할 수있는 권한 (토큰)을 부여 할 책임이 있습니다. 그러나 내 모바일 클라이언트 응용 프로그램은 타사가 아닙니다.


감사합니다. 최근에 궁금했습니다. 세션 관리 (Beaker)를 사용하여 한 시간 후에 세션 토큰을 삭제했습니다. Oauth가 적합하지 않은 것 같습니다.
JasTonAChair

답변:


86

첫 번째 경우를 고려하십시오. 각 클라이언트는 세션 기간 동안 지속되는 임의의 ID를 얻습니다. 원하는 경우 며칠이 걸릴 수 있습니다. 그런 다음 서버 측 어딘가에 해당 세션과 관련된 정보를 저장합니다. 파일이나 데이터베이스에있을 수 있습니다. 쿠키를 통해 ID를 전달했지만 URL 또는 HTTP 헤더를 사용할 수 있다고 가정합니다.

세션 ID / 쿠키

장점 :

  • 클라이언트와 서버를 쉽게 코딩 할 수 있습니다.
  • 누군가 로그 아웃하면 세션을 쉽게 파기 할 수 있습니다.

단점 :

  • 서버 측은 클라이언트가 로그 아웃하지 않은 만료 된 세션을 주기적으로 삭제해야합니다.
  • 모든 HTTP 요청에는 데이터 저장소를 검색해야합니다.
  • 더 많은 사용자가 활성 세션을 가질수록 스토리지 요구 사항이 증가합니다.
  • 프런트 엔드 HTTP 서버가 여러 개인 경우 저장된 세션 데이터에 모두 액세스 할 수 있어야합니다. 이것은 하나의 서버에 저장하는 것보다 약간 더 많은 작업이 될 수 있습니다. 더 큰 문제는 데이터 저장소가 단일 장애 지점이되어 병목 현상이 발생할 수 있다는 것입니다.

JSON 웹 토큰 (JWT)

두 번째 경우, 데이터는 서버 대신 전달되는 JWT에 저장됩니다.

장점 :

  • 서버 측 스토리지 문제가 사라졌습니다.
  • 클라이언트 측 코드는 쉽습니다.

단점 :

  • JWT 크기는 세션 ID보다 클 수 있습니다. 각 HTTP 요청에 포함되므로 네트워크 성능에 영향을 줄 수 있습니다.
  • JWT에 저장된 데이터는 클라이언트가 읽을 수 있습니다. 문제가 될 수 있습니다.
  • 서버 측은 JWT를 생성, 검증 및 읽는 코드가 필요합니다. 어렵지는 않지만 약간의 학습 곡선이 있으며 보안에 의존합니다.

    서명 키의 사본을 얻는 사람은 누구나 JWT를 작성할 수 있습니다. 언제 이런 일이 발생했는지 모를 수도 있습니다.

    일부 라이브러리에는 "없음"알고리즘으로 서명 된 JWT를 허용하는 버그가 있었으므로 누구나 서버가 신뢰할 수있는 JWT를 작성할 수 있습니다.

  • JWT가 만료되기 전에 취소하려면 취소 목록을 사용해야합니다. 그러면 피하려고했던 서버 측 스토리지 문제로 돌아갑니다.

OAuth

OAuth는 인증 (즉, ID)에 사용되지만 사용자가 구매하여 다운로드 할 수있는 콘텐츠 목록과 같은 다른 데이터를 공유하는 데 사용될 수 있습니다. 또한 타사에서 저장 한 데이터에 쓰기 액세스 권한을 부여하는 데 사용될 수 있습니다. OAuth를 사용하여 사용자를 인증 한 다음 세션 데이터에 서버 측 스토리지 또는 JWT를 사용할 수 있습니다.

장점 :

  • 사용자가 비밀번호를 등록하거나 재설정하는 코드가 없습니다.
  • 유효성 검사 링크가 포함 된 전자 메일을 보낸 다음 주소를 확인하는 코드가 없습니다.
  • 사용자는 다른 사용자 이름과 비밀번호를 배우거나 기록 할 필요가 없습니다.

단점 :

  • 사용자가 서비스를 사용하기 위해 타사에 의존합니다. 서비스가 중단되거나 중단되면 다른 것을 알아 내야합니다. 예 : 사용자 ID가 "foo@a.com"에서 "bar@b.com"으로 변경된 경우 사용자의 계정 데이터를 어떻게 마이그레이션합니까?
  • 일반적으로 각 제공자에 대한 코드를 작성해야합니다. 예 : Google, Facebook, Twitter
  • 귀하 또는 귀하의 사용자는 개인 정보 보호 문제가있을 수 있습니다. 공급자는 어느 사용자가 귀하의 서비스를 사용하는지 알고 있습니다.
  • 공급자를 신뢰하고 있습니다. 공급자는 한 사용자에게 유효한 토큰을 다른 사람에게 발급 할 수 있습니다. 이것은 합법적 인 목적 일 수도 있고 아닐 수도 있습니다.

여러 가지 잡다한

  • 여러 사용자가 세션 ID와 JWT를 모두 복사하여 사용할 수 있습니다. 클라이언트 IP 주소를 JWT에 저장하고 유효성을 검사 할 수 있지만 클라이언트가 Wi-Fi에서 셀룰러로 로밍하지 못하게합니다.

답변에 추가하기 위해 사용자가 일반적으로 소셜 네트워킹 웹 사이트 또는 Google과 연결되거나 연결되지 않은 회사 계정을 사용하여 가입하려는 경우 oAuth가 유용하지 않을 수 있습니다.
Aftab Naveed

5
왜 이것이 받아 들여지는 답인지 모르겠습니다. 그것은 실제적인 질문에 대한 답이 아니라 다른 방식으로 질문을 개혁하는 것이다
amd

1
"JWT에 저장된 데이터는 클라이언트가 읽을 수 있습니다. 문제 일 수 있습니다. 문제가있는 경우 JWE를 사용하지 않는 이유는 무엇입니까?
Silver

이 답변은 사과와 오렌지를 혼동합니다. 이것을 OAuth 2.0 ( "권한 부여"사양)과 비교해서는 안됩니다. OP가 알아야 할 사항은 "자원 소유자 암호 흐름"— 인증으로서의 인증입니다.
Onur Yıldırım

5

원래 토큰을 무효화해야하는 이유를 스스로에게 물어보십시오.

사용자가 로그인하면 토큰이 생성되고 앱이 종료됩니다.

사용자가 로그 아웃을 누르면 새 토큰이 생성되고 원래 토큰이 교체됩니다. 다시 한번, 모든 것이 잘됩니다.

두 토큰이 매달려있는 경우에 대해 걱정하는 것 같습니다. 사용자가 로그 아웃 한 후 어떻게 든 로그인 된 토큰을 사용하여 요청하면 어떻게됩니까? 이 시나리오는 얼마나 현실적입니까? 로그 아웃 중 문제일까요? 아니면 여러 토큰이 문제가 될 수있는 여러 가지 시나리오가 있습니까?

나 자신이 걱정할만한 가치가 있다고 생각하지 않습니다. 누군가 암호화 된 https 데이터를 가로 채 디코딩하는 경우 훨씬 더 큰 문제가 있습니다.

원래 토큰에 만료 시간을 설정하여 추가 보호 기능을 제공 할 수 있습니다. 따라서 도난 당하거나 무언가가 발생하면 단기간 동안 만 좋을 것입니다.

그렇지 않으면 서버에 상태 정보가 있어야한다고 생각합니다. 토큰을 차단하지 말고 현재 토큰의 서명을 허용하십시오.


2
일부 클라이언트가 악의적이라고 가정하면 세션이 복사되어 재사용되는 것을 쉽게 알 수 있으며 서버에서이 문제에 대응해야합니다.
Michael Shaw

1
나쁜 생각이 해커에 의해 나중에 사용하거나 짐승 강제 할 수 ...
CROSP

2
사용자가 JWT를 사용할 수없는 다른 모든 장치에서 로그 아웃하려고한다고 상상해보십시오.
amd

@amd 불가능합니까? nonce = (random)을 추가하고 사용자가 로그 아웃하면 nonce를 교체하면 어떻게됩니까? 간단하고 효과적인 것 같습니다.
Simon B.

3

소금 값을 사용자와 함께 저장하고 소금을 사용자 토큰의 일부로 사용하여 언급 한 JWT 문제를 처리 할 수 ​​있습니다. 그런 다음 토큰을 무효화해야 할 때 소금 만 바꾸십시오.

몇 년이 지났음을 알지만 실제로는 실제로 다르게 할 것입니다. 나는 액세스 토큰의 수명이 비교적 짧다는 것을 확신합니다. 또한 서버에서 상태가 유지되는 새로 고침 토큰을 사용하고 누군가의 세션을 끝내고 싶을 때 서버에서 새로 고침 토큰을 제거하여 취소합니다. 그런 다음 1 시간이 지나면 사용자가 로그 아웃되고 다시 로그인하여 액세스 권한을 다시 얻게됩니다.


4
그러나이 경우 다시 상태가 가득
차기

2
시간에 따라 무효화 할 수도 있습니다.
RibaldEddie

이 경우 만료 시간의 차이는 무엇입니까? 사용자가 모바일 클라이언트에서 로그 아웃하려는 시간을 기준으로 토큰을 무효화하려면 어떻게해야합니까? 이 경우 API가 Stateless가 될 수있는 방법이없는 것 같습니다. 가장 적합하고 안전한 솔루션은 무엇입니까?
CROSP

2
단일 장치에서 로그 아웃하기에 가장 적합한 방법은 salt 외에 clientId를 사용하는 것입니다. 통찰력에 대해서는 Oauth-jwt 베어러 토큰 사양을 참조하십시오.
RibaldEddie

답변 주셔서 감사하지만이 경우 OAuth를 사용해야하는 이유를 이해하지 못합니다.
CROSP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.