우리나라에서 2단계 인증이라고 하면 문자메시지나 카카오 인증서, 통신사 PASS앱을 떠올리는 것이 일반적이다.
해외에서는 구글 인증(Google Authenticator) 앱을 많이 사용한다. 구글의 앱이라고 해서 구글 서비스에만 쓸 수 있는 것은 아니고 아마존이나 페이스북, 에어비앤비 같은 서비스에 로그인할 때도 2단계 인증수단으로써 사용할 수 있다.
재밌는 건 구글 인증 앱은 인터넷 연결이 따로 필요 없다는 점이다. 예를 들어 노트북에서 아마존 웹사이트에 로그인하려고 하면 2단계 인증용 비밀번호를 묻는다. 이때 휴대폰에 설치된 구글 인증 앱에서 생성된 아마존용 비밀번호를 입력하면 로그인할 수 있다. 비밀번호는 비행기 모드에서도 여전히 생성된다(30초마다 바뀐다).
인터넷에 연결되지 않은 휴대폰에서 생성된 1회용 비밀번호가 유효한지 아닌지 어떻게 판단할 수 있을까? 복잡한 보안 알고리즘이 작동하지만 쉬운 이해를 위해 매우 단순화해서 살펴보자.
일단 구글 인증 앱을 휴대폰에 최초로 설치하고 서버와 연동할 때에는 인터넷에 연결되어 있어야 한다.
연동하는 과정에서 구글의 서버와 사용자의 휴대폰은 각자 시크릿 키를 나눠 갖는다. 예를 들어 시크릿 키가 4321이라면, 서버에도 4321이 저장되고 내 휴대폰에도 4321이 저장된다.
아마존 웹사이트에 로그인하는 상황. 이메일과 비밀번호를 입력한 후에는 2단계 인증용 비밀번호가 필요하다. 이때 휴대폰의 구글 인증 앱을 열면 아래와 같은 계산이 일어난다.
(현재 날짜는 2021년 1월 30일 오전 9시 30분 30초라고 하자)
a. 현재 날짜를 Unix Time 형식으로 변환한다. (변환 결과: 1611966630) b. 휴대폰에 저장되어 있는 시크릿 키를 확인한다. (4321) c. a와 b를 곱한 후, 결과 값의 뒷 6자리를 1회용 비밀번호로 사용한다. (1611966630 * 4321 = 6965307808230)
휴대폰 화면에는 아마존용 2단계 비밀번호가 808230으로 출력되고, 내가 808230이라고 입력하면 (구글 서버도 같은 결과 값을 갖고 있기 때문에) 유효한 비밀번호라는 것을 인증받을 수 있다.
(30초가 지나, 현재 날짜가 2021년 1월 30일 오전 9시 31분 00초라고 하자)
a. 현재 날짜를 Unix Time 형식으로 변환한다. (변환 결과: 1611966660) b. 휴대폰에 저장되어 있는 시크릿 키를 확인한다. (4321) c. a와 b를 곱한 후, 결과 값의 뒷 6자리를 1회용 비밀번호로 사용한다. (1611966660 * 4321 = 6965307937860)
이제 1회용 비밀번호는 937860이다.
인터넷 연결이 필요 없는 이유는 저장된 시크릿 키와 시계만 있으면 계산할 수 있기 때문이다. 시크릿 키는 처음 세팅할 때 기기 안에 저장되어 있고, 시계는 인터넷 연결이 없어도 돌아간다(단, 구글 서버와 같은 시분초를 가리키고 있어야 한다는 조건이 붙는다). 또한 비밀번호를 눈으로 확인하고 손으로 입력할 시간이 필요하기 때문에, 1초마다 비밀번호를 새로 계산하지 않고 30초마다 하는 것으로 되어있다. 참고로 은행에서 발급해주는 OTP도 비슷한 방식.
가장 이상적인 세팅은 이용하는 모든 서비스마다 2단계 인증을 거치는 것이다. 하지만 아직도 2단계 인증을 지원하지 않는 웹사이트나 앱들이 수두룩하며, 사용자들에게도 일반적이지 않다. 그럼 비밀번호라도 어려워야 하는데, 자신의 강아지 이름이나 연속된 숫자로 지정하는 경우가 너무나도 흔하다. 서비스 제공자의 보안을 100% 신뢰할 수는 없는 노릇이기 때문에, 패스워드 매니저와 2단계 인증은 꼭 사용하기를 권장한다.