Authorize 개요
Authorize는 사용자가 충전을 시작하기 전에 인증 수단(RFID 카드, 앱 등)을 사용할 때 충전소가 중앙 시스템(CSMS)에 인증 요청을 보내는 메시지입니다. 이 메시지를 통해 사용자의 충전 권한을 확인하고 승인 또는 거부 결정을 받습니다.
메시지 구조
Request (충전소 → CSMS)
{
"idToken": {
"idToken": "04123456789ABC",
"type": "ISO14443"
},
"certificate": "MIICertificateData...",
"iso15118CertificateHashData": [
{
"hashAlgorithm": "SHA256",
"issuerNameHash": "A1B2C3D4...",
"issuerKeyHash": "E5F6G7H8...",
"serialNumber": "12345678"
}
]
}
Response (CSMS → 충전소)
{
"idTokenInfo": {
"status": "Accepted",
"cacheExpiryDateTime": "2024-08-16T23:59:59.000Z",
"chargingPriority": 0,
"language1": "en",
"language2": "ko",
"groupIdToken": {
"idToken": "GROUP001",
"type": "ISO14443"
},
"personalMessage": {
"format": "UTF8",
"language": "en",
"content": "Welcome! Your account balance: $25.50"
}
},
"certificateStatus": "Accepted"
}
주요 필드 설명
Request 필드들
| 필드명 |
필수여부 |
타입 |
설명 |
| idToken |
필수 |
Object |
인증 토큰 정보 |
| idToken.idToken |
필수 |
String |
실제 토큰 값 (RFID UID, 앱 토큰 등) |
| idToken.type |
필수 |
Enum |
토큰 타입 |
| certificate |
선택사항 |
String |
X.509 인증서 (PEM 형식) |
| iso15118CertificateHashData |
선택사항 |
Array |
ISO 15118 인증서 해시 데이터 |
idToken.type 값
| 타입 |
설명 |
| Central |
중앙 시스템에서 생성된 토큰 |
| eMAID |
ISO 15118 eMAID (전자 이동성 계정 ID) |
| ISO14443 |
ISO 14443 RFID 카드 |
| ISO15693 |
ISO 15693 RFID 카드 |
| KeyCode |
키패드 입력 코드 |
| Local |
로컬에서 생성된 토큰 |
| MacAddress |
MAC 주소 기반 토큰 |
| NoAuthorization |
인증 없음 (무료 충전 등) |
Response 필드들
| 필드명 |
필수여부 |
타입 |
설명 |
| idTokenInfo |
필수 |
Object |
토큰 인증 결과 정보 |
| idTokenInfo.status |
필수 |
Enum |
인증 상태 |
| idTokenInfo.cacheExpiryDateTime |
선택사항 |
DateTime |
캐시 만료 시간 |
| idTokenInfo.chargingPriority |
선택사항 |
Integer |
충전 우선순위 (-9 ~ 9) |
| idTokenInfo.language1 |
선택사항 |
String |
기본 언어 코드 |
| idTokenInfo.language2 |
선택사항 |
String |
보조 언어 코드 |
| idTokenInfo.groupIdToken |
선택사항 |
Object |
그룹 토큰 정보 |
| idTokenInfo.personalMessage |
선택사항 |
Object |
개인화 메시지 |
| certificateStatus |
선택사항 |
Enum |
인증서 상태 |
idTokenInfo.status 값
| 상태 |
설명 |
| Accepted |
승인됨 - 충전 시작 가능 |
| Blocked |
차단됨 - 계정이 차단된 상태 |
| ConcurrentTx |
동시 거래 - 이미 다른 충전소에서 사용 중 |
| Expired |
만료됨 - 토큰 또는 계정이 만료 |
| Invalid |
유효하지 않음 - 토큰 형식 오류 |
| NoCredit |
잔액 부족 - 충전을 위한 잔액 부족 |
| NotAllowedTypeEVSE |
EVSE 타입 불허 - 해당 충전기 타입 사용 불가 |
| NotAtThisLocation |
위치 불허 - 해당 위치에서 사용 불가 |
| NotAtThisTime |
시간 불허 - 현재 시간에 사용 불가 |
| Unknown |
알 수 없음 - 토큰을 찾을 수 없음 |
실제 사용 예제
예제 1: RFID 카드 인증 성공
// Request
{
"idToken": {
"idToken": "04123456789ABC",
"type": "ISO14443"
}
}
// Response
{
"idTokenInfo": {
"status": "Accepted",
"cacheExpiryDateTime": "2024-08-16T23:59:59.000Z",
"chargingPriority": 0,
"language1": "en",
"personalMessage": {
"format": "UTF8",
"language": "en",
"content": "Welcome John! Ready to charge."
}
}
}
예제 2: 앱 토큰 인증 (잔액 부족)
// Request
{
"idToken": {
"idToken": "APP_TOKEN_ABC123",
"type": "Central"
}
}
// Response
{
"idTokenInfo": {
"status": "NoCredit",
"personalMessage": {
"format": "UTF8",
"language": "en",
"content": "Insufficient balance. Please add credit to your account."
}
}
}
예제 3: 차단된 계정
// Request
{
"idToken": {
"idToken": "04987654321DEF",
"type": "ISO14443"
}
}
// Response
{
"idTokenInfo": {
"status": "Blocked",
"personalMessage": {
"format": "UTF8",
"language": "en",
"content": "Account blocked. Please contact customer service."
}
}
}
예제 4: ISO 15118 Plug & Charge
// Request
{
"idToken": {
"idToken": "DE*ABC*E123456789",
"type": "eMAID"
},
"certificate": "-----BEGIN CERTIFICATE-----\nMIICertificateData...\n-----END CERTIFICATE-----",
"iso15118CertificateHashData": [
{
"hashAlgorithm": "SHA256",
"issuerNameHash": "A1B2C3D4E5F6G7H8",
"issuerKeyHash": "I9J0K1L2M3N4O5P6",
"serialNumber": "987654321"
}
]
}
// Response
{
"idTokenInfo": {
"status": "Accepted",
"chargingPriority": 5
},
"certificateStatus": "Accepted"
}
예제 5: 키패드 코드 인증
// Request
{
"idToken": {
"idToken": "1234",
"type": "KeyCode"
}
}
// Response
{
"idTokenInfo": {
"status": "Accepted",
"cacheExpiryDateTime": "2024-08-16T18:00:00.000Z",
"personalMessage": {
"format": "UTF8",
"language": "ko",
"content": "인증 성공! 충전을 시작하세요."
}
}
}
인증 처리 흐름
일반적인 인증 과정
- 사용자 액션: RFID 카드 태그, 앱에서 QR 코드 스캔 등
- 토큰 읽기: 충전소가 인증 수단에서 토큰 정보 추출
- Authorize 요청: CSMS에 인증 요청 전송
- CSMS 검증: 토큰 유효성, 계정 상태, 잔액 등 확인
- 응답 처리: 승인/거부 결과에 따른 후속 처리
- 사용자 안내: 디스플레이나 LED를 통한 결과 표시
캐싱 메커니즘
// 첫 번째 인증 (온라인)
{
"idTokenInfo": {
"status": "Accepted",
"cacheExpiryDateTime": "2024-08-17T10:30:00.000Z"
}
}
// 네트워크 단절 시 캐시된 정보로 오프라인 인증 가능
그룹 토큰 활용
// 기업 차량 그룹 관리
{
"idTokenInfo": {
"status": "Accepted",
"groupIdToken": {
"idToken": "COMPANY_FLEET_A",
"type": "Central"
},
"chargingPriority": 3
}
}
특수 상황 처리
동시 충전 제한
// 이미 다른 충전소에서 충전 중
{
"idTokenInfo": {
"status": "ConcurrentTx",
"personalMessage": {
"format": "UTF8",
"language": "en",
"content": "Already charging at Station B. Stop current session first."
}
}
}
시간 제한
// 야간 시간대 사용 제한
{
"idTokenInfo": {
"status": "NotAtThisTime",
"personalMessage": {
"format": "UTF8",
"language": "en",
"content": "Charging not allowed between 11 PM - 6 AM."
}
}
}
위치 제한
// 특정 충전소만 사용 가능한 토큰
{
"idTokenInfo": {
"status": "NotAtThisLocation",
"personalMessage": {
"format": "UTF8",
"language": "en",
"content": "This card is valid only at downtown stations."
}
}
}
관련 Configuration Key
주요 설정값
| 설정 키 |
기본값 |
설명 |
| AuthorizeRemoteTxRequests |
true |
원격 트랜잭션 요청 시 인증 필요 여부 |
| LocalAuthorizeOffline |
true |
오프라인 시 로컬 인증 허용 여부 |
| LocalPreAuthorize |
false |
사전 인증 캐싱 사용 여부 |
| AuthorizationCacheEnabled |
true |
인증 캐시 사용 여부 |
보안 고려사항
토큰 보안
- 토큰 값 암호화 전송
- 재전송 공격 방지
- 토큰 복제 방지 메커니즘
인증서 검증
- X.509 인증서 체인 검증
- 인증서 만료일 확인
- CRL(Certificate Revocation List) 확인
개인정보 보호
- 개인화 메시지 암호화
- 사용자 식별 정보 최소화
- GDPR 준수
중요 포인트
- 사전 인증: StartTransaction 이전에 수행하여 빠른 충전 시작
- 오프라인 지원: 캐시 메커니즘으로 네트워크 단절 시에도 인증 가능
- 개인화: 사용자별 맞춤 메시지와 언어 설정 지원
- 우선순위: 충전 우선순위로 대기열 관리 가능
- 다양한 인증 방식: RFID, 앱, 키패드, Plug & Charge 등 지원
- 실시간 상태: 계정 차단, 잔액 부족 등 실시간 상태 반영
Authorize 메시지는 충전 서비스의 보안과 사용자 경험을 동시에 보장하는 핵심 메시지입니다. 다양한 인증 방식과 상황별 처리를 통해 안전하고 편리한 충전 환경을 제공합니다.