NHN Business Platform 회원플랫폼개발랩 나윤재

로그인 과정에서 주로 사용하는 인증 방식은 아이디와 비밀번호를 입력하여 시스템 사용 권한을 확인하고 접근 권한을 부여하는 것입니다. 하지만 이런 방식은 스니핑(sniffing) 또는 키 로깅 등을 이용한 공격 방법에 의해 인증 정보가 쉽게 노출될 수 있다는 취약점이 있습니다. 이미 노출된 아이디, 비밀번호로 인해 개인 정보 유출이나 아이디 도용 등의 피해를 입기도 합니다.

이런 피해를 줄이기 위해 주요 온라인 사이트에서는 지식 기반(아이디, 비밀번호) 인증에 소유 기반(보안카드, OTP 등) 인증을 추가한 2차 인증을 도입하고 있습니다. 소유 기반 인증은 사용자가 인증 요소를 소유하고 있어야 인증이 가능한 방식으로 보안카드, 하드웨어 방식의 OTP(One Time Password), 공인인증서 등이 주로 사용됩니다. 최근에는 스마트폰 사용자가 증가하면서 USIM(Universal Subscriber Identity Module) 기반 또는 VM(Virtual Machine) 기반의 모바일 OTP를 이용한 인증 서비스가 사용되고 있습니다.

이 글에서는 OTP의 생성 방식 및 2차 인증 적용 사례를 소개하겠습니다.

다양한 OTP 생성 방식

OTP 생성 방식은 시도 응답(challenge-response) 방식, 시간 동기화(time-synchronous) 방식, 이벤트 동기화(event-synchronous) 방식, 시간-이벤트 동기화(time-event synchronous) 방식으로 나눌 수 있다. 각 방식의 장단점을 살펴보자.

시도 응답 방식

서버가 제시하는 시도 값을 사용자가 알고리즘에 입력해 출력되는 값을 얻고 이를 응답 값으로 서버에 전송하여 자신을 인증하는 방식이다. 온라인 이체 시 사용하는 보안카드 숫자 입력이 시도 응답 방식의 대표적 예다. 즉, 서버가 임의의 난수를 생성하여 사용자에게 전송하면 사용자는 해당 시도 값을 OTP 토큰에 입력해 그 결과로 얻은 OTP를 다시 입력하는 방식이다.

시도 응답 방식은 입력 값이 매번 임의의 값이 된다는 측면에서는 안전성을 갖추고 있으나, 네트워크 모니터링에 의해 전송되는 값이 노출될 수 있다는 단점이 있다. 또 서버와 클라이언트 사이의 통신 횟수도 비교적 많이 요구된다.

다음은 시도 응답 방식의 인증 과정을 나타낸 것이다.

11b793af9a96e0cf1e916eeed1cc2bbd.png

그림 1
시도 응답 방식

  1. 시도 값 생성
  2. 생성된 시도 값 전달
  3. 시도 값을 이용해서 OTP 생성
  4. 생성된 OTP 입력
  5. OTP 인증 서버로 검증 요청
  6. 시도 값을 이용해서 OTP 생성 및 검증
  7. OTP 검증 결과 전송

시간 동기화 방식

시도 응답 방식은 사용자의 입력 값이 많다는 단점이 있다. 시간 동기화 방식은 이 문제를 개선하기 위해 임의의 난수 대신에 시간 값을 입력 값으로 사용해 OTP를 생성한다.

서버와 OTP 토큰 간에 동기화된 시간을 기준으로 특정 시간 간격마다 변하는 OTP를 생성한다. 하지만 특정 시간 간격마다 OTP가 변하기 때문에 OTP를 입력하는 도중에 다른 값이 생성되어 OTP가 변경되는 단점이 있다. 이러한 단점 때문에 시간 간격을 길게 설정하면 공격자가 중간에 OTP를 알아채 사용할 가능성이 커지게 되는 또 다른 문제점도 생길 수 있다. 시간 동기가 어긋나면 인증이 실패할 수 있으므로 추가적으로 OTP 토큰과 서버 간의 시간 동기를 맞추는 알고리즘도 필요하다.

시간 동기화 방식은 OTP가 노출되더라도 사용 시간을 제약하거나 동일 OTP값을 사용하지 못 하도록 제약할 수 있다. 하지만 특정 시간 동안 값을 입력하지 못하면 중간에 OTP값이 변경되어 다시 입력해야 한다.

다음은 시간 동기화 방식의 인증 과정을 나타낸 것이다.

1cfb6df46432e8452828a73de2482133.png

