작동 되잖어요
그게 미리 짜여진 알고리듬대로 현재 시간에 맞춰서 비밀번호를 만들어 준다고 들었는데
그러면 그게 일회성이 되는 이유도 궁금하고
인터넷에 연결되지 않은 otp기기에서 새로고침을 사용했을때 새로 생성되는 비밀번호만 사용 가능해지고 그 전비밀번호는 사용불가능해지는게 어떻게 되는건지도 궁금합니다
알고리듬이 읽어들이는 시간의 단위가 어느정도 까지인지는 모르겠는데
만약 기기 시간이 다르게 설정 되어 있다거나 오차가 있을 경우에 작동하지 않는지도 궁금해여
그리고 보통 otp같은걸 보면 20초 30초 졍도 시간 제한이 있던데
그럼 그동안의 모든시간에 매초 알고리즘으로 생성되는 비밀번호가 다를텐데
그럼 로그인 할때 확인하는 otp가 30초 전까지의 매초에 생성되는 otp비밀번호중 하나이기먼 하면 다 열리는 걸까요
걍 문득 던파 하려고 otp 입력하다가 궁금해졌는데 물어볼곳이 마땅치 않아서 여기 물어봅니다
여기묻는거 아니면 죄송합니다 지워주세요
- dc official App
OTP(일회용 비밀번호)에 대한 궁금증이 많으시군요! 아래에서 질문하신 내용을 정리해서 답변드릴게요. 1. 일회성 비밀번호의 원리: OTP는 일반적으로 시간 기반 알고리즘(TOTP) 또는 이벤트 기반 알고리즘(HOTP)을 사용하여 생성됩니다. TOTP는 현재 시간을 기준으로 비밀번호를 생성하며, 이 비밀번호는 짧은 시간(예: 30초) 동안만 유효합니다.
2. 새로고침과 비밀번호 유효성: 인터넷에 연결되지 않은 OTP 기기에서 새로고침을 사용할 경우, 기기의 시간이 정확하다면 새로운 비밀번호가 생성됩니다. 그러나 기기의 시간이 서버와 다르다면 이전 비밀번호가 유효할 수도 있습니다. 일반적으로 OTP 시스템은 서버와 기기의 시간이 동기화되어야 정확히 작동합니다.
3. 시간 오차 문제: 기기의 시간이 서버와 다르게 설정되어 있거나 오차가 있는 경우, OTP 생성이 실패할 수 있습니다. 이는 비밀번호가 유효하지 않게 되거나, 로그인 시 오류가 발생하는 원인이 됩니다.
4. 시간 제한과 OTP 유효성: 대개 OTP는 30초 간격으로 새로 생성됩니다. 따라서 로그인 시 서버에서 확인하는 OTP는 해당 시간 동안 생성된 비밀번호 중 하나일 가능성이 높습니다. 그러나 보안상의 이유로 서버는 특정 시간에 대한 OTP만 허용하며, 모든 시간의 비밀번호가 열리지는 않습니다.
5. 로그인 확인 과정: 서버는 사용자가 입력한 OTP가 유효한지 확인하기 위해, 그 시간에 해당하는 비밀번호를 생성하고 비교합니다. 이때, 서버 시간과 클라이언트 시간의 동기화가 중요합니다.
되게 답변을 ai처럼 해주네 고마워요어 - dc App
보통 시간이나 인증횟수기반으로 otp 만들고 시간으로 할땐 보통 오차가 감안되어있음. 시간베이스는
https://datatracker.ietf.org/doc/html/rfc6238
이게 표준스펙임. 보통 복구용 코드같은거 받을텐데 복구코드+시간을 시드로 서버랑 클라이언트가 동시에 난수화해서 그 값이 일치하는지 검증하는거임
댓글들 보고 어떤식으로 돌아가는지는 뭔느낌인지 알거같은데 여전히 새로고침을 했을때 어떤식으로 낡은 비밀번호라는걸 판단하고 접속을 차단하는지 모르겟넹... 만약 30초동안 유지 되는 비밀번호를 10초에 한번씩 세번 새로고침 했을때 동시에 세종류의 비밀번호가 생길텐데 이건 새로고침 하기전 낡은비밀번호니까 접속을 차단한다 이건 새로생긴 비밀번호니까 접속을 허가한다를 인터넷이 연결되어 있지 않다면 어떻게 판단하는지가 궁금한데 - dc App
OTP를 실제 사용해보면 너가 궁금한게 풀릴거임. OTP는 새로고침한다고 새로운 비밀번호가 나오지않는다.
30초 유효하다고 하자. 그럼 12:00:00기준으로 시작한다고 하면 12:00:00 부터 12:00:30까지 같은키 발급임
그래서 OTP앱이나 기기에 들어가면 유효시간 카운트다운이 구현되어있는경우가 많은거임. 위의 예에서 12:00:10초에 다시 OTP에 들어가면 발급된지 10초된거고, 20초 카운트다운이 들어갈거임
즉 30초 동안 새로고침을 하든 뭘하든 12:00:00~12:00:30 동안은 뭘하든 기기랑 서버는 같은키를 발급하게된다. 물론, 추가 보안이 필요하다면 한번 OTP를 통해 해당시간에 1회 인증이 되었다면 해당 키를 무효화하게 해야지 방법적으로는 뭐 DB에 기록하든, Redis써서 기억한다던지 어떻게든 무효화할 수 있는 방법은 많음