Authorization HTTP 헤더 사용자 지정


81

API에 요청을 보낼 때 클라이언트를 인증해야합니다. 클라이언트에는 API 토큰이 있으며 표준 Authorization헤더를 사용 하여 토큰을 서버로 보낼 생각이었습니다 .

일반적으로이 헤더가 사용됩니다 BasicDigest인증. 하지만이 헤더의 값을 사용자 정의하고 사용자 정의 인증 체계를 사용할 수 있는지 여부를 모르겠습니다. 예 :

Authorization: Token 1af538baa9045a84c0e889f672baf83ff24

이것을 추천 하시겠습니까? 아니면 토큰을 보내는 더 나은 방법이 있습니까?

답변:


51

Authorization:헤더 를 사용하는 사용자 지정 인증 스키마를 만들 수 있습니다 ( 예 : OAuth의 작동 방식).

일반적으로 서버 또는 프록시가 표준 헤더 의 을 이해하지 못하면 그대로두고 무시합니다. 종종 예기치 않은 결과를 생성 할 수있는 고유 한 헤더 를 생성합니다. 많은 프록시는 인식하지 못하는 이름으로 헤더를 제거합니다.

즉, Authorization:쿠키가 사용자 지정 값을 전달하도록 명시 적으로 설계 되었기 때문에 쿠키가 명시 적으로 사용자 지정 값을 전달하도록 설계 되었기 때문에 쿠키를 사용하여 토큰을 전송하는 것이 더 나은 생각 일 수 있지만 HTTP의 내장 인증 메서드에 대한 사양은 실제로 어느 쪽이든-그것이 말하는 것을 정확히 보고 싶다면 여기를보세요 .

이것에 대한 또 다른 점은 많은 HTTP 클라이언트 라이브러리가 Digest 및 Basic auth를 기본적으로 지원하지만 헤더 필드에 원시 값을 설정하려고 할 때 삶을 더 어렵게 만들 수 있지만 모두 쿠키를 쉽게 지원하고 그 안에 더 많거나 적은 가치를 허용하십시오.


10
이것이 OAuth가 작동하는 방식을 들으니 반갑습니다. 쿠키를 사용하면 클라이언트 구현이 더 간단 해 질지 모르겠습니다. 클라이언트가 브라우저가 아닌 경우 쿠키 작업 (경로, 만료 등) 규칙은 헤더 필드 설정을 기억하는 것보다 클라이언트에서 구현하기가 더 복잡합니다. 대부분의 클라이언트 라이브러리를 사용하면 올바른 헤더를 매우 간단하게 설정할 수 있습니다.
Thomas Watson

2
@ThomasWatson 쿠키 범위 포인트에 대해 동의하지 않을 수는 있지만 여기서는 실제로 중요하지 않습니다. HTTP 인증 ( Authorization:헤더 사용)의 범위는 도메인 당입니다. 즉, 쿠키 도메인을 "이 도메인"으로 설정하고 경로를 "/"로 설정하면 HTTP 인증과 동일한 범위를 갖게됩니다. 그러나 그것은 당신에게 달려 있습니다. 그러나 Julian Reschke가 지적했듯이, 당신 feel that you have something of generic use이 다른 애플리케이션에서 사용될 수있는 것 외에는 새로운 인증 체계를 정의해서는 안됩니다 .
DaveRandom 2011

8

CROSS ORIGIN 요청 의 경우 다음을 읽으십시오.

나는이 상황에 직면했고 처음에는 Authorization헤더 를 사용하기로 선택했고 나중에 다음 문제에 직면 한 후 제거했습니다.

Authorization헤더는 사용자 정의 헤더로 간주됩니다. 따라서 AutorizationHeader 세트를 사용하여 교차 도메인 요청이 이루어 지면 브라우저는 먼저 프리 플라이트 요청을 보냅니다 . 실행 전 요청은 OPTIONS 메서드에 의한 HTTP 요청이며,이 요청은 요청에서 모든 매개 변수를 제거합니다. 서버 Access-Control-Allow-Headers는 사용자 정의 헤더 ( Authorization헤더) 의 값을 갖는 헤더 로 응답해야합니다 .

