개요

네트워크 프로그램을 하고자 할 때는 자바에서 제공하는 네트워크 객체들이 얼마나

고맙고 소중한지는 다른 언어를 이용해서 같은 기능을 구현하고자 해본 분들이라면

절실히 느끼실 것입니다. 만약 여러분이 Unix환경에서 C언어로 네트워크 프로그램을

해야하는 경우라면 상당히 많은 부분을 프로그래머인 여러분 스스로 해결해야 할 것입니다.

그리고 많은 부분을 해결해 낸 결과로 만들어진 코드는 만드는 어려움과 동시에

분석하는 것도 꽤 어렵습니다.

 

자바에서는 네트워크 프로그램을 하는데 있어서 필요한 것들을 적절한 패키에 객체로 모아

놓음으로써 더욱더 쉽고,간명하게 프로그램 할 수 있습니다.

여기서는 자바의 풍부한 네트워크 객체를 이용해서 가장 대표적인 네트워크 프로그램을

하나 만들어 보겠습니다.

네트워크를 이용하는 프로그램중에 가장 많이 구현되는 프로그램은 네트워크에 참여하는

당사자간에 서로의 파일을 주고 받는 것일 것입니다.

인터넷을 통해서 파일을 주고 받기 위해서 가장 많이 사용하는 것은  FTP입니다.

그리고 비교적 작은 파일은 Email을 이용해서 보낼 수도 있겠지요.

그리고 요즘 유행하는 메신저를 통해서도 파일을 주고 받을 수도 있습니다.

이런 파일을 주고 받을 수 있는 프로그램들간에 공통적인 내용은 네트워크를 이용한다는

것이고 다른 것은 서로가 다른 프로토콜을 이용한다는 것입니다.

클라이언트와 서버간에 어떻게 파일을 전송할 것인지에 대해서 클라이언트와 서버간에

규칙을 만들어 놓은후 클라이언트와 서버는 그 규칙을 준수하면서 동작합니다.

여기서는 인터넷을 통해서 파일을 주고 받을 수 있는 클라이언트와 서버를 만들텐데,

네트워크를 이용해서 정보를 주고 받기 위해서는 참여하는 클라이언트와 서버간에

지겨야할 규칙, 즉 프로토콜은 아주 간명하게 정할 것입니다.

 

여러분들이 많이 사용하는 인터넷을 통해서 파일을 주고 받는 프로그램들은 간편하기는

하지만 때로는 사용할 수 없는 경우가 생기기도 합니다.

현실적으로 인터넷을 통해 주고 받는 정보는 제 3자에게 노출될 수 있는데, 기업등에서

업무적으로 중요한 파일을 정기적으로 주고 받아야 한다면 더욱더 그렇습니다.

업무 파일을 주고 받은데 항상 사람이 관여할 수 도 없는 노릇이고, 파일을 받은 다음

실시간으로 특정한 일을 해야 하는 경우라면(받은 데이타 자료를 데이타베이스에 등록한다

던가 하는),그 업무에 적합하도록 암호화 채널을 통해 데이타를 받은 후 데이타를  데이타

베이스에 등록하는 부분을 가진 개별 프로그램으로 설계해야 합니다.

Email이나 메시진저를 통해서는 파일을 주고 받을 수 없습니다.

 

자바의 강력한 네트워크 객체에는 데이타를 암호화해서 주고 받을 수 있도록 하는

암호화 기능까지 추가할 수 있습니다. 이렇게 한다면 네트워크 프로그램의 가치가 한층

더 높아지겠지요. 그렇지 않습니까?

 

클라이언트와 서버간 파일전송 프로토콜

 

클라이언트가 서버로 파일을 보내기 위해서는 TCP 서비스를 받아야 합니다.

대량의 파일을 한 바이트도 빠뜨리지 않고, 데이타를 보낸 순서대로 도착해야하는 것이

파일을 이동시키는 것의 기본이므로 물어볼것도 없이 TCP기반의 네트워크 프로그램이

될 것입니다. TCP 기반의 네트워크 프로그램에서는 스트림을 통해서 데이터를 주고 받게

됩니다. 이제 클라이언트와 서버가 네트워크의 서비스를 TCP로 선택했으니 남은 것은

클라이언트와 서버가 파일을 주고 받기 위해서 지켜야 할 규칙,즉 프로토콜에 대해서

간명하게 정리하겠습니다.

 

파일전송 클라이언트 프로토콜

 

0. 클라이언트는 서버로 TCP 연결을 합니다.

   클라이언트는 서버가 서비스하고 있는 곳으로 TCP 연결을 합니다.

   서버의 IP주소와  TCP 포트번호를 알고 있어야 합니다.

 

