API 키를 배치 할 위치 : 사용자 지정 구성표가있는 권한 부여 헤더와 사용자 지정 HTTP 헤더


17

API 키를 통한 인증 / 인증을 사용하여 REST API를 설계하고 있습니다.

나는 그것이 가장 적합한 장소를 알아 내려고 시도했으며 많은 사람들이 다음과 같은 사용자 정의 HTTP 헤더를 사용하도록 제안한다는 것을 알았습니다 ProjectName-Api-Key.

ProjectName-Api-Key: abcde

그러나 다음 Authorization과 같이 사용자 정의 체계와 함께 헤더 를 사용하는 것이 가능하고 이념적으로 정확합니다 .

Authorization: ApiKey abcde

반면에, 일부 클라이언트에서는 사용자 지정 권한 부여 체계가 예기치 않게 지원되지 않을 수 있으며 사용자 지정 코드로 연결될 수 있으므로 클라이언트에 대한 기대치가 없기 때문에 사용자 지정 헤더를 사용하는 것이 좋습니다.

어떤 방법으로 API 키를 보내시겠습니까?


내 지침에 따른 프로젝트는 Authorization: Bearer <token>헤더를 사용 하며 그에 대한 단일 문제는 없었습니다. 토큰은 JWT 입니다.
Andy

1
@DavidPacker 내가 이해하는 바와 같이, Bearerscheme은 독점적으로 oAuth2와 함께 사용됩니다. oAuth와 별도로 적용하면 오용으로 간주됩니다. oAuth가없는 경우이 체계를 사용하는 것이 왜 올바른가요? 그런데 API에 대한 인증 유형을 선택하는 데 문제가있었습니다. API는 하나의 신뢰할 수있는 서비스에서만 사용할 수 있으므로 oAuth2의 클라이언트 자격 증명 흐름을 조사했지만 필자의 경우 ApiKey와 비교하여 어떤 이점도 찾지 못했습니다.
RomanG

@DavidPacker 그런 다음 ApiKey 인증이 만료 시간없이 클라이언트에게 부여 된 ApiKey것으로 이름이 바뀌고 해석 되면 유효한 oAuth 구현으로 간주 될 수 있음을 이해 Access Token했습니다. 그것은 일종의 철학적 측면입니다. 제 사례가 간단한 용어로 설명 될 수 있다면 복잡한 정의를 가져 오지 않기로 결정하고 "ApiKey"라고 부르기로 결정했습니다. 귀하의 프로토콜이 oAuth 표준을 구현하는 경우을 사용하는 데 동의 할 수는 Bearer있지만 동의 하지 않습니다.이 체계를 적용 할 수 없습니다.
RomanG

2
당신은 자신을 너무 제한하고 있습니다. API 소비자는 OAuth를 구현했는지 여부를 덜 신경 쓰지 못했습니다. 그들이 걱정하는 것은 토큰 안전성, 토큰 발급 작업 및 올바르게 인증받을 수 있다는 것입니다. JWT 문서 에서 Bearer를 사용하는 것이 좋습니다 . JWT는 Bearer 스키마에 완벽하게 적합하며 JWT를 더 권장하지 않습니다. 토큰 해지 기능이 필요하지 않은 한 데이터베이스를 누르지 않아도 사용자를 인증 할 수 있기 때문에 REST 애플리케이션에 적합합니다.
Andy

1
(구동) ... API 키는 일반적으로 구성된 신뢰 당사자와 인증 자간에 공유 되는 비밀 이며 신원이나 권한 부여를 전달하지 않도록주의하십시오. 다른 방법으로 말하면, 인증 결과를 나타내지 않고 보안 핸드 셰이크 만 시작하기위한 것입니다. api 키는 시스템의 신뢰할 수있는 인증 자로부터 자신을 식별 할 수있는 권한을 알려줍니다. 보안 리소스에 대한 액세스를 제어하는 토큰으로 키를 사용하는 것은 나쁜 주주 인
K. 앨런 베이츠

답변:


12

인증을 사용하는 경우 일관성을 유지하십시오.

어떤 사람들은 다음이 불필요하다고 주장 할 것입니다 ( 그리고 너무 오래 전에 나는 그들과 동의했을 것입니다 ). 그러나 요즘에는 Authorization헤더를 사용하면 API 유형 이 자체 설명 적이 지 않기 때문에 토큰 유형 을 알려야합니다 1 .

