REST API 인증


181

서버에서 호스팅 될 응용 프로그램을 작성 중입니다. 모든 플랫폼 (Web App, Mobile App)과의 상호 작용을 촉진하기 위해 응용 프로그램 용 API를 만들고 싶습니다. 내가 이해하지 못하는 것은 REST API를 사용할 때 사용자를 어떻게 인증한다는 것입니다.

예를 들어, 사용자가 로그인 한 후 포럼 주제를 작성하려고 할 때. 사용자가 이미 로그인했는지 어떻게 알 수 있습니까?


4
여기서 "REST 인증"을 검색해야합니다. 다른 많은 질문에서 다루어졌습니다.
브라이언 켈리

10
간단히 말해서, 클라이언트는 HTTP Basic Auth (SSL을 통해!)를 사용하여 모든 요청과 함께 사용자 이름과 비밀번호를 보내거나 한 번 인증하여 클라이언트가 일정 기간 사용하지 않으면 만료되는 인증 된 세션을 갖도록합니다 (또는 사용자가 재정의하도록 선택 함) 웹 프레임 워크의 세션 처리). 그런 다음 세션은 쿠키에 저장되거나 모든 요청 (예 : Java land의 JSESSIONID)과 함께 전달되는 매개 변수 일 수 있습니다.
opyate


보안 관점에서 @opyate를 사용하면 공격자가 사용자 동의없이 요청을 보낼 수 있으므로 REST API의 경우 쿠키를 사용하여 세션을 처리하는 것은 실제로 좋은 생각이 아닙니다. HTTP 헤더 (예 : 인증)에 세션 해시 또는 토큰을 포함하는 것이 좋습니다.
s3v3n

1
@ s3v3n 내가 틀렸다면 나를 수정하십시오. 그러나 귀하의 제안과 제안은 헤더 + 로컬 스토리지 콤보를 사용하여 동일한 효과를내는 다른 방법입니다. 그것의 Authorization헤더 + 예를 들어, 브라우저 로컬 스토리지 VS의 Cookie헤더 + 표준 브라우저 쿠키의 저장.
opyate

답변:


72

HTTP 기본 또는 다이제스트 인증을 사용할 수 있습니다. SSL을 사용하여 사용자를 안전하게 인증 할 수는 있지만 API 속도가 약간 느려집니다.

  • 기본 인증-사용자 이름 및 비밀번호에 Base64 인코딩 사용
  • 다이제스트 인증-사용자 이름과 비밀번호를 해시하여 네트워크를 통해 보냅니다.

OAuth 가 최고입니다. oAuth가 제공하는 장점은 변경 가능하거나 만료 가능한 토큰입니다. 구현 방법에 대해서는 다음을 참조하십시오. 의견의 Working Link : https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf


4
이 질문 과 Les Hazelwood (Apache Shiro의 저자)가 제공 한 답변을 읽으십시오 .
justin.hughey 15시

1
유용한 링크 Twitter가 어떻게 REST API를 보호 하는가 : Twitter REST API 보안
WildDev 2016 년

이것이 받아 들여지는 대답이므로 다이제스트 인증을 사용할 수도 있다고 언급하는 것이 중요합니다. 기본 인증과 다이제스트 인증의 차이점에 대해서는 여기를 참조하십시오 : stackoverflow.com/questions/9534602/…
Rayee Roded

116

예를 들어, 사용자가 로그인 한 경우 이제 사용자가 포럼 주제를 작성한다고 말할 수 있습니다. 사용자가 이미 로그인했는지 어떻게 알 수 있습니까?

"포럼 만들기"API에 현재 요청이 인증 된 사용자의 요청임을 알리는 핸드 셰이크가 있어야합니다. REST API는 일반적으로 상태 비 저장이므로 상태는 어딘가에 유지되어야합니다 . REST API를 사용하는 클라이언트는 해당 상태를 유지해야합니다. 일반적으로 이는 사용자가 로그인 한 이후에 전달되는 일부 토큰 형태입니다. 토큰이 양호하면 요청이 양호합니다.

Amazon AWS의 인증 방법을 확인하십시오. 한 API에서 다른 API로 "벅을 전달"하는 완벽한 예입니다.

* 이전 답변에 실질적인 응답을 추가 할 생각이었습니다. Apache Shiro (또는 인증 / 인증 라이브러리)를 사용해보십시오. 결론은 사용자 정의 코딩을 시도하고 피하십시오. 좋아하는 라이브러리를 통합하면 (Apache Shiro, btw 사용) 다음을 수행 할 수 있습니다.

  1. 로그인 / 로그 아웃 API를 같이 만들기 : /api/v1/loginapi/v1/logout
  2. 이 로그인 및 로그 아웃 API에서 사용자 저장소로 인증을 수행하십시오.
  3. 결과는 JSESSIONID클라이언트 (웹, 모바일 등)로 다시 전송 되는 토큰 (일반적으로 )입니다.
  4. 이 시점부터 고객이 수행 한 모든 후속 통화에는이 토큰이 포함됩니다
  5. 다음에 호출되는 API를 호출한다고 가정 해 보겠습니다. /api/v1/findUser
  6. 이 API 코드가 수행 할 첫 번째 일은 토큰을 확인하는 것입니다 ( "이 사용자는 인증 되었습니까?").
  7. 응답이 NO로 돌아 오면 클라이언트에서 HTTP 401 상태를 다시 발생시킵니다. 그들이 처리하게하십시오.
  8. 답변이 예이면 요청 된 사용자를 반환하십시오.