따라서 클라이언트 (브라우저)가 보내는 각 요청에 대해 추가 HTTP 요청 (OPTIONS)이 브라우저에 의해 전송되었습니다. 이로 인해 API 성능이 저하되었습니다. 이것을 추가하면 성능이 저하되는지 확인해야합니다. 해결 방법으로 http 매개 변수로 토큰을 보내고 있는데, 이것이 최선의 방법은 아니지만 성능을 타협 할 수는 없습니다.


나는 또한 http params에 내 sessionID를 보내는 것을 고려하고 있습니다. 이것이 최선의 방법이 아니라는 이유는 무엇입니까? 헤더를 제거하는 방화벽과 원본 간 성능 저하에 대한 견고성의 장점이있는 것 같습니다. 단점은 무엇입니까?
thund

1
단점은 GET 요청의 경우에만 있습니다. Authorization token내 애플리케이션에 내 (민감한 데이터)를 사용하여 사용자를 인증해야했습니다 . 같은 이유로 GET에서 민감한 데이터를 보내지 않아야하며 params에 인증 토큰을 사용해서는 안됩니다. w3 w3.org/Protocols/rfc2616/rfc2616-sec15.html#sec15.1.3에 따라 "HTTP 프로토콜은 민감한 데이터의 제출을 ​​위해 GET 기반 양식을 사용해서는 안됩니다 ".
Abhishek Kumar

헤더가 마음에 들지 않으면 쿠키에 토큰을 저장할 수 있습니다. (토큰을 세션 ID와 혼동하지 마십시오). PUT 및 DELETE를 사용하면 어쨌든 OPTIONS가 전송됩니다. 대부분의 경우 서버 측 REST 클라이언트와 브라우저를 사용하는 것은 매우 좋은 REST 클라이언트로 간주되지 않습니다.
inf3rno

5

이것은 약간 구식이지만 같은 질문에 대한 답을 찾는 다른 사람들이있을 수 있습니다. API에 적합한 보호 공간이 무엇인지 생각해야합니다. 예를 들어 API에 대한 클라이언트 애플리케이션 액세스를 식별하고 인증하여 알려진 등록 된 클라이언트 애플리케이션으로의 사용을 제한 할 수 있습니다. 이 경우 다음을 사용할 수 있습니다.Basic클라이언트 식별자를 사용자 ID로 사용하고 클라이언트 공유 비밀을 암호로 사용하는 인증 체계. 독점 인증 체계가 필요하지 않으며 각 보호 공간에 대해 클라이언트가 사용할 것을 명확하게 식별하기 만하면됩니다. 각 보호 공간에 대해 하나만 선호하지만 HTTP 표준은 각 WWW-Authenticate 헤더 응답에 대한 다중 인증 체계와 각 응답에 여러 WWW-Authenticate 헤더를 모두 허용합니다. 이것은 어떤 옵션을 사용할지 API 클라이언트에게 혼동을 줄 것입니다. 일관성 있고 명확해야 API가 사용됩니다.


2

사용자 지정 체계 이름과 함께 HTTP 인증을 사용하지 않는 것이 좋습니다. 일반적으로 사용하는 것이 있다고 생각되면 새로운 체계를 정의 할 수 있습니다 . 자세한 내용은 http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p7-auth-latest.html#rfc.section.2.3 을 참조하십시오.


링크 할 문서는 HTTP / 1.1의 초안입니다. 최종 표준을 살펴 보려고했지만 사용자 지정 체계를 등록해야하는 것에 대해 아무것도 찾을 수 없습니다. 이것은 초안 작성 과정에서 기본 체계를 찾고 동의하기를 원했을 뿐이 아닐까요?
Thomas Watson

Thomas, 내가 참조한 문서는 RFC 2616/7의 개정판입니다 (체계에 대한 레지스트리가 없음). 진행 중이지만 거의 완료되고 있습니다.
Julian Reschke 2011

1

우편 배달부에서 친절하게 아래에서 시도하십시오 :-

헤더 섹션에서 예제는 나를 위해 작동합니다 ..

