서버 보안 Parse

안녕하세요 여러분, 이번 글에서는 Back4App에서 Parse Server를 사용할 때 보안에 대해 이야기하려고 합니다. 보안은 개발자를 기쁘게 하는 주제가 아니기 때문에 매우 간결하고 직접적으로 설명하겠습니다. 여기서 제가 의도한 것은 앱을 프로덕션 앱으로 만들기 전에 검토할 수 있는 간단한 보안 체크리스트를 제공하는 것이었습니다.

보안 메커니즘 Parse

앱에 대한 적절한 보안 액세스를 적절하게 구성하려면 먼저 몇 가지 기본 보안 메커니즘 개념인 기본 Parse 클래스와 인증 메커니즘을 이해해야 합니다.

1-Parse 기본 클래스

Parse는 기본적으로 3개의 클래스를 생성합니다: 사용자, 역할, 세션입니다. 이러한 클래스는 전체 백엔드와 완전히 통합되며 앱을 보호하기 위한 인증 메커니즘을 구성할 때 더욱 쉽게 사용할 수 있습니다.

사용자

Parse는 사용자 계정 관리에 필요한 대부분의 기능을 자동으로 처리하는Parse.User라는 특수 사용자 클래스를 제공합니다.

Parse.User 클래스는 기본적으로 보안이 설정되어 있습니다. Parse.User에 저장된 데이터는 해당 사용자만 수정할 수 있습니다. 기본적으로 모든 클라이언트는 데이터를 읽을 수 있습니다. 따라서 일부 Parse.User 객체는 인증되어 수정할 수 있지만 다른 객체는 읽기 전용입니다.

역할

역할은 사용자 및 기타 역할을 새 역할에 연결할 수 있는 클래스입니다. 역할을 만든 후에는 해당 역할을 사용하여 CLP 및 ACL을 사용하여 앱에서 해당 역할이 액세스할 대상을 정의할 수 있습니다.

세션

사용자 로그인 방법을 통해 사용자를 로그인하면 Parse는 Parse 서버에 제한되지 않은 새 세션 객체를 자동으로 생성합니다. 가입 및 Facebook/Twitter 로그인도 마찬가지입니다.

2-Parse 인증 메커니즘

Parse의 데이터 액세스에 관해서는 두 가지 수준에서 앱 보안을 제어할 수 있습니다:

  1. 클래스/테이블 – CLP(클래스 수준 권한)를 사용하여 전체 클래스에 대한 새 열 생성 및 일반 데이터 액세스를 제한합니다;
  2. 개체- ACL(액세스 제어 목록)을 사용하여 특정 개체에 대한 액세스를 제어합니다;

클래스 수준 권한 – CLP

클래스 수준 권한은 클래스와 모든 객체의 액세스를 제어하는 메커니즘입니다. CLP를 사용하여 역할, 사용자 또는 포인터에 대한 읽기/쓰기 액세스를 구성할 수 있습니다.

이 메커니즘을 사용하여 다음 작업에 대한 액세스를 제한할 수 있습니다:

  • 읽기
    • Get – 주어진 ObjectId에 대한 객체 정보를 가져옵니다;
    • Find – 이 클래스의 모든 객체를 쿼리합니다(ObjectID는 필요하지 않음);
    • Count – 클래스 총 오브젝트 수입니다;
  • 쓰기
    • 만들기 – 새 객체를 만듭니다;
    • 업데이트 – 기존 객체를 업데이트합니다;
    • 삭제 – 기존 개체를 삭제합니다;
  • 추가
    • 필드 추가 – 이 클래스에서 새 열을 만듭니다;

이러한 구성 옵션에 액세스하려면 오른쪽 상단 퀵 메뉴의 클래스에서 작은 방패 아이콘으로 이동해야 합니다.

방패 아이콘을 클릭하면 읽기/쓰기 옵션만 있는 간단한 메뉴가 표시됩니다. 창 오른쪽 상단의 아이콘을 클릭하면 고급 CLP 구성에 액세스할 수 있습니다.

그러면 전체 CLP 구성 창이 표시됩니다.

액세스 제어 목록 – ACL

액세스 제어 목록을 사용하면 특정 클래스의 각 개체에 대한 액세스를 다르게 제어할 수 있습니다. 개체에 대한 ACL을 만들고 각 역할 또는 사용자에 대한 액세스(읽기/쓰기)를 구성할 수 있습니다.

