[RUBY-ON-RAILS] 루비 온 레일즈 내에서 보안 REST API를 구축하기위한 제안을 찾고
RUBY-ON-RAILS루비 온 레일즈 내에서 보안 REST API를 구축하기위한 제안을 찾고
내가 일하고 있어요 프로젝트를위한 REST API를 구축 시작하고있어, 그것은의 RoR을 사용하여 API를 구축하는 가장 좋은 방법에 관한 약간의 연구를 내게했다. 나는 기본적으로 모델은 세계에 열려 있고 단순히 URL의 끝에 ".XML"를 넣고 적절한 매개 변수를 전달하여 URL을 통해 호출 할 수 있습니다 꽤 빨리 찾을 수 있습니다.
그럼 다음 질문을했다. 어떻게 무단 변경을 방지하기 위해 내 응용 프로그램을 보호합니까? 몇 가지 연구를하고 나는 몇 기사 attr_accessible 및 attr_protected하고이 방법을 사용할 수 있습니다에 대해 이야기했습니다. 특정 URL 나는이 얘기 발견은 07 월 (여기)에 다시 게시했습니다.
루비 모든 것들과 마찬가지로, 나는 확실히 일들이 그 이후로 진화했다고 해요. 내 질문은 그래서,이 RoR에 내에서 REST API를 확보하는 가장 좋은 방법은 아직?
당신은 "새 프로젝트"또는 "기존 프로젝트"시나리오 중 하나에 무엇을 제시하지 않을 경우?
해결법
-
==============================
1.이 API 요청을 인증을 위해 여러 가지 방식이 있으며, 그들은 restful_authentication 또는 acts_as_authenticated 같은 플러그인에서 제공하는 일반 인증과는 다른 것. 가장 중요한 것은, 클라이언트는 세션을 유지되지 않으므로 로그인의 개념이 없다.
이 API 요청을 인증을 위해 여러 가지 방식이 있으며, 그들은 restful_authentication 또는 acts_as_authenticated 같은 플러그인에서 제공하는 일반 인증과는 다른 것. 가장 중요한 것은, 클라이언트는 세션을 유지되지 않으므로 로그인의 개념이 없다.
HTTP 인증
당신은 기본 HTTP 인증을 사용할 수 있습니다. 이를 위해 API 클라이언트는 일반 사용자 이름과 암호를 사용하고 너무 같은 URL에 넣어 :
http://myusername:mypass@www.someapp.com/
난 당신이 누군가가 API를 통해 또는 브라우저를 통해 응용 프로그램을 사용할지 여부를 무시할 수 있도록이 편안 인증, 상자의 출력을 지원합니다 생각합니다.
여기에 한 가지 단점은 모든 요청에 일반 텍스트로 사용자 이름과 비밀번호를 넣어 사용자를 요구하고 있다는 점이다. SSL을 통해 그 일을함으로써, 당신이 안전 할 수 있습니다.
나는 내가 실제로 불구하고,이를 사용하는 API를 본 적이 생각하지 않습니다. 내가 문제가 무엇인지 모르는, 그것은 현재의 인증 체계에 의해 밖으로 상자의 지원 것 특히 이후, 나에게 상당히 좋은 아이디어처럼 보인다.
API 키
API 인증을 사용하는 또 다른 쉬운 방법은 API 키를 사용하는 것입니다. 그것은 본질적으로 원격 서비스에 대한 사용자 이름입니다. 누군가 징후가 당신의 API를 사용할 때, 당신은 그들에게 API 키를 제공합니다. 이것은 각 요청과 함께 전달 될 필요가있다.
여기에 한 가지 단점은 사람이 다른 사람의 API 키를 얻는 경우에, 그들이 그 사용자로 요청을 할 수 있다는 것입니다. 난 당신이 어느 정도 이러한 위험을 상쇄 할 수하여 모든 API 요청이 HTTPS (SSL)을 사용하는 것이 생각합니다.
또 다른 단점은 사용자가 이동 어디서나 동일한 인증 자격 증명 (API 키)를 사용한다는 것입니다. 그들은 그들의 유일한 옵션뿐만 아니라 다른 모든 클라이언트를 사용할 수 없게됩니다 자신의 API 키를 변경할 수있는 API 클라이언트에 대한 액세스 권한을 취소합니다. 이것은 사용자가 여러 API 키를 생성 할 수 있도록함으로써 완화 될 수있다.
API 키 + 비밀 키 서명
추천하지 않습니다는 (일종의) - 아래의 OAuth를 참조
훨씬 더 복잡한 비밀 키를 사용하여 요청을 서명. 이것은 무엇 아마존 웹 서비스 (S3, EC2와 같은 DO). 기본적으로, 사용자에게이 키를 제공합니다 : 자신의 API 키 (. 즉, 사용자 이름)과 비밀 키 (예 : 비밀번호를.). API 키는 각 요청과 함께 전송되어 있지만, 비밀 키는 없습니다. 대신, 일반적으로 다른 매개 변수를 추가하여, 각 요청에 서명하는 데 사용됩니다.
IIRC, 아마존은 요청에 모든 매개 변수를 복용하고, 매개 변수의 이름을 주문하여이 작업을 수행합니다. 그런 다음이 문자열은 해시 키와 사용자의 비밀 키를 사용하여 해시됩니다. 이 새로운 값은 송신되기 이전에 상기 요청에 대한 새로운 파라미터로서 부가된다. 아마존의 측면에서, 그들은 같은 일을. 그들은 (서명을 제외한) 모든 매개 변수를 사용을 주문하고, 해시는 비밀 키를 사용하여. 이 서명과 일치하는 경우, 요청이 합법적인지 알고있다.
여기 단점은 복잡하다. 제대로 작동하려면이 제도를 얻는 것은 API 개발자와 클라이언트 모두에 고통이다. 지원 요청 및 작업 물건을 얻을 수있는 클라이언트 개발자 화가 이메일을 많이 기대합니다.
OAuth를
키 + 비밀 서명과 복잡성의 몇 가지 문제에 대처하기 위해, 표준의 OAuth라는 등장했습니다. 핵심은 OAuth를 키 + 비밀 서명의 맛이지만, 많이의 표준화되고 여러 언어 라이브러리에 포함되어 있습니다.
일반적으로, 오히려 자신의 키 / 서명 시스템을 만드는 대신 사용하여 OAuth에 대한 API 생산자와 소비자 모두에서 훨씬 쉽다.
OAuth는 또한 본질적으로 세그먼트는 각각의 API 소비자에 대해 서로 다른 액세스 자격 증명을 제공하는 액세스 할 수 있습니다. 이것은 그들의 다른 소비하는 응용 프로그램에 영향을주지 않고 선택적으로 액세스 취소에 대한 사용자 수 있습니다.
특히 루비, OAuth를 모두 생산자와 소비자를위한 상자 밖으로 지원을 제공하는 OAuth는 보석이있다. 나는 API를 구축하기 위해 보석을 사용하고 또한의 OAuth API를 소비하고 매우 깊은 인상을 받았습니다. 당신이 (간단한 API 키 방식에 반대) 응용 프로그램이 OAuth는 필요하다고 생각한다면, 나는 쉽게 OAuth는 보석을 사용하는 것이 좋습니다 수 있습니다.
-
==============================
2.attr_accessible 및 attr_protected는 액티브 모델에 대량 과제를 수행 할 수있는 능력을 제어하는 모두 유용합니다. 당신은 확실히 형태로 주입 공격을 방지하기 위해 attr_protected 사용할; 사용이 attr_protected 참조하거나 우리가 당신을 해킹합니다.
attr_accessible 및 attr_protected는 액티브 모델에 대량 과제를 수행 할 수있는 능력을 제어하는 모두 유용합니다. 당신은 확실히 형태로 주입 공격을 방지하기 위해 attr_protected 사용할; 사용이 attr_protected 참조하거나 우리가 당신을 해킹합니다.
또한, 귀하의 레일 응용 프로그램에서 컨트롤러에 접근 할 수있는 사람을 방지하기 위해, 당신은 거의 확실하게 사용자 인증 시스템의 일종이 필요하고 인증 된 사용자가을 가지고 있는지 확인하기 위해 컨트롤러에 before_filter를 넣어거야 요청하면 요청 된 컨트롤러 액션을 실행할 수 있습니다 전에.
톤에 더 도움이되는 정보를 루비 온 레일즈 보안 가이드 (레일 문서 프로젝트의 일부)를 참조하십시오.
-
==============================
3.나는 또한 레일 응용 프로그램에 대한 REST API를 구축하고 있습니다 때문에 나는 지금 당신과 비슷한 문제에 직면하고있다.
나는 또한 레일 응용 프로그램에 대한 REST API를 구축하고 있습니다 때문에 나는 지금 당신과 비슷한 문제에 직면하고있다.
난 단지는 attr_accessible가 표시되어 편집이 될 수있는 사용자 속성 있는지 만드는 것이 좋습니다. 이 update_attributes를 사용하여 할당 할 수있는 속성의 화이트리스트를 설정합니다.
내가 뭘하면이 같은 것입니다 :
class Model < ActiveRecord::Base attr_accessible nil end
내 모든 모델는 그들이 대량 할당을하려는 필드 attr_accessible를 정의하도록 강요 그래서, 그 상속. 개인적으로, 나는 기본적으로이 동작을 가능하게하는 방법이 있었으면 좋겠어 (가있을 수 있습니다, 나는 그것에 대해 모른다).
그냥 그래서 당신은 누군가가 대량뿐만 아니라 REST API를 사용하여뿐만 아니라 일반 형태의 게시물을 사용하여 속성을 할당 할 수 있습니다 알고 있습니다.
-
==============================
4.자신이 개인 개발자 등 http://www.3scale.net/있는 핸들 키, 토큰, 쿼터 같은 것을 사용하는 것입니다 물건을 많이 구축을 절약 할 또 다른 방법. 또한 분석을 수행하고 개발자 포털을 생성합니다.
자신이 개인 개발자 등 http://www.3scale.net/있는 핸들 키, 토큰, 쿼터 같은 것을 사용하는 것입니다 물건을 많이 구축을 절약 할 또 다른 방법. 또한 분석을 수행하고 개발자 포털을 생성합니다.
루비가있다 / 레일 플러그인 루비 API 플러그인 도착하는대로 트래픽 정책을 적용 할 - 당신은 OAuth를 보석과 함께 사용할 수 있습니다. 당신은 할 수 있습니다 또한 응용 프로그램의 앞에 니스를 포기하고 광택 lib 디렉토리의 모드를 사용하여 우리를 : 니스 API 모듈.
from https://stackoverflow.com/questions/247110/looking-for-suggestions-for-building-a-secure-rest-api-within-ruby-on-rails by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 어떻게 레일의 상대 시간을합니까? (0) | 2020.02.27 |
---|---|
[RUBY-ON-RAILS] 어떻게 RVM은 어떻게 실제로 일을 rbenv? (0) | 2020.02.27 |
[RUBY-ON-RAILS] before_save과 : before_create 레일 콜백에 루비,의 차이를 무엇입니까? (0) | 2020.02.26 |
[RUBY-ON-RAILS] 어떻게 루비 온 레일즈와 TDD에 시작합니까? [닫은] (0) | 2020.02.26 |
[RUBY-ON-RAILS] 레일 서버 포트가 이미 프로세스를 종료하는 방법을 사용 말한다? (0) | 2020.02.26 |