1. 클라이언트는 서버로 자신의 정보 및 전송할 파일에 대한 정보를 보냅니다.

   클라이언트가 서버로 보내는 정보는 첫째 로그인 ID , 둘째 보내는 파일의 크기,

   세째 보내는 파일의 파일이름입니다.

   클라이언트는 이 세가지 정보를 100 bytes의 데이타로 만들어 보냅니다.

   로그인 ID 10 바이트, 파일의 크기 10 바이트, 파일이름 80 바이트로 구성합니다.

 

2. 클라이언트는 1.에서 서버로 보낸 정보에 대한 응답정보를 서버로 부터 받습니다.

   클라이언트는 자신이 보낸 세가지 정보를 서버가 읽고 서버가 나름대로 판단한 응답

   정보를 받습니다.   이 응답정보에는 응답코드와 응답메세지가 포함되는데,응답코드에

   따라 파일 송신을 계속 진행할 것인지 파일전송을 끝낼 것인지 결정합니다.

   응답코드가 "0000"이면 계속 진행하고, 그렇지 않으면 파일전송을 종료합니다.

   서버가 보낸 응답정보는 100 bytes의 데이타로 구성됩니다.

   응답코드 10 바이트, 파일의 크기 10 바이트, 응답메세지 80 바이트 입니다.

   파일의 크기 10 바이트 부분은 응답정보에서는 의미가 없습니다.

 

3. 클라이언트는 1.에서 보내기로 약속한 파일의 데이타를 서버로 보냅니다.

   클라이언트는 서버와 약속한 암호화 알고리듬,암호화 키,Initial Vector등을 이용해서

   통신 채널을 암호화 채널로 변환한후에 파일의 데이타를 읽어 네트워크로 보냅니다.

   클라이언트와 서버는 암호화 알고리듬, 암호화 키, Initial Vector OFFLINE으로

   이미 알고 있습니다.

   클라이언트와 서버간 주고 받는 데이타는  3.에서만 암호화 채널을 통합니다.

 

4. 클라이언트는 3.을 모두 마치후 서버로부터 확인 정보를 받습니다.

   클라이언트는 자신이 보낸 데이타를 서버가 읽고 서버가 나름대로 판단한 확인

   정보를 받습니다.   이 응답정보에는 응답코드,서버가 클라이언트로부터 받은 데이타

   의 크기,응답메세지가 포함되는데,응답코드에 따라 서버가 파일을 제대로 받았는지,

   그렇지 않았는지 알 수 있습니다.   응답코드가 "0000"이면 서버는 1.에서 클라이언트가

   보내기로 약속한 파일크기만큼 3.에서 데이타를 받았고,그렇지 않으면 1.에서 보내기로

   약속한 파일크기와는 다르게 데이터를 받았음을 의미합니다.

   확인정보는 응답코드 10 바이트, 서버가 클라이언트로 부터 받은 데이타의 크기 10

   바이트, 응답메세지 80 바이트, 100바이트로 이루어집니다.

 

5. 클라이언트는 4.에서 받은 확인정보에 대한 응답을 서버로 보냅니다.

   클라이언트는 4.에서 받은 확인정보중에 응답코드가 "0000"과 서버가 클라이언트로부터

   받은 데이타의 크기가 실제로 서버에게 보낸 데이타의 크기, 1.에서 서버로 보내기로

   알려준 파일의 크기가 같은 경우는 "0000"의 정상 응답코드를 포함한

   확인 응답정보를 보냅니다. 그외에는 정상 응답코드를 보내지 않고 기타 응답코드와

   응답메세지를 보냅니다.

   확인정보에 대한 응답정보는 응답코드 10 바이트와 Dummy 데이타 90 바이트,

   100 바이트로 이루어집니다.

 

6. 클라이언트는 TCP 연결을 해제합니다.

 

 

파일전송 서버 프로토콜

 

0. 서버는 클라이언트가 TCP 연결을 할 수 있도록 TCP포트로 LISTEN합니다.

1. 서버는 클라이언트의 정보 및 클라이언트가 전송할 파일에 대한 정보를 읽습니다.

   클라이언트가 서버로 보내는 정보는 첫째 로그인 ID , 둘째 보내는 파일의 크기,

   세째 보내는 파일의 파일이름입니다.

   클라이언트는 이 세가지 정보를 100 bytes의 데이타로 만들어 보냅니다.

   로그인 ID 10 바이트, 파일의 크기 10 바이트, 파일이름 80 바이트로 구성합니다.

 