역할을 만들려면 항상 ACL이 필요합니다. 따라서 첫 번째 역할을 만들려면 사용자가 필요합니다. 앱에서 첫 번째 역할을 만들기 위해 루트 사용자를 만들어 보겠습니다. 이 사용자는 이러한 역할을 편집할 수 있는 유일한 사용자가 됩니다.

먼저 사용자 테이블에 사용자 이름과 비밀번호를 입력하기만 하면 루트 사용자를 만들 수 있습니다.

그런 다음 루트 사용자 오브젝트아이디를 복사하고 역할 클래스로 이동합니다. 새 역할을 만들고 ACL 필드를 두 번 클릭하여 ACL을 만듭니다. 이 경우 루트 사용자가 이 ACL을 읽고 쓸 수 있도록 허용할 것이므로 루트 사용자 ObjectID로 ACL을 채운 다음 저장하겠습니다.

이 단계가 끝나면 이 역할에 Admin이라는 이름을 부여하고 사용자 Alex 및 Alysson을 연결해 보겠습니다. 역할 클래스는 사용자 클래스와 관계를 가지므로 개요 관계를 클릭한 다음 이 관계에 추가하려는 사용자의 ObjectID를 추가할 수 있습니다.

관계 보기를 클릭합니다
사용자 개체 ID 목록쉼표로 구분을 채웁니다
최종 결과 확인

이제 사용자 2명이 있는 역할 관리자가 새 역할을 구성하고 새 ACL 또는 CLP에 속성을 지정하는 데 사용할 수 있습니다.

보안 앱 체크리스트

이제 주요 Parse 보안 개념에 익숙해졌으니 앱의 보안을 강화하기 위한 몇 가지 조언을 제안하고자 합니다.

1-마스터 키 안전하게 보관

마스터 키는 다른 모든 보안 계층을 우회하는 Parse 메커니즘입니다. 앱에 대한 앱 마스터 키를 갖는 것은 서버의 루트 액세스 권한을 갖는 것과 같다고 비유할 수 있습니다.

그렇기 때문에 이 키를 보호해야 하며 필요한 경우 클라우드 코드를 통해서만 키를 사용해야 합니다. 누군가 디컴파일하거나 JS의 경우 소스 보기를 클릭하고 키를 복사할 수 있으므로 프론트엔드 코드에서는 사용하지 않아야 합니다.

또 다른 조언은 클라우드 코드에서 이 키를 사용할 때는 클라우드 코드의 일부인 키를 공개 코드 리포지토리에 커밋하지 않아야 한다는 것입니다.

2-클라이언트 클래스 생성 선택 취소

Back4App에서 새 앱을 만들면 Parse 키 allowClientClassCreation이 활성화됩니다. 즉, AppID와 클라이언트 키를 가진 사람은 누구나 데이터베이스에 새 클래스를 만들 수 있습니다.

Back4App의 서버 설정->핵심 설정->설정 메뉴 옵션에서 이 구성을 변경할 수 있습니다.

아래 그림과 같이 아래로 스크롤하여 “클라이언트 클래스 생성 허용” 옵션을 선택 해제하면 됩니다.

앱을 개발하는 동안 이 옵션을 활성화한 상태로 유지했다가 완료되면 제거하는 것이 좋습니다.

3-역할 구조 만들기

ACL 섹션에서 시작했듯이 계속해서 역할 구조를 구축하여 모든 앱 클래스와 오브젝트에 대한 액세스를 더 잘 제어할 수 있습니다. Uber 클론 앱을 빌드하고 있고 3개의 주요 액세스 권한이 있다고 가정해 보겠습니다: 관리자, 승객, 드라이버.

4-사용자 및 역할에 대한 CLP 구성

User는 기본 Parse 클래스이므로 클래스 이름, REST API 키, 앱 ID를 가진 사람이라면 누구나 curl 명령 한 번으로 모든 사용자 목록을 요청할 수 있습니다:

curl -X GET -H "X-Parse-Application-Id: FyebII2zNpA2i9DdZ8froWna9vIvJMcgjfmjS0iK" -H "X-Parse-REST-API-Key: hluEgfZ084RdR0MyyE8Y9v4RwsOsTIWlJeCc4qGw" https://parseapi.back4app.com/users

그리고 사용자 목록을 검색합니다:

