블록체인랩스
경력근거: 데이터 접근 권한, 사용자 인증 및 암호화 기능 개발
※ 실제 산출물이 아닌 AI 예측 시안입니다.
블록체인랩스는 개인이 자기 데이터로 나만의 AI 'another i'를 만들고, AI가 앱을 넘나들며 사용자의 의도에 맞춰 작업하게 하는 블록체인·AI 기반 OS 'Newnal'을 만들어요. Newnal을 탑재한 첫 기기 'Newnal Phone'은 MWC 2025에서 시제품으로 공개했어요.
공고는 '개인 데이터는 누가 통제하고, AI는 어떤 권한으로 행동하며'라고 묻고, 이 자리의 일로 '데이터 접근 권한, 사용자 인증 및 암호화 기능 개발'을 꼽아요. 에이전트 여럿에게 데이터 종류마다 허락을 따로 주고 기한을 정하거나 중간에 끊다 보면, 허락한 기록과 실제로 읽은 기록이 서로 다른 때에 따로 쌓여요. 두 기록을 시각으로 맞춰 봐야 허락 밖의 읽기와 쓰지 않는 허락이 드러나요.
공고는 이 자리가 할 일로 데이터 접근 권한, 사용자 인증, 암호화 기능 개발을 꼽아요. 우대사항에도 Keychain, CryptoKit, Local DB Encryption 같은 데이터 보안·암호화 경험을 적었어요.
공고는 개인 데이터, AI Agent, 외부 서비스가 상호 작용하는 구조와 인터페이스 구현을 이 자리의 일로 꼽아요. 회사 소개에서는 개인 데이터는 누가 통제하고 AI는 어떤 권한으로 행동하는지를 물어요.
공고는 Swift, SwiftUI 기반 iOS 애플리케이션 설계·개발과 새로운 플랫폼 기술·사용자 경험의 프로토타이핑을 이 자리에 맡겨요. 자격 요건에는 Swift Concurrency 같은 비동기·동시성 프로그래밍 경험을 적었어요.
사용자가 휴대폰에서 내 데이터 권한을 점검하려고 여는 iOS 앱 화면이에요. 고른 점검 기간 동안 에이전트와 데이터 종류마다 읽은 기록이 그때 살아 있던 허락 안에 있었는지, 허락이 끝나거나 끊긴 뒤에 읽은 적은 없는지, 허락만 해 두고 한동안 쓰지 않는 권한은 무엇인지 알려 줘요. 받은 데이터를 담을 DB 설계와 기술·구조, 그리고 며칠 동안 읽지 않으면 쓰지 않는 권한으로 볼지는 지원자가 정해요.
여러 AI 에이전트에게 위치·건강·결제 같은 내 데이터를 허락해 두고 쓰는 휴대폰 사용자예요. 허락은 에이전트와 데이터 종류마다 따로 주고 기한이 끝나거나 중간에 끊기기도 해서, 어느 에이전트가 무엇을 언제 읽었고 그게 허락한 범위 안이었는지 하나하나 맞춰 보기 어렵고 어떤 권한을 끊어야 할지 정하기 힘들어요.
이 데이터에 나오는 AI 에이전트 목록이에요. 한 행이 에이전트 하나이고 agent_id 가 키예요. name 은 사용자 화면에 나오는 이름이에요. 큰 데이터는 에이전트 22개 전부이고, 시작용은 그중 사용자 U-00417 의 허락·읽기 기록에 나오는 7개를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 7행 가운데 앞 5행이에요.
| agent_id | name |
|---|---|
| AG-001 | 일정 비서 |
| AG-002 | 여행 비서 |
| AG-003 | 쇼핑 도우미 |
| AG-004 | 가계부 연동 |
| AG-005 | 운동 코치 |
7행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 22행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "에이전트 하나. 키는 agent_id.",
"additionalProperties": false,
"required": [
"agent_id",
"name"
],
"properties": {
"agent_id": {
"type": "string",
"pattern": "^AG-[0-9]{3}$",
"description": "에이전트 코드. 이 표의 키예요."
},
"name": {
"type": "string",
"description": "사용자 화면에 나오는 에이전트 이름."
}
}
}사용자가 에이전트에게 데이터 종류 하나를 읽도록 허락한 기록이에요. 한 행이 허락 한 번이고 grant_id 가 키예요. agent_id 는 agents.agent_id 를 가리켜요. 허락은 granted_at 부터 유효하고, expires_at(허락할 때 정한 기한)이나 revoked_at(사용자가 끊은 시각) 가운데 이른 시각부터는 없어요. expires_at 이 null 이면 기한을 정하지 않은 허락이고, revoked_at 이 null 이면 데이터를 내보낸 2026년 10월 31일 09:10 까지 끊지 않은 허락이에요. 세 시각은 모두 휴대폰 시계로 찍은 한국 시간이에요. 같은 사용자·에이전트·데이터 종류에 허락이 여러 번 있을 수 있지만 기간은 겹치지 않아요. 끊었다가 다시 허락하면 새 행이 생겨요. 기한이 지나 끝난 허락, 중간에 끊은 허락, 끊었다가 다시 허락한 짝, 허락만 해 두고 한동안 읽지 않은 짝이 들어 있어요. 큰 데이터는 사용자 1,000명의 허락 전부이고, 시작용은 사용자 U-00417 의 허락 10건 전부를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 10행 가운데 앞 5행이에요.
| grant_id | user_id | agent_id | data_category | granted_at | expires_at | revoked_at |
|---|---|---|---|---|---|---|
| GR-002015 | U-00417 | AG-003 | location | 2026-07-08T19:40:05+09:00 | — | 2026-08-11T21:15:40+09:00 |
| GR-002331 | U-00417 | AG-001 | calendar | 2026-07-14T08:02:11+09:00 | 2027-01-01T00:00:00+09:00 | — |
| GR-002659 | U-00417 | AG-007 | contacts | 2026-07-20T10:22:47+09:00 | — | 2026-09-20T19:05:03+09:00 |
| GR-003203 | U-00417 | AG-005 | health_activity | 2026-07-30T06:51:20+09:00 | — | — |
| GR-003526 | U-00417 | AG-003 | health_activity | 2026-08-05T13:08:02+09:00 | — | — |
10행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 8,266행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "사용자가 에이전트에게 데이터 종류 하나를 허락한 한 번. 키는 grant_id.",
"additionalProperties": false,
"required": [
"grant_id",
"user_id",
"agent_id",
"data_category",
"granted_at",
"expires_at",
"revoked_at"
],
"properties": {
"grant_id": {
"type": "string",
"pattern": "^GR-[0-9]{6}$",
"description": "허락 번호. 이 표의 키예요."
},
"user_id": {
"type": "string",
"pattern": "^U-[0-9]{5}$",
"description": "허락한 사용자 코드."
},
"agent_id": {
"type": "string",
"pattern": "^AG-[0-9]{3}$",
"description": "허락받은 에이전트. agents.agent_id 를 가리켜요."
},
"data_category": {
"type": "string",
"enum": [
"location",
"calendar",
"contacts",
"photos",
"messages",
"health_activity",
"health_record",
"payment"
],
"description": "허락한 데이터 종류. location(위치), calendar(캘린더), contacts(연락처), photos(사진), messages(메시지), health_activity(걸음 수·운동 같은 건강 활동), health_record(진료·검사 같은 건강 기록), payment(결제 내역) 가운데 하나예요."
},
"granted_at": {
"type": "string",
"format": "date-time",
"description": "사용자가 허락한 시각. 한국 시간(+09:00) ISO 8601, 초 단위. 휴대폰 시계로 찍은 시각이에요."
},
"expires_at": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "허락할 때 사용자가 정한 기한. 이 시각부터는 허락이 없어요. null 이면 기한을 정하지 않았어요. 한국 시간(+09:00) ISO 8601, 초 단위. 휴대폰 시계로 찍은 시각이에요."
},
"revoked_at": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "사용자가 허락을 끊은 시각. 이 시각부터는 허락이 없어요. null 이면 데이터를 내보낸 2026-10-31 09:10 까지 끊지 않았어요. 한국 시간(+09:00) ISO 8601, 초 단위. 휴대폰 시계로 찍은 시각이에요."
}
}
}에이전트가 사용자의 데이터를 실제로 읽은 기록이에요. 한 행이 읽기 한 번이고 access_id 가 키예요. agent_id 는 agents.agent_id 를 가리켜요. user_id·agent_id·data_category 세 칸이 grants 의 같은 세 칸과 짝을 이루지만, 허락한 적 없는 짝의 읽기도 있어서 grants 를 가리키는 키로 걸지는 않아요. accessed_at 은 휴대폰이 읽기를 기록한 시각으로 grants 의 시각과 같은 시계예요. 허락 기간 안의 읽기가 대부분이고, 기한이 끝나거나 허락을 끊은 뒤의 읽기, 허락한 적 없는 데이터 종류의 읽기(이름이 비슷한 건강 활동과 건강 기록 같은), 끊기 몇 분 전의 읽기, 한동안 읽기가 아예 없는 짝이 섞여 있어요. 큰 데이터는 2026년 7월 1일부터 10월 31일 09:10 까지 사용자 1,000명의 읽기 전부이고, 시작용은 사용자 U-00417 의 점검 기간(10월 10일 09:10부터 10월 31일 09:10까지) 읽기 전부를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 38행 가운데 앞 5행이에요.
| access_id | user_id | agent_id | data_category | accessed_at |
|---|---|---|---|---|
| AC-0183120 | U-00417 | AG-007 | contacts | 2026-10-11T12:31:02+09:00 |
| AC-0183996 | U-00417 | AG-006 | photos | 2026-10-11T18:25:44+09:00 |
| AC-0186730 | U-00417 | AG-002 | calendar | 2026-10-12T18:20:44+09:00 |
| AC-0190030 | U-00417 | AG-002 | location | 2026-10-13T21:57:38+09:00 |
| AC-0190737 | U-00417 | AG-005 | health_activity | 2026-10-14T08:40:35+09:00 |
38행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 240,016행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "에이전트가 사용자의 데이터를 읽은 한 번. 키는 access_id.",
"additionalProperties": false,
"required": [
"access_id",
"user_id",
"agent_id",
"data_category",
"accessed_at"
],
"properties": {
"access_id": {
"type": "string",
"pattern": "^AC-[0-9]{7}$",
"description": "읽기 번호. 이 표의 키예요."
},
"user_id": {
"type": "string",
"pattern": "^U-[0-9]{5}$",
"description": "데이터 주인인 사용자 코드. grants.user_id 와 같은 코드예요."
},
"agent_id": {
"type": "string",
"pattern": "^AG-[0-9]{3}$",
"description": "읽은 에이전트. agents.agent_id 를 가리켜요."
},
"data_category": {
"type": "string",
"enum": [
"location",
"calendar",
"contacts",
"photos",
"messages",
"health_activity",
"health_record",
"payment"
],
"description": "읽은 데이터 종류. location(위치), calendar(캘린더), contacts(연락처), photos(사진), messages(메시지), health_activity(걸음 수·운동 같은 건강 활동), health_record(진료·검사 같은 건강 기록), payment(결제 내역) 가운데 하나예요."
},
"accessed_at": {
"type": "string",
"format": "date-time",
"description": "휴대폰이 읽기를 기록한 시각. grants 의 시각과 같은 시계예요. 한국 시간(+09:00) ISO 8601, 초 단위. 휴대폰 시계로 찍은 시각이에요."
}
}
}사용자가 권한 점검 화면을 연 기록이에요. 한 행이 한 번 연 것이고 checkup_id 가 키예요. opened_at 은 화면을 연 시각으로, 이 기능이 '지금'으로 삼는 시각이에요. period_days 는 사용자가 화면에서 고른 점검 기간(7·21·28일)으로, opened_at 에서 그만큼 앞선 시각부터 opened_at 까지의 읽기를 봐요. user_id 는 grants·access_log 의 user_id 와 같은 사용자 코드예요. 큰 데이터는 사용자들이 연 점검 전부이고, 시작용은 사용자 U-00417 이 10월 31일 09:10 에 21일 기간으로 연 한 번이에요.
전체 1행 가운데 앞 1행이에요.
| checkup_id | user_id | opened_at | period_days |
|---|---|---|---|
| CK-01800 | U-00417 | 2026-10-31T09:10:00+09:00 | 21 |
1행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 1,800행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "사용자가 권한 점검 화면을 한 번 연 것. 키는 checkup_id.",
"additionalProperties": false,
"required": [
"checkup_id",
"user_id",
"opened_at",
"period_days"
],
"properties": {
"checkup_id": {
"type": "string",
"pattern": "^CK-[0-9]{5}$",
"description": "점검 번호. 이 표의 키예요."
},
"user_id": {
"type": "string",
"pattern": "^U-[0-9]{5}$",
"description": "화면을 연 사용자 코드. grants.user_id·access_log.user_id 와 같은 코드예요."
},
"opened_at": {
"type": "string",
"format": "date-time",
"description": "화면을 연 시각. 이 기능이 '지금'으로 삼는 시각이에요. 한국 시간(+09:00) ISO 8601, 초 단위. 휴대폰 시계로 찍은 시각이에요."
},
"period_days": {
"type": "integer",
"enum": [
7,
21,
28
],
"description": "사용자가 화면에서 고른 점검 기간(일). opened_at 에서 이만큼 앞선 시각부터 opened_at 까지의 읽기를 봐요."
}
}
}