인프런 커뮤니티 질문&답변
작성자 없음
작성자 정보가 삭제된 글입니다.
강사님 GETDEL 관련해서 질문 있습니다
작성
·
52
·
수정됨
0
# Redis 6.2 이상일 경우 GETDEL 사용 권장
# saved_code = await rd.getdel(cache_key)
이 코드 사용을 권장하셨는데 입력 값 비교 검증까지 통과하기 전에 값을 가져와서 바로 지워버리면 사용자가 실수로 인증번호 입력을 실패해도 다시 요청하도록 해야하는데 이를 감안하고서라도 GETDEL을 사용해야 한다면 이는 verify_code 함수의 원자성을 지키기 위한 권장 사항인가요?
혹은 verify_code 함수에 트랜잭션 관련 설정을 하고 GET과 DEL 호출을 쪼개서 하거나 Redis Functions을 사용하는 것을 고려하는게 더 나은지 궁금합니다.
답변 2
0
안녕하세요. 😊
날카로운 지적 감사합니다! 코드를 깊이 있게 분석해 주셨네요.
말씀하신 대로 GETDEL을 사용하면 값을 읽어옴과 동시에 키가 삭제되므로, 유저가 실수로 오타를 냈을 때 재시도할 기회조차 없이 바로 폐기되어 새 인증번호를 요청해야만 합니다.
GETDEL은 아주 엄격한 보안이 요구되는 상황 즉, "단 1회의 비교 시도만 허용(일치 여부와 무관하게 즉시 파기)"하는 완전한 일회성 토큰의 원자성을 보장하고 싶을 때 사용하면 좋은 명령어입니다.
하지만 그렇지 않은 일반적인 서비스에서는 사용자 편의성(UX)을 저하시킬 수 있습니다. 현재 작성된 코드 역시 '인증번호가 일치할 경우에만 DEL을 수행'하도록 의도되어 있는데, 제가 GETDEL을 단순 권장 사항으로 덧붙이면서 두 로직 간에 모순이 발생해 버렸습니다.
명령어의 원자적 실행이라는 측면에만 포커스를 맞추다 보니, 샘플 코드의 전체 흐름과 충돌하는 설명을 드렸네요. 정확하게 짚어주셔서 감사합니다.
그리고 말씀하신대로 인증번호 일치 여부 판단 후, 삭제하는 로직을 루아스크립트로 작성하면 원자성과 사용자 편의성을 모두 만족시킬 수 있습니다.
학습에 혼란을 드려 죄송하며, 강의 노트와 내용에 해당 부분에 대한 코멘트를 추가하도록 하겠습니다.
훌륭한 시야로 질문 남겨주셔서 다시 한번 감사드리며, 앞으로도 완강까지 화이팅하시길 응원하겠습니다!
0
안녕하세요, 인프런 AI 인턴입니다. !?님.
Redis에서 GETDEL과 관련된 이해와 사용 방법에 대한 질문을 주셨군요. GETDEL 명령어는 Redis 6.2 이상에서 사용 가능한 명령어로, 주어진 키의 값을 가져오면서 동시에 삭제하는 원자적 작업을 수행합니다. 이는 특히 인증번호와 같은 일회성 데이터를 처리할 때 유용할 수 있습니다.
GETDEL 사용의 장점과 고려사항:
원자성 보장:
GETDEL은 원자적으로 작동하므로 데이터 일관성을 유지하며 동시성 이슈를 방지하는 데 좋습니다. 인증번호를 한 번의 요청으로 가져오고 삭제하여, 다른 요청에서 동일한 인증번호를 볼 수 없게 합니다.재요청 처리: 사용자가 인증번호 입력에서 실수했을 경우 문제를 해결하기 위해 재요청을 하도록 유도하는 구조가 필요합니다. 이 점에서,
GETDEL을 사용하면 코드의 원자성이 유지되면서도 인증번호의 일회성을 강조할 수 있습니다.
대안 방법:
트랜잭션 사용:
GET과DEL명령어를 별도로 쪼개어 사용하려는 경우 트랜잭션을 통해 실행하여야 원자성을 보장할 수 있습니다. 그러나 이 방법은 코드가 다소 복잡해질 수 있습니다.또 다른 방법으로는 Lua 스크립트 사용: Lua 스크립트를 사용하여
GET과DEL을 하나의 스크립트로 묶어 원자적으로 수행하는 방법도 있습니다.
관련된 보안 및 설정 관리에 대한 자세한 정보는 Redis Container 해킹 게시물을 참고해 보시면 유용할 것입니다. 해당 게시물에서는 Redis 보안 강화에 대한 다양한 팁을 확인할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




