NFC: NDEF, Tag 타입, Reader vs Card Emulation
NFC(Near Field Communication)는 13.56 MHz에서 ~4 cm 거리로 동작하는 근접 통신 기술이다. 한쪽이 RF 필드를 생성하고, 다른 쪽이 이 필드에서 전력을 수확해 응답하므로 배터리 없는 태그와도 통신할 수 있다.
NFC 동작 모드
| 모드 | RF 필드 생성 | 설명 |
|---|---|---|
| Reader/Writer | 디바이스(폰/리더) | 패시브 태그를 읽거나 쓴다 |
| Card Emulation | 외부 리더 | 디바이스가 카드/태그처럼 동작한다 |
| Peer-to-Peer | 양쪽 | 두 디바이스 간 양방향 통신 |
NDEF (NFC Data Exchange Format)
NFC 태그에 저장되는 데이터의 표준 포맷. 태그 종류에 관계없이 동일한 NDEF 구조를 사용한다.
구조
NDEF Message
└─ NDEF Record 1 (MB=1)
└─ NDEF Record 2
└─ NDEF Record N (ME=1)
NDEF Record 헤더 (1 byte):
| 비트 | 이름 | 의미 |
|---|---|---|
| 7 | MB | Message Begin |
| 6 | ME | Message End |
| 5 | CF | Chunk Flag |
| 4 | SR | Short Record (payload length가 1 byte) |
| 3 | IL | ID Length 필드 존재 |
| 2-0 | TNF | Type Name Format (3-bit) |
TNF 값:
| 값 | 의미 | 예시 |
|---|---|---|
| 0x01 | NFC Forum Well-Known Type | URI(“U”), Text(“T”), Smart Poster(“Sp”) |
| 0x02 | MIME Media Type | ”application/json” |
| 0x03 | Absolute URI | 전체 URI를 타입으로 사용 |
| 0x04 | NFC Forum External Type | ”android.com:pkg” |
URI Record 인코딩 예시
https://www.google.com을 태그에 저장할 때의 hex:
03 11 D1 01 0D 55 02 67 6F 6F 67 6C 65 2E 63 6F 6D FE
| 바이트 | 의미 |
|---|---|
03 | TLV Type: NDEF Message |
11 | TLV Length: 17 bytes |
D1 | Header: MB=1, ME=1, SR=1, TNF=0x01 (Well-Known) |
01 | Type Length: 1 |
0D | Payload Length: 13 |
55 | Type: “U” (URI record) |
02 | URI Prefix: https://www. |
67..6D | ”google.com” (ASCII) |
FE | TLV Terminator |
URI prefix 코드로 URL 앞부분을 압축한다. 0x01 = http://www., 0x02 = https://www., 0x04 = https:// 등.
Tag 타입: Type 2 vs Type 4
Type 2 (NTAG213/215/216)
가장 많이 쓰이는 태그. ISO 14443-3A 기반, 106 kbit/s.
메모리는 4-byte 페이지 단위로 구성된다:
Page 0-2: UID + Lock bytes
Page 3: CC (Capability Container)
Page 4~: 사용자 데이터 (NDEF TLV)
CC bytes (Page 3) 예시 — NTAG213:
E1 10 12 00
E1 — Magic: NFC Forum Type 2 Tag
10 — 버전 1.0
12 — 용량: 0x12 × 8 = 144 bytes
00 — 접근 권한: 읽기/쓰기 허용
READ 명령으로 4페이지(16 bytes)씩 읽는다. 용량은 48~888 bytes (NTAG216).
Type 4 (DESFire, ST25TA)
ISO 14443-4 (ISO-DEP) + ISO 7816-4 APDU 기반. 파일 시스템 구조를 가진다.
NDEF Tag Application (AID: D2760000850101)
├─ CC File (ID: E103) — 태그 속성 정보
└─ NDEF File (ID: E104) — NLEN(2 bytes) + NDEF Message
NDEF 읽기 APDU 시퀀스:
1. SELECT Application → 00 A4 04 00 07 D2760000850101 00
← 90 00
2. SELECT CC File → 00 A4 00 0C 02 E103
← 90 00
3. READ BINARY (CC) → 00 B0 00 00 0F
← [CC data] 90 00
4. SELECT NDEF File → 00 A4 00 0C 02 E104
← 90 00
5. READ BINARY (NLEN) → 00 B0 00 00 02
← [length] 90 00
6. READ BINARY (NDEF) → 00 B0 00 02 [length]
← [NDEF data] 90 00
비교
| Type 2 | Type 4 | |
|---|---|---|
| 프로토콜 | ISO 14443-3A | ISO 14443-4 + ISO 7816-4 |
| 속도 | 106 kbit/s | 최대 424 kbit/s |
| 용량 | 48~888 bytes | 4 KB~32 KB+ |
| 명령 체계 | 자체 READ/WRITE (페이지 단위) | APDU (SELECT/READ BINARY) |
| 메모리 모델 | 플랫 페이지 (4 bytes/page) | 파일 시스템 (CC + NDEF 파일) |
| 보안 | 정적 lock bits, 선택적 패스워드 | AES 암호화, ACL |
| 단가 | ||
| 칩 예시 | NTAG213/215/216 | DESFire EV3, ST25TA |
| 용도 | URL 스티커, 마케팅, 제품 태그 | 결제, 교통카드, 출입통제, 디지털 키 |
Reader/Writer 모드
디바이스가 RF 필드를 생성해 패시브 태그를 읽는 모드.
동작 흐름 (Type A)
Reader Tag
│── SENS_REQ (0x26) ─────────→│ 태그 탐색
│←─ SENS_RES (ATQA) ──────────│ 플랫폼 정보 응답
│── SDD_REQ (Anti-collision) →│ UID 요청
│←─ SDD_RES (UID + BCC) ──────│ UID 응답
│── SEL_REQ (Select) ────────→│ 태그 선택
│←─ SEL_RES (SAK) ────────────│ 선택 확인
│── RATS ─────────────────────→│ (Type 4만) ISO-DEP 활성화
│←─ ATS ───────────────────────│
이후 Type 2는 READ/WRITE 명령, Type 4는 APDU로 데이터를 교환한다.
Card Emulation 모드
디바이스가 카드처럼 동작한다. RF 필드를 생성하지 않고, 외부 리더의 필드에 응답한다.
SE vs HCE
| Secure Element (SE) | Host Card Emulation (HCE) | |
|---|---|---|
| 처리 위치 | 전용 보안 칩 (SE/SIM/eSE) | 호스트 CPU (Android 앱) |
| 보안 | 하드웨어 수준 탬퍼 방지 | 소프트웨어 샌드박스 |
| 프로비저닝 | SE에 사전 탑재 필요 | 앱 설치만으로 가능 |
| 용도 | 결제 (Apple Pay), 차량 키 | 멤버십, 교통, 출입, 커스텀 앱 |
| 플랫폼 | iOS/Android 모두 | Android 4.4+ |
HCE APDU 흐름
외부 리더 폰 (HCE)
│── SELECT AID ──────────→│ 00 A4 04 00 [Lc] [AID] 00
│←─ Response ─────────────│ [data] 90 00
│── Application APDU ────→│ 애플리케이션별 명령
│←─ Response ─────────────│ 응답 + Status Word
외부 리더가 SELECT AID를 보내면, Android NFC 컨트롤러가 AID 라우팅 테이블에서 대상 서비스를 찾아 APDU를 전달한다.
차량 디지털 키에서의 Card Emulation
CCC Digital Key는 NFC card emulation을 사용한다:
- 차량 도어 핸들의 NFC 리더가 RF 필드 생성
- 폰의 NFC 컨트롤러가 응답, Secure Element의 차량 키 applet으로 APDU 라우팅
- SE에서 ECC 기반 인증 수행 (SPAKE2+, NIST P-256)
- 인증 성공 시 차량 잠금해제
Express 모드: iPhone XS 이후, 배터리가 방전된 후에도 최대 5시간 NFC가 동작한다. NFC 컨트롤러가 iOS 없이 독립적으로 Express Card 트랜잭션을 처리한다.
메모
- Type 2 태그의 UID는 고정이지만, HCE 디바이스는 탭마다 랜덤 UID를 생성한다. 리더가 UID로 디바이스를 식별하면 안 된다
- NDEF TLV 길이가 254 bytes를 초과하면 3-byte 형식(
0xFF+ 2-byte big-endian)을 사용한다 - NFC를 BLE/WiFi 프로비저닝의 OOB 채널로 사용하면 ~4 cm 범위에서만 크레덴셜이 교환되므로 도청이 어렵다
- Type 4 태그의 APDU 응답에서
90 00은 성공,6A 82는 파일 없음,6D 00은 명령 미지원