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
import
base64
# IRI → Base64Url 인코딩 (AAS Part 2 API 명세 준수)
b64url
=
base64
.
urlsafe_b64encode
(
iri
.
encode
).
decode
.
rstrip
(
'='
)
# urlsafe_b64encode: + → -, / → _ 자동 처리 / rstrip('='): 패딩 제거
디코딩 (역방향)
base64.urlsafe_b64decode(
b64url +
'=='
).decode