회원가입
1. Member Entity 만들기
가장 먼저 Member Entity를 만듭니다.
해당 Entity로 username과 password를 받아 회원가입을 할 예정입니다
2. 회원가입 요청을 받을 request dto를 만들고 controller를 이용해 맵핑시키기
MemberCreateRequest를 통해 username과 password를 입력 받습니다.
저는 추가적으로 한국투자증권 api를 사용하기 위해 appkey와 appsecretKey를 받아줬지만, 기본적인 회원가입에는 신경 쓰지 않아도 됩니다.
이제 createMember에서 어떤 일이 일어날지를 확인하러 갑시다
3. Spring Security가 제공해주는 PasswordEncoder를 이용하여 비밀번호 인코딩해주기
PasswordEncoder Bean을 주입받아 Repository를 이용하여 save 해줍니다.
회원가입은 이렇게 간단하게 정리할 수 있습니다.
이제 로그인을 봅시다
로그인
1. 로그인 Service 만들기
request와 controller 부분은 생략하고 Login Service가 어떻게 작동하는지를 알아봅시다
Spring Security는 UsernamePasswordAuthenticationToken 이라는 클래스를 제공합니다
username과 password를 입력받아 토큰을 만들어주죠
request에 담겨있는 유저의 id와 password를 넣고 Token을 만듭니다
request의 toAuthentication() 함수에는
다음과 같이 해당 객체를 new 해서 반환해줍니다.
여기서 이 객체가 생성될 때, username과 password를 이용해서 어떻게 이 객체를 생성할까요?
2. UserDetailsService 구현체 만들기
이렇게 UserDetailsService를 구현한 구현체를 이용해 토큰을 만듭니다.
memberRepository에서 username을 받아와 UserDetail을 만듭니다.
그럼 이제 이 만들어진 UserDetail을 이용해서 인증 처리를 해주어야겠죠
UserDetailsService의 구현체를 통해 얻은 Token으로 이제 DB에 있는 password와 비교를 한 뒤 로그인을 처리할지 말지 결정해야합니다.
그걸 도와주는 것이 바로 authenticationManagerBuilder입니다. 해당 토큰으로 정보를 확인하고 아이디와 비밀번호가 일치하지 않으면 예외를 던질것이고, 일치한다면 authentication 객체를 반환합니다.
만약 예외가 발생하지 않았다면 다음 단계로 넘어가서 token을 생성해줍니다.
3. JWT Token 만들기
Authroties로 member에서 설정한 Authority값을 받아옵니다.
여러 권한을 가지고 있을 수 있으니 저렇게 GrantedAuthority 객체의 getAuthority 메서드를 이용해 권한들을 모두 받아옵니다.
그리고 권한과 username 각종 요소들을 추가해 jwt token을 생성합니다.
이제 이 토큰을 이용해 인증 처리를 할 토큰을 만들 수 있게 됩니다.
jwt 토큰은 만들었는데, 이 토큰이 유효한 지 어떻게 알 수 있을까요?
로그인을 할 때 해당 토큰을 발급 한 뒤 front쪽에서 해당 토큰을 header에 넣어서 준다면, 토큰을 이용해 권한 및 인가처리를 해주어야할 텐데 말이죠
4. JWT 토큰 유효성 검사 메소드 만들기
토큰 값을 받은 뒤 Jwts 객체의 parserBuilder를 사용하여 jwt secret키를 디코딩하고 비밀키를 이용해 만든 key값을 넣어 유효성 검사를 할 수 있습니다.
5. JWT 토큰이 유효하다면 인가처리해주기
authorities는 claims의 AUTHORITIES_KEY를 통해 가져올 수 있지만, 일단 하드하게 ROLE_USER 권한을 부여하겠습니다.
그리고 UserDetails 구현체를 만들어 맨처음 로그인 했을 때와 마찬가지로 Token을 발급합니다
6. Filter 실행하기
이제 JwtFilter를 만들어줍니다. 해당 OncePerRequestFilter를 상속받아, filter는 요청이 올 때 먼저 실행되어 jwt 토큰이 있는지, 유효한지를 체크하고 권한을 부여할 것입니다.
SecurityContextHolder에 authentication도 지정해고 해당 filter를 실행시키도록 doFilter를 이용해주면 로그인 처리가 되게 됩니다.
'백엔드 > Spring' 카테고리의 다른 글
스프링일기 14 - JPA(5) JOIN (0) | 2023.06.19 |
---|---|
스프링 일기 13 - JPA(4) Main에서 사용해보기 (1) | 2023.06.19 |
스프링 일기 12 - JPA(3) Create2 DTO 분석하기 (0) | 2023.06.16 |
스프링 일기 8 - JPA(1) (SQL과 OOP 자바의 패러다임 불일치) (0) | 2023.06.14 |
스프링 일기 7 - Interceptor (0) | 2023.06.14 |