2. 서버는 1.에서 클라이언트가 보낸 정보에 대한 응답정보를 클라이언트에 보냅니다.

   서버는 클라이언트가 보낸 세가지 정보를 읽고 서버가 가진 Configuration

   비교합니다. Configuration은 로그인ID별로 존재하는데, Configuration이 있는

   로그인 ID에게만 정상 응답코드를 부여합니다.

   응답정보에는 응답코드와 응답메세지가 포함되는데,응답코드가 정상을 의미하는

   "0000"이면 계속 진행하고, 그렇지 않으면 파일전송을 종료합니다.

   서버가 보내는 응답정보는 100 bytes의 데이타로 구성됩니다.

   응답코드 10 바이트, 파일의 크기 10 바이트, 응답메세지 80 바이트 입니다.

   파일의 크기 10 바이트 부분은 응답정보에서는 의미가 없습니다.

 

3. 서버는 1.에서 클라이언트가 보내기로 약속한 파일의 데이타를 읽습니다.

   서버는 로그인별로 존재한는 Configuration에서 클라이언트와 약속한 암호화 알고리듬,

   암호화 키,Initial Vector등을 이용해서 통신 채널을 암호화 채널로 변환한후에 네트워크

   로부터 데이타를 읽어 파일로 저장합니다.

   클라이언트와 서버는 암호화 알고리듬, 암호화 키, Initial Vector OFFLINE으로

   이미 알고 있습니다.

   클라이언트와 서버간 주고 받는 데이타는  3.에서만 암호화 채널을 통합니다.

 

4. 서버는 3.을 모두 마치후 클라이언트에게 확인 정보를 보냅니다.

   서버는 자신이 받은 데이타의 크기가 1.에서 클라이언트가 보내기로 약속한 데이타의

   크기와 같은지 판단합니다. 만약 클라이언트가 보내기록 약속한 데이타의 크기와

 실제 서버가 읽은 데이타의 크기가 같다면, 응답정보를 정상의 응답코드, 실제 받은

   데이타의 크기와 응답메세지로 구성합니다.

   응답코드가 "0000"이면 서버가 1.에서 클라이언트가  보내기로 약속한 파일크기만큼

   데이타를 받았고,그렇지 않으면 보내기로 약속한 파일크기와는 다르게 데이터를

   받았음을 의미합니다.

   확인정보는 응답코드 10 바이트, 서버가 클라이언트로 부터 받은 데이타의 크기 10

   바이트, 응답메세지 80 바이트, 100바이트로 이루어집니다.

 

5. 서버는 4.에서 클라이언트로 보낸 확인정보에 대한 응답을 받습니다.

   서버는 4.에서 보낸 확인정보중에 응답코드가 "0000"인것에 대해서 클라이언트로부터

   확인을 받고자 합니다. , 실제 서버가 받은 데이타의 크기를 클라이언트에게 알려

   줌으로써 클라이언트가 보낸 실제 데이타와 비교를 하고 싶기 때문입니다.

 클라이언트로 부터 받은 확인응답정보의 응답코드가  "0000"은 실제로 클라이언트가

   서버에게 보낸 데이타의 크기가 서버가 받은 데이타의 크기와 같다고 확인하는 의미

   입니다. 확인응답정보의 응답코드가 "0000"이면 서버는 받은 파일을 보관하고,

   확인응답정보의 응답코드가 "0000"이 아니면 클라이언트가 보내려고 한 파일과

   다르다고 가정하고 받은 파일을 삭제합니다.

   확인정보에 대한 응답정보는 응답코드 10 바이트와 Dummy 데이타 90 바이트,

   100 바이트로 이루어집니다.

 

암호화 알고리듬

 

클라이언트와 서버가 안전한 데이타를 주고 받기 위해서 암호화 채널을 사용합니다.

 

기본적으로 파일을 보내는 클라이언트는 보내어야할 파일 데이타를 파일 스트림에서 읽어서

네트워크 스트림으로 씁니다.

만약 이때 네트워크 스트림으로 쓰는 모든 데이타가 자동으로 암호화(Encrypt)된다면

어떨까요? 반대로 파일을 받는 서버는 네트워크 스트림으로부터 데이타를 읽어서 파일

스트림으로 씁니다. 이때도 네트워크 스트림으로 읽은 데이타가 자동으로 복호화(Decrypt) 된다면 어떨까요? 그렇다면 네트워크 구간을 통과하는 모든 데이타가 암호화 된채로

이동한 셈입니다. 암호화 채널을 사용해서 데이타를 읽고,쓴 셈입니다.

 

자바에는 일반 스트림에 암호화 엔진을 결합하여 일반 스트림을 암호화 스트림으로 구성할

수 있는 강력한 기능이 있습니다.

여기서 구성할 파일전송 클라이언트와 서버는 암호화 스트림을 사용해서 파일 데이타를

읽고,쓸 것입니다.

일반 스트림을 암호화 스트림으로 구성하려면 우선 일반스트림과 결합 할 수 있는  암호화

엔진을 만들어야 하는데, 자바에서는 매우 쉽습니다.

여기서 가장 유명한 대칭키 알고리듬인 DES알고리듬을 이용하는 암호화 엔진을 사용합니다.

Posted by
,