SpringbootSecurity

SpringbootSecurity/JWT 사용한 로그인(1)

25G 2021. 10. 1. 15:23

이번 포스팅은 저번 포스팅과 연결돼 있습니다.

저번에는 가장의 토큰을 JWT라고 가정을 하고 테스트를 해보았고 이제는 진짜 JWT를 구현해서 회원가입과 로그인을 진행하는 포스팅이 될 것 같습니다.

기본적으로 SpringbootSecurity서버는 Security를 통한 로그인과 회원가입이 이루어져야하기때문에 설정들을 다뤄줍니다.

왜 이렇게 하는지에 대한 내용은 자세한 내용은 이전 OAuth로그인포스팅에 자세히 나와있습니다. 

왜 이렇게 하는지에 대한 설명은 이전 Seucurity포스팅에 다 담겨있습니다!.

 

그럼 위와같은 Service가 언제 동작을 하냐면 

/login으로 요청이 들어오면 Service가 동작을 한다. 왜냐하면 SpringSecurity가 기본적인 login주소가 /login이기 때문이다.

SpringScurity는 login요청을 컨트롤러에서 하는 것이 아닌 Security가 관리하기 때문이다.

하지만 이번 JWT 서버에 SecurityConfig설정에서 formdisable로 form로그인을 막아 놨기 때문에 위 PrincipalDetailsService클래스를 실행시켜주기 위해서 직접 필터를 하나 만들어 줘야 한다.

위와 같이 PrincipalDetailsService를 실행시키기 위한 필터를 하나 만들고

위와같이 등록을 해주면 되는데 이때 AuthenticationManger가 바로 파라미터로 넣을 수 있는 이유는 현제 SecurityConfig클래스를 상속하고 있는 WebSecurityConfigurerAdapter 추상 클래스가 AuthenticationManger를 들고 있기 때문이다.

그럼 위에 sysout으로 찍어본 것을 postman으로 테스트를 해보면 500 에러가 나면서 정상적으로 작동하는 것을 아래와 같이 확인할 수 있다.

지금까지 만든것들이 잘 작동하고 있다.

 

그럼 이제 /login으로 로그인 요청이 들어온다고 가정하면 처리해야 할 것들이

1.username, password를 받아서

2. 정상인지 로그인 시도를 해본다. AuthenticationManger로 로그인시도를 하면 PrincipalDetailsService가 호출이 되면서. loadUserByUsername가 정상적으로 실행이 된다.

3.PrincipalDetails를 세션에 담고

4.JWT토큰을 만들어서 응답해주면 된다.

 

여기서 굳이 PrincipalDetails세션에 담는 이유는 권한 처리를 하기 위해서이다. 세션에 값이 있어야 권한 관리를 해주면 되는 것이다.

 

로그인을 하는 것은 다음 포스팅에서 진행이 됩니다.

 

https://github.com/fj2008/JWTstudy

 

GitHub - fj2008/JWTstudy

Contribute to fj2008/JWTstudy development by creating an account on GitHub.

github.com