RESTful API에서 쿠키를 사용해야합니까?


77

특히 사용자가 웹 API에서 인증 / 인증 된 작업을 수행하는 방법에 관심이 있습니다.

인증 쿠키가 REST 철학과 호환되는 이유는 무엇입니까?




1
@JarrodRoberson 내 이해는 다른 사이트에 대한 답변이 여기에 해당 질문을 복제하는 것으로 간주되지 않는다는 것입니다.
Tom Squires

5
@JarrodRoberson은 각 사이트의 FAQ를 기반으로 질문이 스택 오버플로가 아닌이 사이트에 속해 있다고 주장합니다. RESTful 아키텍처의이 측면에 관한 디자인 방법론 / 철학 및 트레이드 오프에 관심이 있습니다. 스택 오버플로는 구현 질문에 대한 것으로,이 사이트는 디자인 방법론과 트레이드 오프에 대해 자세히 설명합니다.
Brandon Linton

1
@BrandonLinton에 동의합니다. 질문은 Stackoverflow에 비해 너무 광범위합니다. 건축 및 디자인 방법론에 관한 것입니다. OP는 구체적인 답변이 아닌 모범 사례와 패턴, 제안 및 문제를 원하므로 언어를 지정하지 않았습니다. 따라서 여기에 속합니다.
dooburt

답변:


81

이상적인 ReSTful 서비스를 사용하면 클라이언트 (브라우저에 없을 수도 있음)가 한 번의 요청으로 필요한 작업을 수행 할 수 있습니다 . 전체 상태가 서버가 아닌 클라이언트에 의해 유지되기 때문입니다. 클라이언트는 상태를 완전히 제어 할 수 있기 때문에 상태를 자체적으로 생성 할 수 있으며 (합법적 인 경우) API와 대화하여 "완료"합니다.

쿠키를 요구하면 어려워 질 수 있습니다. 브라우저 이외의 클라이언트의 경우 쿠키 관리는 쿼리 매개 변수, 일반 요청 헤더 또는 요청 본문에 비해 매우 불편합니다. 반면, 브라우저에서 쿠키를 사용하면 많은 것을 훨씬 간단하게 만들 수 있습니다.

따라서 API는 먼저 Authorization브라우저에서 비인증 클라이언트가 선호하는 장소이기 때문에 필요한 인증 데이터를 헤더 에서 찾을 수 있지만 브라우저 기반 클라이언트를 단순화하고 간소화 하기 위해 세션 쿠키를 확인할 수도 있습니다. 서버 측 로그인의 경우 일반 Authorization헤더가 누락 된 경우에만 해당됩니다 .

또 다른 예는 일반적으로 많은 매개 변수 세트가 필요한 복잡한 요청 일 수 있습니다. 비 대화식 클라이언트는 모든 데이터를 하나의 요청으로 방해하는 데 어려움이 없지만 HTML 양식 기반 인터페이스는 요청이 여러 페이지 ( '마법사'페이지와 같은)로 분할되어 사용자가 표시되지 않도록 할 수 있습니다 이전 선택에 따라 적용 할 수없는 옵션이 있습니다. 모든 중간 페이지는 클라이언트 측 쿠키에 값을 저장할 수 있으므로 사용자가 실제로 요청을 제출 한 마지막 페이지 만 서버에 전혀 영향을 미치지 않습니다. API는 요청 본문에서 필요한 속성을 찾고 필요한 매개 변수가 없으면 쿠키를 찾는 것으로 돌아갑니다.

편집 : RE에서 아래 @Konrad의 의견 :

비교할 때 토큰은 어딘가에 저장하지 않고 토큰을 쉽게 무효화 할 수 없기 때문에 구현하기가 더 어렵습니다.

어 ... 서버 쪽에서 쿠키를 확인하고 있습니까? 당신이해서 24 시간 후에 쿠키를 삭제하는 브라우저가 의미하지 않습니다. 이 쿠키는 고도로 숙련 된 사용자가 저장하고 "만료"된 후에도 오랫동안 재사용 할 수 있습니다.

서버 측에 세션 데이터를 저장하지 않으려면 토큰 (쿠키 등)에 저장해야합니다. 자체 포함 된 인증 토큰을 마카롱 이라고도합니다 . 쿠키와 추가 헤더 또는 요청 엔터티 자체에 의해 클라이언트와 서버간에 전달되는 방식은 인증 메커니즘 자체와 완전히 독립적입니다.


