Spring Security + JWT

Woozy9ucci·2022년 10월 11일


Security 의 동작 구조.
우리는 5에서 AuthenticationProvider가 아닌 TokenProvider를 통해 인증을 했다.
즉 시큐리티의 인증 부분을 토큰으로 대체한 것.
아마 우리가 세션을 비 활성화 했기 때문에 Authentication 객체가 저장되지 않고
Security 가 Authentication SecurityContext에 저장한것인가? 헷갈리네..
아무튼 SecurityUtil에서 컨텍스트에서 값을 받아오는 식으로 @AuthenticationPrincipal
을 대체할 수 있었다.
원래는 헤더로 AccessToken과 RefreshToken이 응답되어야 하는 것 같은데
서블릿 좀더 공부해보고 방법을 찾아봐야 할 것같다.
또한 리프레시 토큰이 들어왔을 때 AccessToken과 RefreshToken 함께 받는 구조도
생각해봐야겠다.

참고하며 좋았던 자료들
[Spring Security] Form Login 개념 & 사용법 - https://velog.io/@seongwon97/Spring-Security-Form-Login
[WEB] 📚 Access Token & Refresh Token 원리 (feat. JWT) - https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Access-Token-Refresh-Token-%EC%9B%90%EB%A6%AC-feat-JWT

질문 1. 유저 디테일에서 Memeber 자체를 가져오고 싶은데 (조인)
토큰 프로바이더에서 유저디테일 객체를 만들어서 리턴했다
이런 상황에 통째로 Member를 받아오려면!?

-> 생각 해보니 오스 서비스에서 로그인 진행 할 때 유저디테일객체에 담아서 리턴했다.
따라서 UserDetail 구현체를 사용해도 상관없을 듯

질문2. 오스컨트롤러에 로그인서비스 1~2번 까지는 시큐리티의 토큰을 말하는것?
-> Security 의 Authentication 을 말하는 듯.

질문3. 시큐리티가 어떻게 비교하지?
-> 유저디테일 서비스에 멤버레파지토리 주입했네

질문4. SecurityUtill 은 뭐하는앤지 잘 모르겠다. SecurityContext가 뭔지 찾아봐야지
????????????????????

질문5. Security에서 authentication (인증) 은 로그인 성공하면 발급 그러나 세션 저장은 하지 않고 jwt토큰을 발급해줌. Security 에서는 인증(Authentication)을 바탕으로 접근 권한을 부여하는데
그렇다면 로그인 후 jwt토큰으로 무언가를 할 때 authentication 을 jwt토큰으로 부여하는 부분은 어디? (user detail service 는 로그인 시 유저 정보를 담아두는 역할을 하는 곳인거같은데)
-> 토큰 프로바이더에서 검증하고 authentication 리턴하는 getAuth~ 메소드가있음
이걸 jwt필터에서 호출하여 사용하는듯
-> security context에 저장한다는데 찾아보자
-> 아 그러면 로그인 이후 요청 보낼 때 doFilter로 토큰 가지고 가나보네
-> 아 그래서 filter는 컨트롤러 프로바이더는 서비스 느낌이구나

질문6. Transactional에 aop사용 했냐고 하는게 (readonly = true) 붙인것을 말하는거?
?????????????????????

질문7. 재발급 api를 만들었는데 이는 어떨 때 어떻게 사용해야하나? 만료시 예외발생만시켰었는데
??????????????????????

질문8. 일단 api이름을 다르게 만들긴 했는데 만약 get, post api가 같을 때 권한은 어떻게 다르게 하는지
-> 파라미터 앞에 HttpMethod. 으로 고를 수 있네

아래 메모를 기반으로 깔끔하게 다시 정리해보자
로그인 -> 오스 컨트롤러 -> 오스 서비스 : 아이디 비밀번호를 받아서 시큐리티용 객체(UsernamePass~)형태에 담아
놓고 시큐리티의 함수로 검증.authenticate() (유저 디테일 서비스에 비교하는 메소드(loadBy~, create)가 실행됨)
DB에 유저 값이 존재한다면 UserDetails 객체 리턴(근데왜 비밀번호 비교하는 로직은 안보이지??) -> 검증이 완료되면
Authentication 객체 생성하고 이를 jwt에게 넘겨서 토큰 생성하고 리턴함

로그인이후 요청 ->우리가 만든 jwt필터 -> 로가서 토큰 꺼내고 유효성 검사하고 doFilter메소드 (토큰 프로바이더를 통해서 유효성 검증하고 security
에게 authentication 객체 생성하여 넘겨주고 인증상태로인지시킴)

1개의 댓글

comment-user-thumbnail
2022년 10월 13일

좋은 글 감사합니다 ^^

답글 달기