Java Card 250625
Java Card는 스마트카드 등의 보안 요소(Security Element)에서 자바(Java) 프로그래밍 언어 기반 애플릿(Applet)을 구동하기 위해 설계된 경량 자바 플랫폼입니다. 카드사에서 발급하는 결제카드(EMV 카드), 교통카드, 신분증 등 다양한 분야에 폭넓게 쓰이고 있으며, 다음과 같은 특징과 구조를 갖습니다.
1. 경량화된 자바 환경
• Java Card Virtual Machine (JCVM): 일반 자바 가상머신(JVM)을 더 작고 단순화한 형태로, 스마트카드의 제한된 메모리(수십~수백 KB)와 CPU 성능(수백 MHz 미만)에 맞춰 최적화되어 있습니다.
• Java Card API: java.lang․java.io 등 일반 자바의 방대한 패키지 중 카드 환경에 꼭 필요한 클래스만 골라 경량화한 전용 API입니다. 예를 들어, APDU(카드-단말 간 통신 메시지)를 처리하는 javacard.framework.APDU와 암호 연산용 javacard.security.* 패키지가 제공됩니다.
2. 애플릿 생명주기
1. 개발(Development): 개발자는 Java Card SDK를 사용해 .java 파일을 작성한 뒤, 자바 컴파일러로 바이트코드(.class)로 만들고, 이를 리로케이션·압축·검증 과정을 거쳐 CAP(Card Application Package) 파일로 패키징합니다.
2. 설치(Installation): 카드에 들어 있는 카드 운영체제(Card OS) 혹은 GlobalPlatform 인터페이스를 통해 CAP 파일을 카드에 전송하고, 적절한 AID(Application Identifier)를 등록하여 애플릿을 설치합니다.
3. 초기화(Initialization): 설치된 애플릿은 생성자 또는 install 메서드에서 파라미터를 받아 초기 설정(키 등록, 파라미터 설정 등)을 수행합니다.
4. 활성화/비활성화(Select/Deselect): 단말기가 SELECT 명령을 보내면 애플릿이 활성화되어 APDU 처리를 시작하고, DESELECT 시점에 종료됩니다.
5. 제거(Delete): 더 이상 사용하지 않는 애플릿은 CAP 파일을 카드에서 완전히 삭제할 수 있습니다.
3. 메모리 및 트랜잭션 관리
• EEPROM(Persistent Memory): 애플릿 코드와 영구 데이터를 저장하며, 플래시 메모리 기반이어서 쓰기 횟수와 속도에 제약이 있습니다.
• RAM(Transient Memory): APDU 처리 중 일시적인 데이터를 저장합니다. 동작 속도가 빠르나 전원이 꺼지면 초기화됩니다.
• 트랜잭션(Transaction): EEPROM을 변경할 때는 트랜잭션을 이용해 중간 상태에서 장애가 발생해도 카드가 손상되지 않도록 원자성을 보장합니다. JCSystem.beginTransaction() 과 commitTransaction() 으로 묶어 사용합니다.
4. 보안 모델
• Applet Firewall: 설치된 애플릿 간에 메서드 호출이나 데이터 접근을 엄격히 격리하여, 한 애플릿이 다른 애플릿의 비밀 키나 데이터를 직접 훔치는 것을 방지합니다.
• 키 저장 및 암호화: 대칭키(AES, 3DES), 비대칭키(RSA), 해시(SHA) 등을 위한 클래스가 제공되며, 키는 카드 내 보안 메모리에 안전하게 저장됩니다.
• 인증 및 채널 보안: GlobalPlatform의 Secure Channel Protocol(SCP)을 통해 카드와 관리 시스템 간에 메시지 위·변조를 방지하는 보안 채널을 설정합니다.
5. EMV 결제 애플릿
카드사에서 발급하는 EMV 카드에서는 Java Card 기반의 EMV 애플릿이 표준화되어 있습니다. 이 애플릿은 다음 기능을 수행합니다.
1. 카드 인증(IC): 터미널이 보내는 비인증 데이터(INTERNAL AUTHENTICATE)를 처리하고, 카드 고유 키로 생성한 암호문을 돌려보내어 카드를 인증합니다.
2. PIN 관리: 사용자가 입력한 PIN을 카드 내 PIN 파일과 비교하여 일치 여부를 판단하고, 실패 시 카드를 차단할 수 있습니다.
3. 거래 로직: 거래 금액 한도 초과 시 온라인 승인(issuer script) 로직을 수행하거나, 오프라인 승인 결과(ARQC, ARPC)를 처리합니다.
4. 거래 로그 기록: 카드 내 소규모 트랜잭션 로그를 남겨, 단말기 장애나 통신 손실 시 복구에 활용할 수 있습니다.
6. 개발 시 고려사항
• 메모리 최적화: 각 바이트가 중요하므로, 불필요한 클래스·메서드·변수를 제거하고, 상수 풀(Constant Pool)을 줄이는 작업이 필수입니다.
• 성능 최적화: APDU 명령 처리 시간은 카드의 사용자 경험에 직결되므로, 복잡한 암호 연산을 최소화하고, 가급적 RAM을 활용하여 연산 속도를 높입니다.
• 테스트: 실제 카드 리더기와 연동해 여러 시나리오(선불, 후불, 온라인·오프라인)를 검증하고, 카드 발급 단계부터 폐기까지 전체 플로우를 점검해야 합니다.
⸻
위와 같이 Java Card 플랫폼은 자바의 편의성과 스마트카드의 보안성을 결합하여, 카드사 결제·인증 기능을 안전하고 유연하게 구현할 수 있도록 돕습니다. Java Card를 활용하면 표준화된 개발 환경에서 다양한 카드 기반 서비스를 통합하여 운용할 수 있습니다.