인터넷 뱅킹? 윈도우 뱅킹?
나는 신한은행과 우리은행에 계좌를 가지고 있고, 두 계좌 모두 인터넷으로 은행업무를 볼 수 있도록 인터넷 뱅킹을 신청해두었다. 그런데 과연 내가 사용하는 이 서비스를 인터넷 뱅킹이라고 부를 수 있을까? 내 매킨토시는 분명 인터넷이 잘 됨에도 불구하고 Internet Explore 가 아니라는 이유로 인터넷 뱅킹을 사용할 수 없다. 또한 데스크탑으로 사용하고 있는 Microsoft Windows Vista Home Premium 64bit Edition 에서는 Internet Explorer 를 사용하고 있음에도 불구하고 64bit 버젼라는 이유로 인터넷 뱅킹을 사용할 수 없다.
그런데 도대체 뭐가 문제길래 인터넷 뱅킹을 사용하려면 32bit 용 Microsoft Windows 와 Internet Explorer 를 사용해야만 하는거지?
인터넷 뱅킹과 보안
인터넷 뱅킹을 사용하기 위해 은행의 홈페이지에 접속하면 보안을 목적으로 수 십개의 프로그램을 설치한다. 보안을 위해 설치해야한다고, 보안을 위해 이 프로그램들이 없으면 안된다고 얘기하고 있지만 이 프로그램들이 뭘 하기 위해 필요한걸까?
인터넷은 특정 호스트에서 다른 호스트로 데이터가 직접 전송되는 것이 아니라 중간에 여러 호스트를 거쳐서 데이터가 전송되도록 설계되어 있고, 인터넷을 통해 은행 업무를 보려면 내 계좌번호라거나 아이디, 비밀번호, 계좌잔액 등 민감할 수 있는 개인 정보들을 다른 호스트로 전송해야만 한다.
좀 전에 얘기했듯이 데이터가 직접 전송되는 것이 아니라 다른 곳을 거쳐서 전송되기 때문에 중간에 데이터를 가로채기 당할 수 있는 문제가 있고, 또 데이터가 위/변조 될 가능성도 배제시킬 수 없다.
그런 문제를 피해가기 위해 우리는 보안 채널(Secure Channel) 을 통해 데이타를 교환해야만 하는 것이다. 이제부터 아주 간단한 보안 채널을 살펴보도록 하자.
공개키 / 비밀키
보안 채널에 얘기하기에 앞서 공개키/비밀키 에 관련된 것을 조금 알아보도록 하자.
(m*p)+q=m
(m*q)+p=m
어떤 큰 소수 p 와 q, 그리고 연산자 * 과 + 가 있으며 (여기서 *, + 는 곱하기와 더하기가 아님을 잊지말자.) 이 두 소수와 연산자는 위 식을 언제나 만족시키고, * 연산을 역으로 적용하는 것은 연산량이 엄청나기 때문에 불가능하다고 가장하자. [1]
이제 어떤 메시지 m 을 p 와 * 연산을 시켜준 뒤 전송하게 되면 q 없이는 원본메시지 m 을 알 수가 없게 된다. 이런 수학적 테크닉을 이용하는 것이 공개키/비밀키 알고리즘이다.
거꾸로 자신의 비밀키를 이용해서 특정 메시지를 암호화 하고, 공개되어 있는 키를 통해 암호화된 메시지를 풀어보도록 함으로써 자기 자신이 그 메시지를 보냈다는 것을 증명하는 수단으로 사용할 수도 있다.2
보안채널
이제는 위의 공개키/비밀키를 이용해서 보안 채널을 어떻게 구성할 수 있는지 알아보자.
[다이아그램]
간단하게 A와 B 가 위와 같은 채널을 통해 메시지를 주고 받는다고 생각해보자. 이런 상황에서는 아래서와 같이 C 가 메시지를 엿듣거나 A 나 B 를 사칭해서 메시지를 보내는 것이 가능하게 된다.
[다이아그램]
그렇다면 채널을 조금 개선해보자. 우선 A 는 B 에게 자신의 공개키 pub(A) 를 전송해주고, 이후에 B 는 메시지 m 을 보내는 것이 아니라 pub(A)*m 을 보내기로 해보자 .
A 는 자신의 비밀키 pri(A) 를 이용해서 pub(A)*m+pri(A) 연산을 하게 되고 메시지 m 을 얻을 수 있다. 하지만 C 는 pri(A) 를 가지고 있지 못하기 때문에 pub(A)*m 에서 m 을 알아낼 수 없게 된다. 이로인해 C 가 A 로 가는 메시지를 엿듣는 것은 불가능해졌다.
하지만 여전히 B 인척하며 메시지를 보내는 것은 가능하기 때문에 조금 더 개선해서 아래와 같은 방법을 사용해보자.
A 는 B 에게 pub(A) 를 보냄
B 는 A 에게 pub(B)*pub(A) 를 보냄
B 는 A 에게 pri(B)*RandomNumber 를 보냄
위의 과정을 통해 A는 pub(B), RandomNumber, B 는 pub(A), RandomNumber, C 는 pub(A) 를 알게 된다. (이제부터 RandomNumber 은 R 로 표기)
이후 메시지는 다음과 같이 전송된다. hash(m,R) 는 R 을 이용해서 메시지의 임의 위치에 상대방의 공개키를 삽입하는 함수라고 생각하자.
A->B: pub(B)*hash(m,R)
B->A: pub(A)*hash(m,R)
A 는 B 에게서 메시지를 받은 뒤 R 값을 이용해서 pub’(A) 와 m 을 구해낼 수 있게 된다. 구해낸 pub’(A) 와 자신의 pub(A) 를 비교해서 만약 동일하다면 B 에게서 메시지가 온 것이라고 판단할 수 있지만 C 는 R 을 모르기 때문에 더이상 B 를 사칭할 수 없다.
이는 보안 채널을 제공하는 방법을 아주 간단하게 표현해본 것이며, 실제 많이 사용되고 있는 SSL 등은 위에서 말한 과는 조금 다른 방식을 사용하고 있다. 하지만 기본 아이디어는 대체적으로 비슷하다고 보면 된다.
우리나라의 인터넷 뱅킹
우리나라에서 사용하고 있는 인터넷 뱅킹 또한 위에서 알아본 내용들과 크게 다르지 않다. 그렇다면 무엇이 문제일까?
[다이아그램]
현재 우리나라의 인터넷 뱅킹 사이트를 살펴보면 보안 채널을 구성하는데 위와 같이 플러그인 기술을 사용하고 있다. INISafeWeb 이라거나 XecureWeb 같은 플러그인이 바로 그것이다.
문제는 저 플러그인들이 MS Windows 에서 돌아가는 Internet Explorer 용으로만 제공되고 있다는 점이며, 이를 대체할 수 있는 범용 기술이 이미 존재하는 상황이다.
HTTP over SSL
HTTP over SSL (이하 HTTPS) 는 위에서 설명한 공개키 / 비밀키에 기반한 보안 채널 하에서 동작하는 Hyper Text Transper Protocol 이다.
HTTPS 는 이미 표준화가 되어 있는 상태이고, apache, firefox, safari, internet explorer, opera 등 널리 쓰이고 있는 브라우져와 웹서버에 이미 구현되어 있으므로 따로 플러그인을 설치해야할 필요가 없으며, Mac OS X, Linux 등에서도 문제 없이 사용할 수 있다.
게다가 HTTPS 로 서비스를 제공하게 되면 암호화/복호화 과정은 브라우져와 서버가 알아서 처리해주기 때문에 사용하기도 간단하다.
우리가 가야할 길
아쉽게도 우리나라에서 제공하고 있는 인터넷 뱅킹은 위에서 얘기하고 있는 보안 채널을 제공하는 것으로 끝나는 것이 아니고, 자신의 비밀키(공인인증서) 를 이용해서 자신을 증명할 수 있는 기능을 추가로 사용하고 있다.
랜덤 텍스트를 자신의 비밀키로 암호화 한 뒤 이를 인터넷 뱅킹 사이트 등으로 전송해주는 것으로 자기 자신을 증명하는 것이 그것인데, 아쉽게도 이는 이미 구현되어 있는 범용 표준이 존재하지 않는다.
하지만 INISafeWeb 이나 XecureWeb 등이 아닌 HTTPS 를 통한 보안 채널을 제공하는 것 만으로도 Internet Explorer 이 아닌 더 나아가 MS Windows 가 아닌 다른 곳에서도 잔액 확인 등의 기본적인 작업들은 할 수 있게 되며, 플러그인 을 통해 구현해야될 내용이 ‘자신의 비밀키를 통해 특정 텍스트를 암호화 해서 form 에 추가’3 해주는 정도의 간단한 작업이기 때문에 구현이 간단해진다. 그로 인해 다른 브라우져 혹은 다른 플랫폼을 위한 플러그인을 제공하는 것이 더욱 쉬워질 것이라고 생각된다.
… 여기서 부터 조금만 더 정리하면 …
[1] 이 내용은 RSA 나 DSA 등의 설명을 읽어보면 수학적으로 자세하게 설명되어 있다. 하지만 매우 복잡하기 때문에 여기서는 언급하질 않았다.
[2] pgp 등이 위에서 얘기한 방식을 사용한다.
[3] 간단히 예를 들어 인터넷 뱅킹 사이트에서 ‘너누구지?’ 란 문자열을 키로 넘겨줬다고 하자.
그렇다면 난 내 비밀키로 ‘너누구지?’ 란 문자열을 암호화해서 돌려주게 되고, 그걸 받은 측에서는 이미 공개되어 있는 내 공개키를 이용해서 내가 보낸 문자열을 해독하게 된다.
만약 해독된 내용과 자신이 요구했던 내용이 동일하다면 나 자신임을 입증되게된다.
실제로는 이보다 복잡하겠지만 대체로 아이디어는 비슷하다고 보며 된다.






Standard Magazine