[java] GOOGLE OTP란? 구글 인증 서비스 도입 방법 (One-Time Password)
안녕하세요 jju_developer 입니다~
오늘도 어김없이 퇴근하고 돌아왔습니다.
오늘은 행운의 메일이 딱~ 날라오면서,,,!
정보 보안은 OTP 로 적용이 가능할 것.
이라는 조건이 날라오게 되었습니다.
이에 이번시간에는 간단히 구글 otp가 무엇이고 어디에 쓰는지에 대해 알아보고자 합니다~
저는 예전 인사팀에서 근무할때에 로그인 인증을 구글 otp로 했었습니다.
모바일 폰에 구글 otp 라는 어플을 깔고
로그인을 할때마다 구글 otp에 뜨는 번호를 로그인 창에 입력하는 방식이였습니다.
이것을 제가 개발을 해야하는 날이 오다니... 참 기분이 묘한 오늘입니다.
아무튼 정확히 OTP 가 무엇인지 찾아보았습니다!
OTP (One-Time Password) 정의와 사용 방법
**OTP (One-Time Password)는 일회용 비밀번호로,
한 번만 사용할 수 있는 비밀번호를 생성하여 인증에 사용합니다.
OTP는 보통 사용자가 로그인하거나 중요한 작업을 수행할 때, 추가적인 보안 계층을 제공하기 위해 사용됩니다.
OTP 사용 이유
- 추가 보안 계층: OTP는 비밀번호가 유출되더라도, 한 번 사용한 OTP는 다시 사용할 수 없기 때문에 계정을 안전하게 보호할 수 있습니다.
- 비밀번호 재사용 방지: 고정된 비밀번호를 반복해서 사용하는 것에 비해, OTP는 매번 새로운 비밀번호를 사용하므로 보안성이 높습니다.
- 피싱 공격 방지: OTP는 유효 시간이 짧기 때문에 피싱 공격에 대응하기 효과적입니다.
정리 : 짧은 유효시간, 새로운 비밀번호, 일회성이 장점!
TOTP (Time-based One-Time Password)의 원리
TOTP는 시간에 기반한 일회용 비밀번호 생성 방식으로,
서버와 클라이언트가 같은 비밀 키와 현재 시간을 사용하여 동일한 일회용 비밀번호를 생성합니다.
이를 통해 클라이언트가 서버에 인증 요청을 보낼 때,
서버는 클라이언트가 제공한 비밀번호가 올바른지 확인할 수 있습니다.
TOTP의 주요 구성 요소
- 비밀 키 (Secret Key): 서버와 클라이언트가 공유하는 비밀 키입니다.
이 키는 QR 코드를 통해 클라이언트에 전달됩니다. - 현재 시간 (Current Time)
- 시간 간격 (Time Interval): 보통 30초나 60초로 설정됩니다. 이 간격 동안 동일한 OTP가 유효합니다.
TOTP 생성 과정
- 비밀 키와 현재 시간 사용: 서버와 클라이언트는 미리 공유한 비밀 키와 현재 시간을 기준으로 OTP를 생성합니다.
- 시간을 간격으로 나눔: 현재 시간을 설정된 시간 간격(보통 30초)으로 나눕니다.
- HMAC-SHA1 해시 생성: 비밀 키와 시간 간격을 사용하여 HMAC-SHA1 해시를 생성합니다.
- OTP 생성: 해시 값을 기준으로 OTP를 생성합니다. 보통 해시의 일부를 이용해 6자리 또는 8자리 숫자 OTP를 만듭니다.
OTP 구현 방법 (Java에서 Google OTP)
Google Authenticator와 같은 OTP를 구현하기 위해
일반적으로 TOTP (Time-based One-Time Password) 방식을 사용합니다.
Java에서는 Google Authenticator와 호환되는 OTP를 생성하기 위해 라이브러리를 사용할 수 있습니다.
이 방식에 대해서는 다음시간에 더 많은 조사와 시행착오를 겪은 뒤!
자세히 다루도록 하겠습니다.
로그인 시 OTP 외의 다른 인증 방법이 있을까?
- SMS 인증: 사용자의 휴대폰으로 SMS를 보내 인증하는 방법입니다. 사용자가 받은 코드를 입력하여 인증합니다.
- 이메일 인증: 사용자의 이메일로 인증 링크나 코드를 보내 인증하는 방법입니다.
- 생체 인증: 지문, 얼굴 인식 등 생체 정보를 이용한 인증 방법입니다. 높은 보안성을 제공합니다.
- 보안 키 (Hardware Token): 물리적인 보안 키를 사용하여 인증하는 방법입니다. USB나 NFC를 통해 인증합니다.
- 푸시 인증: 모바일 앱을 통해 푸시 알림을 보내고, 사용자가 승인 또는 거부를 선택하여 인증합니다.
- 지식 기반 인증 (KBA): 사용자가 미리 설정한 질문에 대한 답변을 통해 인증하는 방법입니다. 예를 들어, "어머니의 결혼 전 성함은 무엇인가요?"와 같은 질문을 사용합니다.
그럼 저는 다음시간까지 코드로 구현해서 가져오도록 하겠습니다~!~!~!