4
+1, Authorization 헤더를 사용하는 실용성이 마음에 들지만 클라이언트에게 가장 적합한 방법에 따라 쿠키로 "폴백"됩니다.
Brandon Linton

"브라우저 이외의 고객에게는 쿠키 관리가 매우 불편합니다 ..."에 동의하지 않습니다. 대부분의 HTTP 클라이언트 라이브러리는 쿠키를 지원합니다. 예를 들어, HttpClient.NET에서는 아무 문제없이 쿠키를 사용할 수 있으며 실제로 생각할 필요가 없습니다. 비교할 때 토큰은 어딘가에 저장하지 않고 토큰을 쉽게 무효화 할 수 없기 때문에 구현하기가 더 어렵습니다.
Konrad

1
@Konrad는 브라우저가 아닌 클라이언트 중 일부 가 쉽다고해서 모든 클라이언트가 쉽지 않다는 것을 의미하지는 않습니다. 사용하는 특정 클라이언트 만 지원하면 괜찮지 만 공개 API에 관한 질문을 해석했습니다. 에 curl또는 wget쿠키를 관리하는 것은 무척 불편 그리고 당신이 정말로 무리 그들에 대해 생각해야합니까. 내 답변을 편집하여 다른 요점에 대답했습니다.
SingleNegationElimination

단순히 쿠키를 수락하면 CSRF 취약점이 발생합니다. 참조 : security.stackexchange.com/a/166798
Michael Osl

14

예 및 아니요-사용 방법에 따라 다릅니다.

쿠키는 클라이언트, 클라이언트, 클라이언트 및 클라이언트에 의해 클라이언트 상태를 유지하는 데 사용되는 경우 편안합니다.

서버 상태를 쿠키에 저장하는 경우 기본적으로로드를 클라이언트로 옮기는 것입니다.

그렇다면 몇 가지 예는 무엇입니까?

평안한:

  • 인증 정보 또는 '로그인'
  • 응용 프로그램 등에서 마지막으로 본 페이지 또는 장소

편안하지 않은 :

  • 세션 정보 저장

안정은 서버의 상태 비 저장에서 비롯됩니다. 클라이언트는 애플리케이션 상태를 유지하고 서버로 보내어 서버가 어디로 갈 것인지 결정할 수 있도록 위치를 알려줍니다. 기본적으로 세션 / 상태에는 기록 데이터가 필요하고 과거 요청에 의존하므로 편안한 응용 프로그램은 이상적이지 않습니다 (로그인 화면을 사용하려는 경우 100 % 순수 편안한 응용 프로그램을 가질 수는 없습니다).


10
"isLoggedIn"플래그를 클라이언트에 저장하면 인증을 전혀 사용하지 않을 수 있습니다.
tdammers 23. 12. 12.

이것은 클라이언트 측 응용 프로그램 상태를 저장하는 것이 REST와 일치하지 않지만 자체를 나타내는 데 사용하는 클라이언트 정보는 괜찮은 것처럼 보입니다.
Brandon Linton

1
쿠키에 인증 정보를 넣으면 교차 사이트 요청 위조 공격의 가능성이 열리고 있다고 덧붙이고 싶습니다. 더 나은 방법은 내가 아마존 복사 제안이 있습니다 docs.aws.amazon.com/AmazonS3/latest/API/...을
Dobes Vandermeer

"isLoggedIn"플래그가 JWT에 있다면 어떨까요? 그런 다음 JWT가 올바르게 발행되고 확인되면 보안이 유지되어야합니다.
Aaron J Spetner 18


12

쿠키를 사용할 수 있습니다. REST가 허용합니다.

REST는 세션 정보를 클라이언트 측에 저장해야하지만 인증과 관련하여 일부 정보는 보안상의 이유로 서버 측에 남아 있어야합니다.

내 블로그 중 하나에서 게시물 , 인증 데이터가 REST에 대한 범위를 벗어난 것으로 간주되는 일반적인 합의가있다. 따라서 서버가이 세션 데이터의 일부를 옆에 두는 것이 좋습니다.

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