왜 필요하다고 생각하고 왜 중요하다고 생각합니까? 요즘에는 다른 인증 / 권한 부여 프로토콜을 지원해야합니다. Authorization이러한 모든 프로토콜에 헤더 를 사용하려면 인증 서비스의 일관성을 유지해야합니다. 어떤 종류의 토큰을 전송하고 어떤 인증 프로토콜을 적용해야하는지 알려주는 방법도 헤더에 포함되어야합니다.

Authorization: Basic xxxx
Authorization: Digest xxxx
Authorization: Bearer xxxx
Authorization: ApiKey-v1 xxxx
Authorization: ApiKey-v2 xxxx

나는 이것에 신경 쓰지 않았지만 업데이트가 보장되지 않은 앱 클라이언트 앱 (주로 모바일 및 센서)으로 작업 한 후에 시작했습니다. 클라이언트를 엉망으로 만들거나 서버쪽에 너무 많은 고통을주지 않으면 서 보안을 확장 할 수 있도록 보안을 구현하는 방식에 더주의를 기울였습니다.

우려 사항

내 계획을 구현할 때 직면 한 문제는 언급 한 것과 비슷합니다.

반면에, 일부 고객은 사용자 정의 승인 체계가 예기치 않게 지원되지 않을 수 있으며 어쨌든 사용자 정의 코드로 이어진다는 고려 사항을 발견했습니다.

말의 클라이언트는 , 라이브러리, 프레임 워크, 말 리버스 프록시를 .

장점

중요한 장점 중 하나는 캐시입니다. 공유 캐시는 달리 언급하지 않는 한 헤더를 캐시하지 않습니다 (물론 좋습니다).

인증 또는 사용자 정의 헤더?

내 경험에 따르면, 내 자신의 Authorization체계를 구현하면 사용자 지정 헤더를 사용했을 때 캐시를 제어 할 수있는 더 많은 디자인의 자유와 약간의 차이가있는 사용자 지정 권한 부여 헤더를 구현하는 것과 거의 동일한 작업 (또는 그 이상)이 필요했습니다. 그 이유는 내가 어쩌면 내가 또는로 Cache-control설정 한 시간이 다소 어리석기 때문에 네트워크의 토폴로지에 관계없이 서버에 대한 호출을보다 결정적 (트랙킹 및 테스트와 관련하여 중요) 할 수 있습니다.no-cacheno-store


1 : API 키와 관련 하여이 답변 이 매우 명확하다는 것을 알았습니다.


4
의 사용은 X-2012 년 현재 사용되지 않습니다 : stackoverflow.com/a/3561399/923720
Darkhogg

1
작전! 몰랐어요 수정 및 수정
Laiv

이 질문 전에 대부분의 사람들이 API 키를 URL에 넣었지만 HTTPS를 사용하여 숨겼다 고 생각했습니다. 대안을 만나서 반가워요. 예를 들어 Contentful은 권한 부여 또는 쿼리 매개 변수를 허용합니다. contentful.com/developers/docs/references/content-delivery-api/…
user949300

1
@ user949300 ... 암호화 된 공유 비밀 (예 : SSL을 통한 URI의 API 키)을 사용하는 것이 아무 것도없는 것보다 훨씬 안전하지만, 가로 채기 쉽고 쉽게 스푸핑 할 수 있으며 ID에 대해 세분성을 제공하지 않습니다. 기계 간 통신 이외의 다른 용도로는 api_keys를 사용한 적이 없으며 신뢰 당사자와 공유 암호로 작동하도록 권한이 부여 된 허용 된 컴퓨터 ID 간의 공유 암호를 일치시킵니다. 기계 대 기계 연결이 이루어진 후, 작업자는 다른 수단을 사용하여 인증합니다.
K. Alan Bates

@케이. Alan Bates API 상호 작용의 대부분은 지오 코딩의 무료 계층, 날씨 보고서 등과 같은 비교적 "중요하지 않은"것들을위한 것이 었습니다. API 키는 심각한 사용자 비밀보다 속도 제한에 더 중요합니다. 따라서 OP와 관련하여 필요한 보안 수준에 따라 다릅니다.
user949300
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.