10. Secure Socket
보안소켓
통신을 함에 있어서 도청과 같은 스누핑(snooping)을 방지해야함.
SSL, TLS 프로토콜과 관련된 암호화 알고리즘을 사용하여 소켓 암호화를 통해 보안을 강화.
보안 소켓 계층(SSL)
confidential과 인증의 다양한 수준을 사용해 TCP 클라이언트들이 HTTP 또는 TCP 서버들과 대화를 가능하게 하는 보안 프로토콜
전송 계층 보안(TLS)
보안 통신
키값이 커질수록 brute-force attack 에 안전해지긴 함
비밀키 암호화 방식(대칭키 암호화)
데이터를 암호화하고 복호화하는 데 같은 키가 사용된다.
공개키 암호화 방식(비대칭키 암호화)
데이터를 암호화하고 복호화하는 데 다른 키가 사용된다.
또한 인증과 무결성 검사에도 사용될 수 있다.
A와 B가 데이터를 주고 받음
B는 A의 공개키로 데이터를 암호화함.(B의 개인키가 있어야 데이터 복호화가 가능)
추가로 A의 개인키로 암호화를 한번 더 함(B가 받을 때 A한테서 받았다는 인증)
그러면 B는 A의 공개키로 복호화(A인증) , B의 개인키로 복호화(데이터 확인) 와 같은 과정
보안 클라이언트 소켓 만들기
java.net.Socket 객체를 생성하는 대신 javax.net.ssl.SSLSocketFactory로부터 createSocke()메서드를 사용, 소켓 객체를 얻을 수 있다.
SSLSocketFactory는 추상 팩토리 디자인 패턴을 따르는 추상 클래스
정적 메서드인 getDefault를 호출 → SSLSocketFactory의 인스턴스를 얻을 수 있음
암호화 조합 선택하기
DES/AES 는 블록 암호 알고리즘 → 여러 비트를 한번에 암호화 함
DES는 항상 64비트 단위로 암호화를 함
AES는 128, 192, 256비트 단위의 블록을 암호화할 수 있음. 블록 크기의 배수가 안되면 모자란 비트만큼 덧붙여서 인코딩 함
RC4는 한번에 1바이트씩 암호화가 가능 → 한번에 1바이트씩 전송이 필요한 프로토콜에서 사용하기 적합함
이벤트 핸들러
클라이언트와 서버 사이의 연결이 완료될 때, handshake-complete 이벤트 알림을 받기 위해서는HandshakeCompletedListener 인터페이스를 구현하기만 하면 된다.
세션 관리
일반적으로 웹 연결은 일시적이며 모든 페이지는 분리된 소켓을 통해 요청된다.
세션을 통해 동일한 같은 공개키/개인키 조합을 사용
클라이언트 모드
일반적으로 대부분의 보안 통신에서 서버는 인증을 해야함. 근데 클라이언트는 아님
setUseClientMode()
메서드는 첫 핸드세이크 시에 인증이 필요한지 여부를 결정client와 server 모두에서 사용 가능. true→인증 제공X, false→인증 시도
한번만 설정, 두번째부턴 예외 발생.
보안 서버 소켓 만들기
SSLServerSocket 설정하기
SSLSocket과 같이 SSLServerSocket도 암호화 조합을 선택, 세션을 관리, 클라이언트가 스스로 인증이 필요한지를 결정하는 메서드를 제공함.
서버측에서 동작한다는 것이 차이
암호화 조합 선택 가능
세션관리 가능
세션 설정을 위해서는 클라이언트와 서버 양쪽에서 동의가 필요
서버쪽에서는 setEnableSessionCreation() 메서드로 허용 여부 설정
getEnableSessionCreation() 메서드로 허용 여부 판단.
세션은 기본적으로 허용
서버에서만 세션을 거부하면, 세션 생성을 원하는 클라이언트는 여전히 연결할 수 있음. 다만 세션을 얻지 못하고 모든 소켓에 대해 계속 handshake를 해야함.
클라이언트에서만 세션을 거부하면, 대화는 할 수 있지만 세션을 생성할 수 없음.
Last updated