문제
let client = Supabaseclient(supabaseURL, supabaseKey)
client.from("Character")
.select()
.exectue()
해당 코드를 실행했을 때 응답 코드는 200으로 문제없이 응답은 왔으나, Table의 데이터는 들어오지 않는 문제가 발생하였습니다.
원인과 해결 과정
원인은 몇 가지가 복합적으로 존재했는데요! 문제는 다음과 같았습니다.
칼럼 네임 실수
- CodingKeys로 키를 맞춰줄 때 이름을 실수하는 문제가 있었습니다!
RLS (Row Level Security)
- 데이터베이스에 특정 사용자나 그룹이 특정 행에만 접근할 수 있도록 하는 보안 매커니즘
- Supabase의 DB에 접근하기 위해서는
Project URL
과API Key
가 필요한데,API Key
에는 두 가지 키가 존재합니다. - secret key의 경우 Row Level Security를 우회하여 동작하기에 secret key를 사용하는 경우 문제 없이 데이터를 받아올 수 있지만, 해당 키는 노출되었을 때 DB의 모든 것을 조작할 수 있기 때문에 클라이언트 쪽에서는 사용하지 않는 것이 바람직하다고 합니다.
그래서 해당 문제를 해결하기 위해서 public key를 사용하면서 RLS 정책을 추가하는 방식을 사용하였습니다.
해결 과정
Supabase 관리 페이지에서, Authentication -> Policies 에서 각 테이블에 대한 RLS 설정을 할 수 있습니다!
테이블 별로 두 개의 버튼으로 쿼리문을 직접 작성하지 않아도 테이블 관련 설정을 할 수가 있었는데, Disable RLS를 할 경우 public key로도 값을 잘 받아오게 할 수 있었지만, 이 경우 읽기 뿐 아니라 모든 접근 및 조작을 공개키로도 가능하게 되어 보안상의 문제가 있습니다.
따라서 Create policy 를 눌러서 우측 Template에서 원하는 권한을 추가해주면 RLS를 킨 상태에서 특정 권한만 public key로 접근이 가능하도록 할 수 있었습니다!
'사이드 프로젝트' 카테고리의 다른 글
[Swift] CollectionViewCell에서 이미지 요청을 보낼 때 취소될 수 있는 문제 (0) | 2025.04.08 |
---|