안녕하셀포~😮🎸
오늘은 Salesforce 개발에서 코드를 작성할 때 가장 중요한 측면 중 하나인 '보안'에 대해 이야기해보려고 합니다.
Apex를 사용하는 개발자는 중요한 데이터를 실수로 노출하지 않도록 주의해야 합니다. 기본적으로 Apex는 시스템 컨텍스트에서 실행되며, 시스템 컨텍스트에서 Apex 코드는 모든 개체 및 모든 필드에 엑세스 할 수 있습니다.
따라서 셀포 개발자라면 반드시 권한 관련해서 주의를 기울일 수 밖에 없는데요!! 🧐
먼저 Apex Class의 권한을 제어할 수 있는 몇 가지 키워드들을 살펴보겠습니다.
1. with sharing
- Apex Class에 with sharing을 사용하게 되면, 현재 사용자에 대한 공유 규칙이 클래스에 대해 고려되도록 지정할 수 있습니다. Apex는 시스템 컨텍스트에서 실행되기 때문에 이 키워드를 명시적으로 설정해야 합니다.
- 기본 설정 권장, Apex 클래스에서 공유 설정을 선언하지 않은 경우 기본적으로 with sharing 설정 적용
public with sharing class sharingClass {
// Code here
}
2. without sharing
- with sharing의 반대 개념으로, 현재 사용자에 대한 공유 규칙이 적용되지 않도록 클래스를 선언할 때 사용되는 키워드입니다.
public without sharing class sharingClass {
// Code here
}
3. Inherited sharing
- 사용자의 데이터 엑세스를 그 사용자가 속한 그룹의 계층 구조를 기반으로 제어하며, 사용자가 속한 그룹의 권한이 해당 사용자에게 상속됩니다.
- 클래스가 명시적으로 'with sharing'과 'without sharing'으로 선언되지 않았을 때, 해당 클래스는 기본적으로 'inherited sharing'을 따릅니다. 이것은 클래스가 Apex 트랜잭션의 진입점으로 사용될 때 실행됩니다. 즉, 클래스가 메인으로 실행될 때 해당 클래스는 현재 사용자의 데이터 엑세스 권한을 상속합니다. 그러나 클래스가 다른 클래스에서 메서드로 호출될 때는 해당 클래스의 공유 설정이 무시됩니다.
아래 코드를 보면, 실제 사용자가 공유 엑세스 권한을 가진 Contact 만 가져오게 되며, 만약 inherited sharing 을 없앤다면 사용자가 볼 수 있는 권한이 없는 Contact도 가져올 수 있습니다.
public inherited sharing class InheritedSharingClass {
public List<Contact> getAllTheSecrets() {
return [SELECT Name FROM Contact];
}
}
Apex는 기본적으로 개체 수준 및 필드 수준 권한을 적용하지 않지만 SOQL 쿼리에서 WITH SECURITY_ENFORCED를 사용하여 권한을 적용할 수 있습니다. 또한 Schema.DescribeSObjectResult, Schema.DescribeFieldResult 를 명시적으로 호출하여 코드에서 Object 및 Field에 대한 권한을 적용할 수도 있습니다.
WITH SECURITY_ENFORCED
- 해당 쿼리는 현재 사용자가 엑세스할 수 있는 데이터만 반환합니다.
List<Account> listAccount = [SELECT Id FROM Account WITH SECURITY_ENFORCED];
Schema.DescribeSObjectResult, Schema.DescribeFieldResult
- Apex에서 사용되는 클래스로, Salesforce의 특정 개체 및 해당 필드에 대한 메타데이터 정보를 제공합니다.
1. isCreateable() : 해당 필드나 개체가 새로운 레코드를 생성할 수 있는지 여부
2. isAccessible() : 해당 필드나 개체에 엑세스할 수 있는지 여부
3. isUpdateable() : 해당 필드나 개체를 업데이트할 수 있는지 여부
4. isDeletable() : 해당 개체를 삭제할 수 있는지 여부
/* Contact의 Email 필드의 Update 권한 확인 */
if (Schema.sObjectType.Contact.fields.Email.isUpdateable()) {
// Update contact email address
}
/* Contact의 Email 필드의 Create 권한 확인 */
if (Schema.sObjectType.Contact.fields.Email.isCreateable()) {
// Create new contact
}
/* Contact의 Email 필드의 읽기 권한 확인 */
if (Schema.sObjectType.Contact.fields.Email.isAccessible()) {
Contact c = [SELECT Email FROM Contact WHERE Id= :Id];
}
/* Contact에 대한 Delete 권한 확인 */
if (Schema.sObjectType.Contact.isDeletable()) {
// Delete contact
}
여기까지 코드 작성 시 보안을 강화하는 방법에 대해 알아보았습니다. (❁´◡`❁)
요약하자면... 개발할 땐 최소한의 권한을 부여하고, 필요한 경우에만 권한을 확장하여 사용하는 것이 좋습니다!
오늘도 글 읽어주셔서 감사합니다~
그럼 이만!
'✔️ Development' 카테고리의 다른 글
[Salesforce] LWC Popup Notifications 들에 대해 알아보자! (Alert, Confirm, Prompt) (0) | 2024.03.25 |
---|---|
[Salesforce] Null Coalescing Operator (??) in Apex (3) | 2024.03.15 |
[Salesforce] LWC : lightning-record-picker 마스터가 될래요! (1) | 2024.03.11 |
[Salesforce] Aura Component NameSpace 들이 궁금하다고? (0) | 2024.03.04 |