인증 : JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyIkX18iOnsic3RyaWN0TW9kZSI6dHJ1ZSwiZ2V0dGVycyI6e30sIndhc1BvcHVsYXRlZCI6ZmFsc2UsImFjdGl2ZVBhdGhzIjp7InBhdGhzIjp7InBhc3N3b3JkIjoiaW5pdCIsImVtYWlsIjoiaW5pdCIsIl9fdiI6ImluaXQiLCJfaWQiOiJpbml0In0sInN0YXRlcyI6eyJpZ25vcmUiOnt9LCJkZWZhdWx0Ijp7fSwiaW5pdCI6eyJfX3YiOnRydWUsInBhc3N3b3JkIjp0cnVlLCJlbWFpbCI6dHJ1ZSwiX2lkIjp0cnVlfSwibW9kaWZ5Ijp7fSwicmVxdWlyZSI6e319LCJzdGF0ZU5hbWVzIjpbInJlcXVpcmUiLCJtb2RpZnkiLCJpbml0IiwiZGVmYXVsdCIsImlnbm9yZSJdfSwiZW1pdHRlciI6eyJkb21haW4iOm51bGwsIl9ldmVudHMiOnt9LCJfZXZlbnRzQ291bnQiOjAsIl9tYXhMaXN0ZW5lcnMiOjB9fSwiaXNOZXciOmZhbHNlLCJfZG9jIjp7Il9fdiI6MCwicGFzc3dvcmQiOiIkMmEkMTAkdTAybWNnWHFjWVQvdE41MlkzZ2l3dVROd3ZMWW9ZTlFXejlUcThyaDIwR09IMlhHY3haZWUiLCJlbWFpbCI6Im1hZGFuLmRhbGUxQGdtYWlsLmNvbSIsIl9pZCI6IjU5MjEzYzYyYWM2ODZlMGMyNzI2MjgzMiJ9LCJfcHJlcyI6eyIkX19vcmlnaW5hbF9zYXZlIjpbbnVsbCxudWxsLG51bGxdLCIkX19vcmlnaW5hbF92YWxpZGF0ZSI6W251bGxdLCIkX19vcmlnaW5hbF9yZW1vdmUiOltudWxsXX0sIl9wb3N0cyI6eyIkX19vcmlnaW5hbF9zYXZlIjpbXSwiJF9fb3JpZ2luYWxfdmFsaWRhdGUiOltdLCIkX19vcmlnaW5hbF9yZW1vdmUiOltdfSwiaWF0IjoxNDk1MzUwNzA5LCJleHAiOjE0OTUzNjA3ODl9.BkyB0LjKB4FIsCtnM5FcpcBLvKed_j7rCCxZddwiYnU


1
JWT에서 정말로 암호 / 해시를 보내고 있습니까? 간단한 base64입니다.
Zakhar

1
@Zakhar : SPA의 일반적인 관행은 JWT 내에서 전체 사용자 세션을 캡슐화하여 (완전한 json 문서이기 때문에) 서버 측에서 세션 저장소의 필요성을 제거하는 것입니다.
cowbert

@cowbert : JWT에서 어떤 종류의 세션 토큰보다 더 많은 것을 캡슐화하는 것이 일반적인 것인지 잘 모르겠습니다 (예를 들어이 게시물 참조 ).
Alexander Abakumov

1
@AlexanderAbakumov 오해의 소지가 가득한 기사, 그는 몇 가지 포인트를 얻었지만 그의 많은 포인트는 말이 안되고 어떤 이유없이 그는 반대합니다. 나는 그가 쿠키를 좋아한다고 말할 수 있으며 나는 그가 몇 가지를 얻어야한다고 생각합니다. 베이커리와 그의 기사를 수정하고, 쿠키를 사용하고 일을 낭비하는 많은 상황을 얻었습니다 .localStorage와 함께하는 JWT는 많은 두통과 시간을 절약했습니다. 단지 2 시간 일하고 쾅하고 다시 방문하지 마십시오. 그가 모바일 앱을 개발하고 보안 규칙이 엄격하게 제한된 브라우저를 사용해 본 적이 있는지 궁금합니다.
알 - Mothafar

알 - Mothafar @ : 당신이 당신과 같은 문장을 확장하면 나는 감사하겠습니다 that article full of misleadings, a lot of his points does not make sense어떤 식 으로든 등 (의미, 그것은 아마 여기 코멘트를 넘어 뭔가). 답변이나 블로그 게시물을 작성할 수 있습니까? 논쟁을 비교하는 것은 정말 흥미로울 것입니다.
Alexander Abakumov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.