AAS REST API — Base64Url 인코딩 원리

왜 필요한가: URL 경로에 IRI를 포함할 때 슬래시(/)·콜론(:)·특수문자 충돌 방지 — IETF RFC 4648 §5 URL-safe alphabet 적용

변환 단계 흐름도
Step 1
원본 IRI
https://admin-shell.io/shells/CellS513
슬래시(/)와 특수문자 포함
URL 경로에 직접 사용 불가
encode
Step 2
Base64 인코딩
aHR0cHM6Ly9hZG1p
bi1zaGVsbC5pby9z
aGVsbHMvQ1RfMTQy
RFC 4648 표준 Base64
아직 URL unsafe 문자 포함 가능
replace
Step 3
Base64Url 변환 규칙
+  →  -     /  →  _     =  →  제거
+ → -/ → _= 제거
URL safe 알파벳으로 치환
insert
Step 4
URL 경로에 삽입
GET /shells/
aHR0cHM6Ly9hZG1p
bi1zaGVsbC5pby9z
aGVsbHMvQ1RfMTQy
경로 세그먼트로 안전 삽입
AAS Part 2 API 명세 준수
1
Shell ID 인코딩
입력 (Shell IRI)
https://admin-shell.io/shells/CellS513
Base64Url 인코딩 결과
aHR0cHM6Ly9hZG1pbi1zaGVsbC5pby9zaGVsbHMvQ1RfMTQy
API 호출 URL
GET /api/v3.0/shells/
aHR0cHM6Ly9hZG1pbi1zaGVsbC5pby9zaGVsbHMvQ1RfMTQy
2
Submodel ID 중첩 인코딩
Submodel IRI
https://example.org/smt/Nameplate/1/0
Base64Url 인코딩 결과
aHR0cHM6Ly9leGFtcGxlLm9yZy9zbXQvTmFtZXBsYXRlLzEvMA
중첩 경로 호출
GET /shells/{enc_aas}/submodels/{enc_sm}
Shell + Submodel 각각 인코딩
3
DemoServer 실제 호출
실제 호출 예
localhost:5080/api/v3.0/shells/aHR0...
응답 JSON 구조 미리보기
{'{'} "modelType": "AssetAdministrationShell",
  "id": "https://...CellS513",
  "assetInformation": {'{'}...{'}'}
{'}'}
HTTP 상태
200 OK  ·  Content-Type: application/json
Python
importbase64
# IRI → Base64Url 인코딩 (AAS Part 2 API 명세 준수)
b64url = base64.urlsafe_b64encode(iri.encode).decode.rstrip('=')
# urlsafe_b64encode: + → -, / → _ 자동 처리 / rstrip('='): 패딩 제거
디코딩 (역방향)
base64.urlsafe_b64decode(
  b64url + '=='
).decode