SSLSession — SSL 세션을 나타내는 인터페이스
SSLSession — SSL 세션을 나타내는 인터페이스
SSL에서 세션(session)은 두 개체 사이의 진행 중인 관계를 나타내는 개념이에요. 하나의 SSL 연결은 한 번에 하나의 세션만 사용하지만, 그 세션은 두 개체 사이의 여러 연결에서 동시에 또는 순차적으로 쓰일 수 있어요. 연결에서 쓰이던 세션이 다른 세션으로 교체될 수도 있구요. 세션은 SSL 핸드셰이킹 프로토콜의 일부로 새로 만들어지거나 다시 참여(재개)돼요.
본문
세션은 보안 정책이나 리소스 사용 정책 때문에 무효화될 수도 있고, 애플리케이션이 명시적으로 invalidate를 호출해서 무효화할 수도 있어요. 세션 관리 정책은 주로 성능을 튜닝하는 데 쓰여요.
표준 세션 속성 외에도 SSL 세션은 다음과 같은 읽기 전용 속성을 노출해요.
- Peer Identity — 세션은 특정 클라이언트와 특정 서버 사이에 성립해요. 피어(peer)의 정체는 세션 설정 과정에서 확립될 수 있고, 보통 X.509 인증서 체인으로 식별돼요.
- Cipher Suite Name — 암호 스위트(cipher suite)는 특정 세션에서 연결에 사용되는 암호화 보호의 종류를 나타내요.
- Peer Host — 세션의 모든 연결은 같은 두 호스트 사이에 성립돼요. 연결 반대편 호스트의 주소를 알 수 있어요.
세션은 명시적으로 무효화될 수 있고, 특정 종류의 오류가 발생하면 암묵적으로 무효화되기도 해요.
이 인터페이스의 핵심 메서드들을 살펴볼게요.
-
byte[] getId()— 이 세션에 할당된 식별자를 반환해요. -
SSLSessionContext getSessionContext()— 이 세션이 바인딩된 컨텍스트를 반환해요. 일부 환경에서는 컨텍스트를 사용할 수 없어서 이 메서드가null을 반환할 수 있어요. 보안 관리자가 설치되어 있다면 접근 권한이 필요할 수 있고, 없으면SecurityException이 발생할 수 있어요.SSLPermission("getSSLSessionContext")권한이 확인돼요. -
long getCreationTime()— 이 세션 표현이 만들어진 시각을 UTC 1970년 1월 1일 자정 이후의 밀리초로 반환해요. -
long getLastAccessedTime()— 세션 수준 인프라가 이 세션 표현에 마지막으로 접근한 시각을 밀리초로 반환해요. 접근은 세션 데이터를 사용해 새 연결이 만들어진 것을 뜻해요. 세션에 연관된 값을 가져오거나 설정하는 같은 애플리케이션 수준 연산은 이 접근 시각에 반영되지 않아요. -
void invalidate()— 세션을 무효화해요. 이후의 연결은 이 세션을 재개하거나 참여할 수 없지만, 이미 이 세션을 쓰고 있는 연결은 닫힐 때까지 계속 사용할 수 있어요. -
boolean isValid()— 이 세션이 유효하고 재개·참여할 수 있는지 반환해요. -
void putValue(String name, Object value)— 애플리케이션 계층 데이터에 이 세션을 주어진 이름으로 값을 바인딩해요. 같은 이름의 기존 바인딩은 교체돼요. 새(또는 기존) 값이SSLSessionBindingListener를 구현하면 그 객체가 적절히 통지받아요. 보안상 같은 이름의 값이 서로 다른 접근 제어 컨텍스트에서 보이지 않을 수 있어요. 두 인자 중 하나라도null이면IllegalArgumentException이 발생해요. -
Object getValue(String name)— 주어진 이름에 바인딩된 세션의 애플리케이션 계층 데이터 객체를 반환해요. 그런 바인딩이 없으면null을 반환해요. 인자가null이면IllegalArgumentException이 발생해요. -
void removeValue(String name)— 주어진 이름에 바인딩된 객체를 세션의 애플리케이션 계층 데이터에서 제거해요. 그 이름에 바인딩된 객체가 없으면 아무것도 하지 않아요. 기존 바인딩 객체가SSLSessionBindingListener를 구현하면 적절히 통지받아요. -
String[] getValueNames()— 세션에 바인딩된 모든 애플리케이션 계층 데이터 객체 이름의 배열을 반환해요. 비어 있을 수 있지만null은 아니에요.
피어 인증서 관련 메서드도 있어요.
Certificate[] getPeerCertificates() throws SSLPeerUnverifiedException— 세션 정의 과정에서 확립된 피어의 정체를 반환해요. 인증서 기반 암호 스위트에서만 사용할 수 있고, Kerberos 같은 비인증서 기반 암호 스위트에서 쓰면SSLPeerUnverifiedException을 던져요. 반환값이 유효한 인증서 체인이 아닐 수 있으니 신뢰 결정에 사용하면 안 돼요.Certificate[] getLocalCertificates()— 핸드셰이킹 중 피어에게 보낸 인증서를 반환해요. 여러 인증서가 사용 가능할 때 구현이 가장 적합하다고 판단한 체인을 골라 보내요. 보낸 인증서가 없으면null을 반환해요.Principal getPeerPrincipal() throws SSLPeerUnverifiedException— 피어의 principal을 반환해요. X509 기반 암호 스위트에서는 엔드 엔티티 인증서의X500Principal, Kerberos 암호 스위트에서는KerberosPrincipal을 반환해요.Principal getLocalPrincipal()— 핸드셰이킹 중 피어에게 보낸 principal을 반환해요. 보낸 principal이 없으면null을 반환해요.
그 밖에 연결 자체에 관한 정보도 알 수 있어요.
String getCipherSuite()— 세션의 모든 연결에 쓰이는 SSL 암호 스위트의 이름을 반환해요. 데이터 보호 수준, 사용되는 암호화 종류, 인증 방식의 대부분을 정의해요.String getProtocol()— 세션의 모든 연결에서 쓰이는 프로토콜의 표준 이름을 반환해요.String getPeerHost()— 피어 호스트 이름을 반환해요. 서버 입장에선 클라이언트 호스트, 클라이언트 입장에선 서버 호스트예요. 이름이 완전히 정규화된 호스트 이름이 아닐 수 있고 인증되지 않았으므로 신뢰하면 안 돼요. 주로 SSLSession 캐싱 전략의 힌트로 쓰여요. 정보가 없으면null을 반환해요.int getPeerPort()— 피어의 포트 번호를 반환해요. 정보가 없으면-1을 반환해요.int getPacketBufferSize()— 이 세션에서 예상되는 가장 큰 SSL/TLS/DTLS 패킷의 현재 크기를 반환해요.SSLEngine네트워크 버퍼는 이 값 이상으로 크기를 잡아야wrap/unwrap호출 시 공간 부족 문제를 피할 수 있어요.int getApplicationBufferSize()— 이 세션에서 예상되는 가장 큰 애플리케이션 데이터의 크기를 반환해요. 애플리케이션 데이터 버퍼는 들어오는 네트워크 패킷의 애플리케이션 데이터를 담을 수 있을 만큼 커야 해요.