SSLSession — SSL 세션을 나타내는 인터페이스

SSLSession — SSL 세션을 나타내는 인터페이스

SSL에서 세션(session)은 두 개체 사이의 진행 중인 관계를 나타내는 개념이에요. 하나의 SSL 연결은 한 번에 하나의 세션만 사용하지만, 그 세션은 두 개체 사이의 여러 연결에서 동시에 또는 순차적으로 쓰일 수 있어요. 연결에서 쓰이던 세션이 다른 세션으로 교체될 수도 있구요. 세션은 SSL 핸드셰이킹 프로토콜의 일부로 새로 만들어지거나 다시 참여(재개)돼요.

출처: Java API Reference

본문

세션은 보안 정책이나 리소스 사용 정책 때문에 무효화될 수도 있고, 애플리케이션이 명시적으로 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() — 이 세션에서 예상되는 가장 큰 애플리케이션 데이터의 크기를 반환해요. 애플리케이션 데이터 버퍼는 들어오는 네트워크 패킷의 애플리케이션 데이터를 담을 수 있을 만큼 커야 해요.

더 알아보기 (Learn more)