그림 2 시간 동기화 방식

  1. OTP 토큰 내부의 자체 시간 정보를 이용해서 OTP 생성
  2. 생성된 OTP값 입력
  3. OTP 검증 서버로 검증요청
  4. 서버의 자체 시간 정보를 이용해서 OTP 생성 및 검증
  5. OTP 검증 결과를 전송

이벤트 동기화 방식

이벤트 동기화 방식은 서버와 OTP 토큰이 동기화된 시간 대신에 동일한 카운트 값을 기준으로 비밀번호를 생성한다. 사용자가 OTP를 생성할 때 카운트 값을 OTP 알고리즘의 입력 값으로 사용하여 OTP를 생성하고, OTP를 생성한 후에는 카운트 값을 증가시켜서 저장해 두었다가 다음 번에 사용한다.

이 방식은 인증 실패 시 재시도를 위해 특정 시간을 기다릴 필요가 없지만, OTP 토큰에서 OTP만 여러 번 생성하고 해당 OTP를 서버에 입력하지 않으면 OTP 토큰과 서버 간의 카운트 값이 달라져 OTP 토큰을 다시 초기화해야 하는 단점이 있다.

다음은 이벤트 동기화 방식의 인증 과정을 나타낸 것이다.

41d2f8f0648c28948e35b7edeed89ec7.png

그림 3 이벤트 동기화 방식

  1. 토큰 내부의 이벤트 정보를 이용해서 OTP 생성
  2. 생성된 OTP값 입력
  3. OTP 인증 서버로 검증요청
  4. 서버의 자체 이벤트 정보를 이용해서 OTP 생성 및 검증
  5. OTP 검증 결과를 전송

시간-이벤트 동기화 방식

시간 동기화와 이벤트 동기화 방식의 단점을 보완하기 위해서 두 가지 방식을 조합한 OTP 생성 방식이다. 시간-이벤트 동기화 방식은 OTP 생성 입력 값으로 시간 값과 카운터 값을 모두 사용한다.

시간 동기화와 같이 특정 시간 간격마다 비밀번호를 새로 생성하며, 같은 시간 내에 OTP 생성 요청이 여러 번 발생하면 카운트 값을 증가시켜 새로운 OTP를 생성한다. 동일한 시간 간격 내에서도 새로운 OTP를 생성할 수 있으므로 OTP의 일회성을 높여 안전성이 뛰어나다.

다음은 시간-이벤트 동기화 방식의 인증 과정을 나타낸 것이다.

7b0e45a83496e5ee5de97a741e4a4fd1.png

그림 4 시간-이벤트 동기화 방식

  1. OTP 토큰 내부의 자체 시간 정보와 이벤트 정보를 이용해서 OTP 생성
  2. 생성된 OTP값 입력
  3. OTP 인증 서버로 검증 요청
  4. 서버의 자체의 시간 정보와 이벤트 정보를 이용해서 OTP 생성 및 검증
  5. OTP 검증 결과를 전송

2차 인증 적용 사례

OTP 방식의 2차 인증을 제공하고 있는 주요 온라인 사이트의 사례는 다음과 같다.

Google의 2차 인증

Google은 휴대폰 SMS(Short Message Service)와 음성 통화로 인증 코드를 제공하는 방법으로 2차 인증을 제공한다. 로그인 후 계정 > 보안 > 2단계 인증에서 신청할 수 있다. 로그인할 때마다 2차 인증을 물어 보는 불편함을 줄이려면 이 컴퓨터를 신뢰함을 선택하여 동일 브라우저에서 로그인 시 2차 인증을 생략할 수 있다.

휴대전화를 사용할 수 없는 경우를 대비해 미리 백업 인증 코드 10개를 제공하며, 각 코드는 한 번씩만 사용할 수 있다. 백업 인증 코드가 부족하면 새 백업 코드를 생성한다. 브라우저 외부에서 작동하는 일부 애플리케이션에서 2차 인증이 지원되지 않아 인증 코드를 요청할 수 없을 때는 애플리케이션 비밀번호를 생성하여 사용해야 한다.

Facebook의 2차 인증

Facebook은 SMS로 보안 코드를 전달받아 로그인하는 형태의 2차 인증을 제공한다. 로그인 후 계정 설정 > 보안 > 로그인 승인에서 신청할 수 있다. Google과 마찬가지로 ‘인증된 기기’를 등록하면 동일 브라우저에서 로그인 시 2차 인증을 생략할 수 있다. 로그인 승인 기능을 활성화할 때는 기기 등록이 필수이다.

