보안 · 5 min read · Jan 06, 2026
상호 인증으로 피싱 방지하기
상호 인증으로 피싱 방지하기
피싱은 본질적으로 중간자 공격입니다. 사용자는 사회 공학이나 DNS 캐시 오염과 같은 방법으로 사기 사이트로 잘못 안내됩니다. 사용자가 SSL 인증서를 검증하는 방법을 이해하지 못하기 때문에(누가 이해하겠습니까?), 이 속임수는 너무 자주 통합니다. 확장 검증 인증서와 같은 노력은 일관되지 않은 시각적 도구에 의존하고 강력한 암호화에 의존하지 않기 때문에 많은 경우 실패할 수밖에 없습니다. 일회용 비밀번호만으로도 실시간 MITM 공격에 취약한 것으로 입증되었습니다. 피싱을 일관되게 방지하려면 강력한 상호 인증이 필요합니다 - 사용자에게 호스트를 검증하고 호스트에게 사용자를 검증하는 것입니다.
이 문서에서는 WiKID의 오픈 소스 일회용 비밀번호 및 상호 인증 시스템과 함께 작동하도록 JSP 애플리케이션을 구성할 것입니다. 작동 방식은 다음과 같습니다: 사용자가 대상 사이트에 로그인하려고 할 때 WiKID 토큰 클라이언트를 시작하고 PIN을 입력합니다. PIN은 서버의 공개 키로 암호화되어 서버로 전송됩니다. PIN이 올바르고 암호화가 유효하며 계정이 활성화되면 OTP 패키지, 대상 사이트 URL 및 대상 사이트의 SSL 인증서 해시가 토큰 클라이언트로 전송됩니다. 토큰 클라이언트는 사용자의 인터넷 연결을 통해 대상 사이트 URL로 나가 SSL 인증서를 가져오고 이를 해시하여 검증된 인증서 해시와 비교합니다. 두 해시가 일치하면 토큰 클라이언트는 OTP를 제시하고(지원되는 플랫폼에서) 사용자를 위해 사이트로 기본 브라우저를 실행합니다.
먼저 WiKID 서버에 애플리케이션용 도메인을 추가한 다음 JSP 페이지용 네트워크 클라이언트를 생성합니다. WiKID의 로그인 코드를 JSP 페이지에 추가한 후 토큰 클라이언트에서 테스트합니다.
WiKID 서버에 도메인 추가하기
이것은 꽤 쉽습니다. WiKID 서버 웹 관리 인터페이스에서 도메인 탭을 클릭하고 새 도메인 만들기를 클릭합니다. 게이트웨이의 도메인 이름과 장치 이름을 입력합니다. 장치 이름은 WiKID 토큰에 표시됩니다. 등록된 URL 상자에 대상 서버의 JSP 페이지 URL을 입력합니다. 도메인이 생성되면 WiKID 서버는 웹 서버에서 인증서를 가져오므로 ‘https:’를 입력해야 합니다. 서버 코드는 WiKID 서버의 라우팅 가능한 제로 패딩 IP 주소입니다(예: 10.1.1.1 = 010001001001). 나머지 매개변수는 필요에 따라 설정하십시오. 더 긴 PIN이 수학적으로 보안을 증가시킬 수 있지만, 4자리 PIN이 더 나을 수 있습니다: 사용자가 ATM PIN을 사용하면 이를 보호할 가능성이 더 높습니다.

네트워크 클라이언트 생성하기
도메인 정보를 저장한 후 네트워크 클라이언트 탭을 클릭하고 새 네트워크 클라이언트 만들기를 클릭합니다. 이 클라이언트의 이름과 내부 네트워크의 대상 서버 IP 주소를 입력합니다. 프로토콜로 wAuth를 선택한 다음 위에서 생성한 도메인을 선택합니다.

추가를 클릭하여 다음 페이지로 이동하고 대상 서버의 p12 인증서 정보를 입력합니다. JSP 서버와 WiKID 서버 간의 통신은 이 p12 파일을 사용하여 SSL로 암호화됩니다. 이 p12 파일에 대한 비밀번호를 두 번 입력하고 구성 과정에서 서버 인증서에 사용한 비밀번호를 입력합니다. 네트워크 클라이언트 페이지로 돌아가면 새 네트워크 클라이언트가 나열되고 p12 파일을 다운로드할 수 있는 링크가 표시됩니다. p12 파일 다운로드를 클릭하고 JSP 코드와 동일한 디렉토리에 JSP 서버에 넣습니다.