그게 다야. 도움이 되었기를 바랍니다.


그래서 당신이 묘사하는 것은 본질적으로 세션 쿠키입니다.
LordOfThePigs

예, 그러나 세션은 2 개의 다른 장소에서 "유지"됩니다. 하나는 API 서버에 있고 다른 하나는 브라우저에 있습니다. 로그인 후 브라우저에 대한 JSON (또는 기타) 응답은 API 서버의 세션 ID를 브라우저로 다시 전달해야합니다. 이 세션은 해당 에이전트가 독립적으로 관리합니다.
Kingz

11
Kingz는 세션을 유지하기위한 메커니즘이 의도적으로 모호하다는 아이디어를 전하려했다고 생각합니다. 세션 쿠키는 해당 메커니즘의 구현 중 하나 일뿐입니다.
justin.hughey 15시 01 분

2
@Kingz, 해커가 session_id와의 링크를 스니핑하고 어떤 콘텐츠가 session_id를 수정하는지 요청하는 경우이 솔루션의 보안은 어떻습니까? 서버 연결에 SSL을 추가하여 해결할 수 있지만 클라이언트는 어떻습니까?
Ahmad Samilo

1
man-in-the-middle-attrack 케이스에서 세션 하이재킹을 방지하는 방법은 무엇입니까?
m0z4rt

38
  1. HTTP 기본 인증 을 사용 하여 클라이언트를 인증하지만 사용자 이름 / 암호 만 임시 세션 토큰으로 취급하십시오 .

    세션 토큰은 모든 HTTP 요청에 첨부 된 헤더 Authorization: Basic Ym9ic2Vzc2lvbjE6czNjcmV0

    일뿐입니다. 위의 문자열 Ym9ic2Vzc2lvbjE6czNjcmV0은 Base64로 인코딩 된 문자열 "bobsession1 : s3cret"(사용자 이름 / 암호)입니다.

  2. 위의 임시 세션 토큰을 얻으려면 http://mycompany.com/apiv1/loginmaster-username 및 master-password를 입력으로 사용하고 서버 측에서 임시 HTTP 기본 인증 사용자 이름 / 비밀번호를 생성하고 토큰을 반환 하는 API 함수 (예 :)를 제공하십시오 (예 : Ym9ic2Vzc2lvbjE6czNjcmV0). 이 사용자 이름 / 비밀번호는 일시적이어야하며 20 분 정도 지나면 만료됩니다.

  3. 보안 강화를 위해 REST 서비스가 HTTPS를 통해 제공되므로 정보가 일반 텍스트로 전송되지 않습니다

Java를 사용하는 경우 Spring Security 라이브러리는 위의 방법을 구현하기 위해 훌륭한 지원을 제공합니다


1
20 분 후에 만료되는 이유는 무엇입니까? 페이스 북과 같은 웹 사이트에서 사용자가 로그 아웃 할 때까지 로그인하는 경우 어떻게합니까?
Dejell

1
@dejel 나는 "세션"이 사실상 일시적이라는 가정하에 있었다. 사용자가 유휴 상태 인 경우 만료되는 것이 일반적입니다.
gerrytan

Base64는 무엇입니까? 임시 비밀번호 만 반환하면됩니다. 두 경우 모두 실제로 중요한 것은이 임시 비밀번호가 강력하다는 것입니다. security.stackexchange.com/a/19686/72945를
e18r

7

가장 좋은 방법은 OAuth2를 사용하는 것입니다. 구글 그것과 당신이 그것을 설정하는 데 도움이되는 유용한 게시물이 많이 있습니다.

웹 앱 또는 모바일에서 API 용 클라이언트 애플리케이션을보다 쉽게 ​​개발할 수 있습니다.

그것이 당신을 돕기를 바랍니다.


2
이 질문 과 Les Hazelwood (Apache Shiro의 저자)의 답변을 읽으십시오 .
justin.hughey 15

0

JWT 인증을 사용하고 있습니다. 내 응용 프로그램에서 잘 작동합니다.

사용자 자격 증명이 필요한 인증 방법이 있습니다. 이 방법은 자격 증명의 유효성을 검사하고 성공할 경우 액세스 토큰을 반환합니다.

이 토큰은 요청 헤더에서 내 웹 API의 다른 모든 메소드로 전송되어야합니다.

구현하기 쉽고 테스트하기가 쉽습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.