Facebook은 앱에서 ‘코드 생성기’를 제공하므로 SMS를 받을 수 없거나 인터넷을 이용할 수 없을 때에도 인증 코드를 제공받아 로그인할 수 있다. Facebook 앱의 코드 생성기를 사용하려면 Facebook 앱에 로그인된 상태여야 한다.

c26388845f0a055eeecadb2903e8f70a.png

그림 5 Facebook의 코드 생성기

Facebook의 인증은 SMS의 보안 코드나 코드 생성기의 인증 코드 중 하나를 선택해 로그인할 수 있다는 점에서 Google과 다르다. 일부 Facebook 앱, Jabber, 스카이프, Xbox에서는 계정 비밀번호 대신 앱 비밀번호를 사용해 로그인한다.

네이버의 2차 인증

네이버도 2012년부터 네이버 OTP를 이용한 2차 인증을 제공하고 있다. 로그인 후 내정보 > 내정보보호 > OTP에서 신청할 수 있다.

네이버 OTP는 스마트폰(Android, iPhone)에 설치된 네이버앱의 설정 > 네이버 OTP에서 확인할 수 있다. 일련번호가 생성되는 시점에 인증 서버와 키 교환이 필요하기 때문에 반드시 인터넷에 접속되어 있어야 하지만, 일련번호를 발급 받은 후에는 인터넷 접속 없이도 OTP 인증 번호를 확인할 수 있다.

8a16b56a7e9e7a3752411ad15d417e4d.png

그림 6 네이버의 OTP

네이버 OTP는 시간-이벤트 동기화 방식으로 구현되어 있다. 특정 시간 동안 인증 번호가 유효하며, 뒤로 가기 후 다시 OTP 메뉴로 재진입하는 이벤트를 통해 새로운 인증 번호를 사용할 수도 있다.

네이버 OTP는 Facebook의 코드 생성기와는 달리 별도의 OTP 일련번호가 존재하여 여러 아이디에 사용할 수 있으며, 타 서비스에도 적용할 수 있게 되어 있다.

Google, Facebook과 마찬가지로 로그인 시에 OTP 상태유지와 애플리케이션 비밀번호를 제공하고 있다.

Google, Facebook과 마찬가지로 로그인 시에 OTP 인증 유지를 선택하면 동일 브라우저에서 로그인 시 2차 인증을 생략할 수 있다. 아웃룩, 스마트TV 등 네이버 OTP 인증번호를 입력할 수 없는 환경을 위해서 애플리케이션 비밀번호를 제공하고 있다.

네이버는 OTP의 불편함을 느끼는 사용자를 위해 일회용 로그인 번호를 이용한 인증을 추가로 제공하고 있다.

e28bef76d426078b2a130cfc2cf0fb66.png

그림 7 네이버의 일회용 로그인 번호

네이버 앱에서 로그인된 아이디의 일회용 로그인 번호를 생성하고, 이를 통해 아이디, 비밀번호를 입력하지 않고도 로그인할 수 있다. 이 방식은 일회용 로그인 번호를 입력해 로그인하므로 공격자에게 아이디, 비밀번호가 노출되지 않고 안전하게 로그인할 수 있다는 장점이 있다.

마치며

2012년 초, ZDNet에 Google의 QR코드 로그인에 관한 기사가 실린 적이 있다. 이 방법은 사용자가 브라우저에 특정 URL을 입력하여 QR코드를 생성하고, 로그인된 스마트폰의 QR코드 리더를 통해 이를 인식하여 해당 브라우저에 로그인하는 기능이다. 아직까지 실 서비스에 적용되지 않았지만, 빠르고 쉽게 로그인할 수 있다는 점에선 좋은 시도였다. 앞서 소개한 네이버의 일회용 로그인 번호도 아이디, 비밀번호와 같은 인증 정보를 직접 입력하지 않고 로그인할 수 있다는 점에선 QR코드 로그인과 유사하다고 할 수 있다.

현재까지 2차 인증은 OTP 기반으로 제공되고 있지만, 앞으로의 2차 인증은 본인이 신뢰할 수 있는 기기에서만 로그인하고 그 인증 정보를 활용하여 다른 기기에서 로그인하는 방식으로 발전해 갈 것으로 예상된다.

참고 자료

785b43af98006627803b6a1769bfd844.jpg
NBP 회원플랫폼개발랩 나윤재
회원플랫폼개발랩에서 네이버회원 업무를 담당하고 있다. 주로 BPM(Business Process Management), MIS(Management Information System), ETL(Extract, Transform, Load)등의 업무를 경험했고, 현재는 신규 아이디 시스템(NEOID)을 개발, 적용하고 있다.