JSP 페이지 구성하기
JSP 서버에서 WiKID 서버에서 생성된 p12 파일, WiKID 자바 네트워크 클라이언트 jar (Wikid.jar) 파일(우리 웹사이트 또는 Sourceforge 사이트에서 제공됨), 그리고 JSP 페이지가 필요합니다. 또한 Java 버전 1.4.2_06 이상을 실행해야 합니다. 각 네트워크 클라이언트 패키지에는 예제 페이지가 포함되어 있습니다. 여기서는 example.jsp 페이지를 편집할 것입니다. 이 페이지에는 새 사용자를 프로그래밍 방식으로 추가하는 코드도 포함되어 있습니다.
가장 좋아하는 편집기에서 JSP 페이지를 엽니다:
먼저 WiKID 클라이언트를 가져옵니다:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="com.wikidsystems.client.*" %> 이 섹션은 네트워크 클라이언트 애플리케이션과 WiKID 서버 간의 연결을 인스턴스화합니다. 이를 성공적으로 수행하려면 네트워크 클라이언트가 WiKID 서버에서 인증서를 발급받아야 합니다. 인증서는 PKCS12 인증서 저장소에 포함되어 있으며 액세스하려면 비밀번호가 필요합니다. caStore는 이 클라이언트로 연결할 WiKID 서버의 인증서를 포함하는 Java 키 저장소입니다. 이는 /opt/WiKID/private/CACertStore에서 WAS에서 복사할 수 있습니다. caStorePass는 caStore를 열기 위한 비밀번호입니다.
wClient 객체가 인스턴스화되면 인증서를 로드하고 지속적인 인증된 SSL 연결을 설정합니다. 이는 일반적으로 서버 또는 애플리케이션당 한 번 수행되며 여러 스레드에서 공유됩니다. 이 예제에서는 페이지 요청마다 객체가 생성되고 파괴됩니다. 이는 프로세스의 오버헤드를 크게(1000배) 증가시키지만 이 단일 예제 페이지에서 모든 기능을 보여줄 수 있습니다.
매개변수는 다음과 같습니다:
- wClient(String host, int port, String keyfile, String pass)
- host = WIKID 서버의 IP 주소
- port = 연결할 TCP 포트 번호(기본값 8388)
- keyfile = PKCS12 인증서 파일의 경로
- pass = PKCS12 파일을 열기 위한 비밀번호
- caStore - WAS 서버 인증서를 검증하기 위한 인증 기관 저장소, WiKID 서버에서 다운로드합니다 (opt/WiKID/private/CACertStore <– Java의 cacerts 파일을 사용하지 마십시오)
- caStorePass - caStore 파일을 보호하는 비밀번호
<% String status="";
String chall="";
wClient wc = new wClient("192.168.0.1",
8388,
"/opt/tomcat/webapps/example/Token_test_client.p12",
"yourpassphrase",
"/opt/tomcat/webapps/example/CACertStore",
"yourpassphrase");
%> 온라인 로그인
이 기능은 사용자의 정상 상태 로그인입니다. 사용자의 장치가 네트워크에 연결되어 액세스를 위한 패스코드를 직접 요청할 수 있을 때 호출됩니다.
매개변수는 다음과 같습니다:
- CheckCredentials(String user, String passcode, String servercode)
- user = 자격 증명을 검증할 사용자 ID
- passcode = 시간 제한이 있는 1회용 패스코드
- servercode = WiKID 서버에서 생성된 12자리 코드, 이 경우 333344445555
이 메서드는 성공적인 인증 또는 실패한 인증을 나타내는 부울 값을 반환합니다.
<%
boolean isValid = false;
if(request.getParameter("action") != null && request.getParameter("action").equalsIgnoreCase("Check Online")){
isValid = wc.CheckCredentials(request.getParameter("user"), request.getParameter("passcode"), request.getParameter("servercode"));
if (isValid){
status="성공";
} else {
status="인증 실패";
}
}
%> 그리고 여기에 양식의 HTML이 있습니다:
온라인 로그인:
토큰 클라이언트로 테스트하기
아직 다운로드하지 않았다면 WiKID 오픈 소스 토큰 클라이언트의 복사본을 다운로드할 수 있습니다. 플랫폼에 따라 ‘run.sh’ 또는 ‘run.bat’로 토큰을 시작합니다. 토큰 클라이언트를 처음 실행할 때 비밀번호를 생성해야 합니다. 시작되면 작업을 선택하고 새 도메인 만들기를 선택합니다.

12자리 도메인 식별자를 입력하면 공개 키가 WiKID 서버로 전송됩니다. PIN을 입력하라는 메시지가 표시됩니다.

WiKID 서버는 PIN을 저장하고 등록 코드를 반환합니다.

이 시점에서 WiKID 서버에 계정이 생성되었지만 활성화되지 않았습니다. 기존의 신뢰할 수 있는 자격 증명이나 비공식 메커니즘을 기반으로 사용자를 위한 셀프 서비스 등록 페이지를 생성할 수 있지만, 이 경우 WiKID 서버에서 사용자를 수동으로 검증할 것입니다. WiKIDAdmin 웹 인터페이스에서 사용자를 클릭하고 사용자 수동 검증을 클릭합니다. 등록 코드를 클릭하고 사용자 이름을 입력합니다.

이제 토큰 클라이언트에서 생성한 도메인을 선택하고 PIN을 입력합니다. 일회용 패스코드를 받아야 하며(클립보드에 복사되어야 함) 브라우저가 등록된 URL로 실행되어야 합니다.
일회용 패스코드를 사용자 인증에 결합하고 호스트 인증서의 내장 검증 및 브라우저 자동 실행을 통해 사용자가 쉽게 사용할 수 있으면서도 암호학적으로 안전한 시스템을 만들었습니다. 토큰 클라이언트는 공개 키 암호화를 사용하여 보안 저하 없이 여러 도메인 관계를 처리할 수 있으며, 서버는 여러 네트워크 클라이언트 관계를 관리할 수 있습니다. Ruby, PHP, Python 및 ASP/COM/.NET에 대한 추가 네트워크 클라이언트 예제가 제공됩니다. Apache 또는 IIS는 Radius 또는 LDAP를 사용하여 구성할 수도 있습니다.
이 프로세스를 (익명으로) http://www.wikidsystems.com/signup/example.jsp에서 테스트할 수 있습니다.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.