본문 바로가기

Spring Boot/Spring Boot

49 : /authenticate - Sequence Diagram (Springboot)

Start

url에서 /authenticate를 실어서 authenticate을 요청한다

JwtRequest body에는 e-mail, password가 들어간다

 


JwtAuthenticationController

createAuthenticationToken(JwtRequest request)

> 요청으로 들어온email과 password가 들어있다

 

아래의 내용의 코트를 호출하는 컨트롤러 역할을 한다

  • JwtUserDetailsService 에서 Email과 Password를 검사 (Email&Password를  member에 담는다)
  • JwtTokenUtil 는 위에서 검사한 member를 토큰으로 변환한다

 

 


JwtUserDetailsService

  • Email과 Password가 유효한지 검사한다.
Member member = memberRepository.findByEmail(email)
                .orElseThrow(() -> new UsernameNotFoundException(email));

Email을 memberRepositoryfindByEmail에 넣어서 Member가 있는지 확인한다

 

멤버가 있다면 다음 if문을 통해 비밀번호 검사를 한다

if(!passwordEncoder.matches(password, member.getPassword())) {
  throw new BadCredentialsException("Password not matched");
}

passwordEncoder 를 사용해서 요청으로 들어온 passwordDB의 password(member.getPassword())

가 일치하는지 확인한다. 패스워드는 암호화 되어있다

만약 패스워드가 일치하지 않는다면 BadCredentialsExceptionBadCredentialsException 를 발생시킨다.

 

 


MemberRepository

  • Member가 있는지 확인한다
public interface MemberRepository extends CrudRepository<Member, Long> {
    Optional<Member> findByEmail(String email);
}

넘겨받은 Email을 넣어서 Member가 있는지 확인한다

없다면 UserNameNotFoundException를 발생시키고 요청을 끝낸다

 


JwtTokenUtil

  • 토큰 생성
    public String generateToken(String id) {
        return generateToken(id, new HashMap<>());
    }

    public String generateToken(String id, Map<String, Object> claims) {
        return doGenerateToken(id, claims);
    }

    private String doGenerateToken(String id, Map<String, Object> claims) {
        return Jwts.builder()
                .setClaims(claims)
                .setId(id)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000))
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }

Controller에서 member.getEmail()를 generateToken 으로 >

generateToken 에서는 받은 Email과 새로 생성한 HashMap을 아래의 generateToken 으로 >  

generateToken 에서는 받은 Email과 HashMap claims을 아래의 doGenerateToken 으로 보낸다.

 

doGenerateToken : Jwts 로 토큰 생성

     - claims : HashMap (key와 value를 가진다)

     - claims에 token의 id set

     - claims에 token 생성시각 기록

     - claims에 token 유효시간 기록 (생성시각 + JWT_TOKEN_VALIDITY)

       public static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60;  : 즉 5시간 유호시간

     - claims에 token 암호화 알고리즘 선택(…하면서 salt로 쓸 secret key 설정)

 

그리고 compact();는 String return 값을> Jwts에 담아놓는다