Spring boot (로그인 예제 처리 과정분석)
/authenticate 분석
로그인 처리 과정인 /authenticate의 Sequence Diagram 및 분석
Controller, Service, Repository, TokenUtil = 자바 클래스 파일.
녹색박스 : 각각의 클래스 안에 메소드들.
1. 먼저 url에서 /authenticate를 실어서 authenticate을 요청한다.
jwtrequest의 body로 e-mail, password가 들어간다.
2. createAuthenticationToken(JwtRequest request)부터 시작
토큰안 코드가 들어있고 실행내용은 이메일,패스워드 메소드를 호출한다.
호출할때 메소드로 이메일, 패스워드가 들어옴
3. jwtuserDtailService
다음으로 Service과정에서의 Service는 실제 요청을 받은 데이터,
db에 직접적으로 접근하면서 db가 가진 데이터를 어떻게 가져올지 정의한다.
가져온 데이터를 어떻게 요리해서 return시킬지, 종료시킬지를 결정한다. 데이터의 요청을 요리하는 역할을 함.
4. 요청받은 이메일, 패스워드 호출, 호출한 데이터를 어떻게 객체화를 시킬것인가
= 멤버라는 레퍼지토리에 접근.
이메일로 찾은 멤버가 있는지?
없다면 UserNameNotFoundException -> 요청자체를 끝냄.
멤버가 있다면 -> 비번이 맞는지 검사, ( passwordencoder라는 객체를 사용,
요청으로 들어온 패스워드, db의 패스워드가 일치하는지 본다. 패스워드는 자동으로 암호화가 되있음 )
*passwordencoder : spring에서 제공하는 중요한 라이브러리 기능 사용
패스워드 일치 하지 않다면 -> BadCredentialsExceptionBadCredentialsException
5. 같은지 같지 않은지 검사를 하고 둘다 통과하면 member 리턴 토큰을 발생시킨다.
Jwts 로 토큰 생성
- claims : HashMap (key와 value를 가짐)
- claims에 token의 id set
- claims에 token 생성시각 기록
- claims에 token 유효시간 기록 (생성시각 + JWT_TOKEN_VALIDITY)
- claims에 token 암호화 알고리즘 선택(…하면서 salt로 쓸 secret key 설정)
==================================================================
JwtAuthenticationController 에서 body에서 받은 email과 password를
authenticateByEmailAndPassword로 보내서 인증절차를 거친다.
(email값이 없을때 UsernameNotFoundException 발생시키고,
password가 일치하지 않으면 password not matched 발생시킨다)
인증절차를 거친 member를 jwtTokenUtil에 보내서 토큰을 발급받는다.
발급받으면 ResponseEntity로 응답(토큰 리턴)을 나타낸다.