• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

로그인 구현 질문드립니다.

20.11.17 17:31 작성 조회수 149

1

안녕하세요,

여쭈어보고 싶은게 두가지가 있습니다.

질문1.

DB의 username 컬럼에 "sampleID" 값이 있고,

password 컬럼에 "samplePassword" 값의 암호화된 값이 있을 때,

POST 요청으로 

username=sampleID&password=samplePassword

라고 요청이 들어오면,

UserDetailService 구현을 안해도 알아서 로그인처리가 되나요?

질문2.

UserDetailService에서 이메일 또는 닉네임만 확인해서 반환하고,

비밀번호 확인은 구현이 안되어있는데요,

비밀번호 확인은 어떻게 이루어지고 있는 건가요?

이미 로그인 인증은 처리 된거고, 그 이후에 이메일 또는 닉네임을 확인해서 

authentication token을 만들어서 SecurityContextHolder에 넣어주고 있는건가요??

DB의 컬럼값도 email, nickname으로 username이랑 전혀 관련 없는데,

로그인 POST 요청 시 들어오는 username과 password값으로

DB에 있는 값들과의 비교 및 로그인 인증이 어떻게 되는건지 모르겠습니다.

답변 4

·

답변을 작성해보세요.

1

정말정말 감사드립니다!!!!!!!!!

1

네 맞습니다. 그 방법 말고 토큰 기반의 다른 인증 방식도 있지만 가장 일반적인 유저네임/패스워드 인증 방식은 그렇게 동작합니다.

1

1. UserDetailsService는 password encoder가 아니라 sameId라는 유저아이디에 해당하는 유저 데이터를 읽어오는 역할을 하니까 당연히 있어야 합니다. 그 다음 실제 패스워드가 매치하는지는 PasswordEncoder를 사용해서 확인하기 때문에 패스워드를 저장할 때 사용한 그 PasswordEncoder를 스프링 시큐리티 설정에 추가해야 합니다.

2. 비밀번호 확인은 PasswordEncoder를 사용해서 스프링 시큐리티가 확인합니다. DB에 들어있는 email이나 nickname을 username으로 취급해서 유저를 읽어오는거구요. 그렇게 인증 처리가 되면 Authentication이라는 객체를 만들어서 SecurityContextHodler에 넣어주는 겁니다.

스프링 시큐리티 강의에서 자세히 설명하지만, 간략히 설명드리자면 로그인 시 username에 해당하는 값으로 UserDetailsService의 구현체를 사용해서 유저 데이터를 읽어옵니다. 그때 username이라는 값을 DB에 들어있는 nickname이나 email로 매치되는지 살펴보고 그에 해당하는 유저 데이터를 읽어오는 겁니다. 그 다음 그렇게 읽어온 유저 데이터에는 패스워드가 인코딩 된 값으로 들어있는데, 그 값을 스프링 시큐리티 설정에 연결해 놓은 PasswordEncoder를 사용해서 체크하는 겁니다.

0

답변 정말 감사드립니다.

결국 스프링 시큐리티의 로그인 인증은, UserDetailService 구현체에서 DB에서 검색해 username, password 등의 정보를 채워넣어 반환한 "스프링 시큐리티의 User객체"의 username, password 정보만 보고 인증을 진행하는게 맞나요?