
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을 memberRepository의 findByEmail에 넣어서 Member가 있는지 확인한다
멤버가 있다면 다음 if문을 통해 비밀번호 검사를 한다
if(!passwordEncoder.matches(password, member.getPassword())) {
throw new BadCredentialsException("Password not matched");
}
passwordEncoder 를 사용해서 요청으로 들어온 password와 DB의 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에 담아놓는다
'Spring Boot > Spring Boot' 카테고리의 다른 글
51 : JPA로 CRUD 기능 구현 (SpringbootApi) (0) | 2021.10.25 |
---|---|
50 : /test - sequence diagram (0) | 2021.10.19 |
45 : Springboot(글 수정 기능) (0) | 2021.10.10 |
44 : Springboot(글 읽기 비즈니스 로직 추가) (0) | 2021.10.08 |
42 : Springboot (글과 댓글 함께 출력) (0) | 2021.10.07 |