Instagram-Clone-Coding / Spring_instagram-clone

Instagram Clone Coding - Backend using Spring Framework
http://ec2-52-79-71-191.ap-northeast-2.compute.amazonaws.com
MIT License
82 stars 23 forks source link

비밀번호 재설정 api(/accounts/password/reset) 500번대 에러 #185

Closed live-small closed 2 years ago

live-small commented 2 years ago

Describe the bug

To Reproduce

에러 발생하는 영상은 단톡방에 공유했으니 참고부탁드립니다 : )

  1. 비밀번호 재설정 페이지 이동
  2. 바꿀 비밀번호 입력 후, /accounts/password/reset 호출
  3. 500번대 에러발생 스크린샷 2022-07-31 오후 10 46 24

request

스크린샷 2022-07-31 오후 10 46 56

error message

code: "G001"
errors: []
message: "내부 서버 오류입니다."
status: 500

Expected behavior

vectorch9 commented 2 years ago

현재 이메일을 통한 비밀번호 재설정 내부 로직은 다음과 같습니다.

  1. 이메일코드 검증
  2. 검증 성공 시, 새 비밀번호로 변경
  3. 변경 성공 시, 로그인된 JWT 토큰을 반환

이전 인증관련 리팩토링에서 비밀번호 변경은 필터로 옮길 시 parameter 처리가 어려워져 service단에 그대로 남겨두었습니다. 위의 3번을 실행하기 위해 service 단에서 AuthenticationManager를 호출하게 되는데, 이 부분에서 문제가 발생하는 것 같습니다. 현재 MemberAuthService에서 AuthenticationManagerBuilder를 주입받아 사용하고 있는데 WebSecurityConfig에서 설정한대로 주입이 진행되지 않고 있습니다. (authenticationManagerBuilder.getObject()를 호출하면 null이 반환됩니다.)

따로 Bean 등록 처리를 해주거나, AuthenticationManager를 직접 주입해주어도 같은 문제가 발생합니다.

따라서 내부 로직을 위의 1번과 2번만 시행하도록 바꾼 뒤 프론트 단에서 이메일을 통한 비밀번호 재설정 API 호출 -> 성공 시 가지고 있던 새 비밀번호로 로그인 API 호출 하도록 수정하는 방법이 제일 적절해보입니다.

@seonpilKim 혹시 관련된 에러 수정 방법이나 다른 의견이 있을까요? AuthenticationManager 주입이 정상적으로 진행되지 않는데 관련한 자료가 많지 않더라구요..

seonpilKim commented 2 years ago

음.. 일단 AuthenticationManagerBuilder가 Bean으로 등록되어 있지 않아서 주입이 안되는 것 같고, 따로 Bean으로 등록하는건 어떤 방법으로 하셨는지 모르겠지만, WebSecurityConfigurerAdapter에 보면 AuthenticationManagerBuilder가 private으로 선언되어 있어서 저희가 설정을 적용한 AuthenticationManagerBuilder를 가져와서 bean으로 등록할 수 있으면 가능할 것 같긴 한데, 방법은 잘 모르겠네요..

위 내용과는 조금 다른 이야기지만, 다시 생각해보니 filter는 공통적인 로직들만 넣고, 이메일을 통한 비밀번호 재설정과 같은 로직은 특정 상황에서만 사용되는 로직이니까, filter보다는 api내에 로직을 구현하는 걸로 바꾸는게 어떨까 싶은 생각도 드네요..

vectorch9 commented 2 years ago

AuthenticationManagerWebSecurityConfigurerAdapter에 protected로 생성되어있어 WebSecurityConfig에서 public Bean으로 주입을 해주었는데, 여전히 에러가 발생했습니다. AuthenticationManagerBuilder의 경우 말씀해주신 대로 private으로 되어있어 방법을 찾지 못했습니다. 이전 서비스단에서 로그인을 구현할 때는 AuthenticationManagerBuilder가 정상적으로 주입됐습니다. (아마 이때는 커스텀 provider가 없었기 때문에 그런것 같아요)

현재 filter에서 작동하는 인증 과정은

  1. username, 비밀번호 로그인
  2. 이메일을 통한 로그인
  3. 재발급
  4. Jwt 토큰 검증

의 4가지가 있습니다. 그 외 이메일을 통한 비밀번호 재설정 로직은 현재 API내에서 작동하고있습니다. 저는 위의 4가지는 모두 인증과정이므로 filter에 있는게 좋을 것 같습니다 ! 위 4가지 중 API단으로 옮겨야된다고 생각하시는 로직이 있을까요?

seonpilKim commented 2 years ago

4가지 그대로 필터에 두는게 좋은 것 같습니다 :)

vectorch9 commented 2 years ago

이메일 코드에 대한 인증은 이미 진행하였으므로 JwtUtil에서 직접 토큰을 생성하는 방식으로 변경했습니다.