노션 통합에 DB를 연결했는데 쓰기가 403으로 막힌다
노션 DB 에 글을 올리는 스크립트를 짰다. DB 는 통합(integration)에 연결해뒀고 읽기도 잘 됐다. 그런데 페이지를 만들려니 이렇게 죽었다.
Error: /pages → 403 restricted_resource: Insufficient permissions for this endpoint.
여기서 대개 의심하는 것
연결을 의심했다. DB 페이지 우상단 ... 을 열어 Connections 에 통합이 붙어 있는지 봤다. 붙어 있었다.
다음은 토큰 차례였다. 잘못된 토큰을 쓰고 있나 싶어 확인용 요청을 보냈다.
curl -s https://api.notion.com/v1/users/me -H "Authorization: Bearer $TOKEN" -H "Notion-Version: 2022-06-28"
봇 이름과 워크스페이스가 정상으로 나왔다. DB 조회도 200 이었고 제목과 속성 목록까지 받아왔다.
읽기가 되는데 쓰기만 403. 여기서 막혔다.
실제 원인
노션 통합에는 연결(Connection) 과 권한(Capabilities) 이 따로 있다.
- 연결: 이 통합이 어느 페이지·DB 를 볼 수 있는가
- 권한: 이 통합이 무엇을 할 수 있는가
DB 를 연결해도 통합 자체가 읽기 전용이면 쓰기는 안 된다. 내 통합은 Content Capabilities 에서 Read content 만 켜져 있었다.
처방
두 군데를 봐야 한다. 한쪽만 고치면 그대로 403 이다.
1. 통합 권한
notion.so/profile/integrations 에서 통합을 열고 Configuration 탭 → Capabilities → Content Capabilities.
Read content 읽기
Insert content 새 페이지 생성 ← 이게 없으면 /pages 가 403
Update content 기존 페이지 수정 ← 재발행·덮어쓰기에 필요
Insert content 를 켜고 저장한다.
2. DB 연결 권한
DB 페이지 → 우상단 ... → Connections 에 통합이 있는지 확인한다. 없으면 Connect to 로 추가한다.
확인
권한 변경은 즉시 반영된다. 테스트 페이지를 하나 만들었다가 바로 보관하면 데이터를 안 남기고 확인된다.
const page = await api("/pages", { method: "POST", body: JSON.stringify({
parent: { database_id: DB },
properties: { Title: { title: [{ type: "text", text: { content: "[권한 확인] 지워도 됨" } }] } },
})});
await api(`/pages/${page.id}`, { method: "PATCH", body: JSON.stringify({ archived: true }) });
DB 에 잠깐 나타났다 사라지면 정상이다.
왜 헷갈리나
증상이 원인과 정반대 방향을 가리킨다. restricted_resource 라는 말은 “이 리소스에 접근 권한이 없다” 로 읽히니까 DB 연결부터 뒤지게 된다. 정작 문제는 엔드포인트 권한 쪽이다.
읽기가 된다는 사실도 발목을 잡는다. 연결은 확인된 셈이 되니 “연결은 됐으니 다른 문제겠지” 로 생각이 넘어간다. 성공이 잘못된 확신을 준다.
연결과 권한은 아예 다른 화면에 있다. 연결은 워크스페이스 안 DB 페이지에서 고치고 권한은 통합 설정 페이지에서 고친다. 한쪽을 보고 있으면 다른 쪽이 눈에 안 들어온다.
남은 것
권한이 부족할 때 어떤 capability 가 없는지 응답이 알려주면 좋겠는데, 지금 메시지에는 그 정보가 없다. Insufficient permissions 뒤에 Insert content required 한 줄만 있어도 바로 찾았을 것이다.