CLP를 만들고 사용자 테이블을 읽고 쓸 수 있는 권한을 제한하면 이를 방지할 수 있습니다(ACL을 사용하여 보호할 수도 있습니다). 이 경우에는 관리자 사용자만 전체 사용자 목록을 읽을 수 있도록 허용하겠습니다.

역할 클래스와 유사한 프로세스를 만들어 전체 클래스를 읽을 필요가 없는 역할/사용자의 액세스 권한을 제거할 수 있습니다.

모든 세션 객체에는 해당 사용자만 읽고 쓸 수 있는 자동 생성 ACL이 있으므로 세션 클래스는 기본적으로 보호됩니다.

5- 고정 클래스 읽기 전용으로 만들기

Parse 대시보드를 통해서만 변경하려는 테이블/클래스가 있는 경우 CLP를 사용하여 읽기 전용으로 만들 수 있습니다. 제 경우에는 Uber-Clone-App이 운영될 도시를 정의하는 클래스를 만들었습니다.

이 클래스는 분석 대시보드를 통해서만 변경하고 싶으므로 다른 모든 역할에서 쓰기 액세스 권한을 제거하겠습니다.

6-일반 CLP 및 ACL 조언

앱의 대부분의 클래스는 보안이 쉬운 몇 가지 범주 중 하나에 속합니다. 완전 공개 데이터의 경우 클래스 수준 권한을 사용하여 테이블을 잠가서 누구도 공개적으로 읽고 쓸 수 없도록 설정할 수 있습니다. 완전 비공개 데이터의 경우 ACL을 사용하여 데이터를 소유한 사용자만 데이터를 읽을 수 있도록 할 수 있습니다.

하지만 때로는 데이터를 완전히 공개하거나 완전히 비공개하고 싶지 않은 상황에 직면할 수 있습니다. 예를 들어, 소셜 앱에서 사용자가 승인한 친구만 읽을 수 있어야 하는 데이터가 있을 수 있습니다. 이 경우 이 가이드에서 설명하는 기술을 조합하여 원하는 공유 규칙을 정확하게 설정해야 합니다.

자세한 내용은 ACL을 만드는 방법에 대한 동영상을 확인하세요.

7-세션 길이 설정(일부 사례만 해당)

매우 민감한 정보가 포함된 앱(뱅킹 앱, 헬스케어 앱)을 개발 중이며 짧은 시간 후에 사용자를 로그아웃해야 할 수도 있습니다.

세션 길이를 제한하려면 서버 설정->사용자 지정 앱 설정으로 이동합니다.

사용자 정의 Parse 옵션 텍스트 상자에서 세션 길이를 초 단위로 정의합니다. 아래에서는 세션을 10분으로 정의하고 있습니다. 그런 다음 저장을 클릭합니다.

8-Https 및 SSL 사용

Https는 클라이언트의 브라우저에서 서버로 정보를 전송하기 위한 보안 프로토콜입니다. 해커가 MITM과 같은 공격을 통해 민감한 정보에 접근하는 것을 방지하는 것이 필요합니다.

여기서 조언하는 것은 Http보다 Https를 사용하여 Parse Server와 연결하는 것입니다. 아래는 활성 연결을 설정하기 위해 https를 올바르게 사용하는 방법을 보여주는 Parse와의 JS 연결을 사용한 예제입니다. 잘못된 방법은 https:// 대신 http:// 을 사용하는 것입니다.

Parse.initialize("APP_ID","JS_KEY");
Parse.serverURL = 'https://parseapi.back4app.com/'

Back4App 웹호스팅을 사용하는 경우 Back4App은 이미 기본적으로 https 연결을 제공한다는 점에 유의하세요(통화 시 https:// 을 사용해야 합니다!).

그러나 고유한 도메인 이름을 사용하고 Back4App 서버로 리디렉션하려면 SSL 인증서가 유효하고 올바르게 설치되어 있는지, https를 사용하여 Back4App으로 리디렉션하고 있는지 확인해야 합니다.

마지막 말

Back4App과 Parse는 클라우드에서 데이터를 보호할 수 있는 다양한 방법을 제공합니다. 앱을 구축하고 저장할 데이터의 종류를 평가하면서 어떤 구현을 선택할지 결정할 수 있습니다.

이러한 도구를 사용하여 앱의 데이터와 사용자의 데이터를 안전하게 보호할 수 있는 모든 조치를 취하시기 바랍니다. 함께라면 웹을 더 안전한 곳으로 만들 수 있습니다.


Leave a reply

Your email address will not be published.