상세 컨텐츠

본문 제목

[Spring] Security 동작 확인 / 사용 방법

Backend/Spring

by hyeminyy 2023. 12. 18. 16:42

본문

728x90

수업 시간에 개인적으로 공부한 것입니다...

 

스프링 시큐리티 필터의 동작 흐름

httpServlet Filter -  클라이언트로 부터 서버로 요청이 들어오기 전에 서블릿을 거쳐서 필터링 하는 것

ServletContext

- application 실행시 생성되고 application 종료시 소멸

- ServletContext.class는 톰캣 컨테이너 실행 시 각 컨텍스트마다 한 개의 servletXontext객체를 생성한다.

그리고 톰캣 커네이너가 종료하면 servletContext객체가 소멸된다.

 

JSP파일 = jsp > java file > class file 

동작 흐름

1. 인증필터 Authentiction Filter가 Http Request를 가로채고,

2. 토큰을 만들고

3. AuthenticationManager 에게 준다.

4. 프로바이더들에게 주고,

5. UserDetailsSevice는 검증하는 것으로

6-10. user  > 아이디, 비밀번호, 권한 밖에 저장하지 못하기 때문에 user 객체를 만들어 프로바이더에게 반환한다.

일치한다면, Providers에 사용자 정보와 디비 정보를 비교해 인증정보를 만들고, context에 저장한다.

 

---내 방식으로 정리하자면?---

HTTP Request 입력한 정보(ID, PWD, 권한) -> Authentic  ationFilter에 넘겨준다.

넘겨준 것을 UsernaePasswordAuthenticationToken을 만들어서 AuthenticationManager에 넘겨준다.

 넘겨준 토큰과, User에 저장된 ID, PWD, 권한 값을 UserDetailsService가 받아와 AuthenticationProviders에 넘겨준다. 넘겨준 User값과, 토큰 값을 비교하며 일치한다면 ? AuthenticationManager을 거쳐, SecurityContextHolder에 넘겨주어 일치한다고 HttpSession에 저장되어 에플리케이션에 알려준다. (context는 최상위클래스) 

 

 

 

Client = 관리까지 하는 것

 

필터 

 - 필터 클래스

 - url 매핑

 -> 인증 필터 만들어서 사용

 -> 로깅 필터 만들어서 사용

 

인터셉터

 - 인터셉터 클래스

 - url 매핑

 -> 인증 필터 만들어 사용 가능

 -> 로깅 필터도 만들어 사용 가능

 

스프링 시큐리티 

 - 시큐리티 필터

 - 인증과 인가만을 위한 필터 : 인증 필터, 인가 관리

      - 사용자가 입력한 아이디/비밀번호와 데이터베이스(ex. 아이디, 비밀번호를 비교하고, 일치하면 보여질 페이지, 그렇지 않으면 이동할 페이지 지정)

      - 어떤 URL에 요청을 했을 때 필터가 동작해야 할지

      - 어떤 URL에 요청을 했을 때 필터 인가 여부를 체크해야 할지

 

   

 

권한을 갖게 할 것인지, 인증을 갖게 할 것인지, 어디에 접근 가능할 것인지 규칙을 넣는다.

 

 

인증 여부 체크 <isAnonymous()> (인증 안됨), <isAuthenticated()> (인증 됨)

 

 Authenticationprovide가 호출한다.

 

    user은 아이디, 비밀번호, 권한만 인자로 가지고 있어야 한다.

하지만 그 외에도 가지고 싶으면 위 처럼 User를 상속 받아서 사용한다. 

MemberUserDetails는 이메일도 가지고 있다. 아래의UserDetails를 보면 이메일 인자 값도 추가해준다.

   

필요한 이유 : 입력할 때, 수정 할 때, 입력한 값을 암호화 시켜야 한다.  똑같은 Encoder를 사용해야 같은 값이 나온다.

 

저장을 처리하는 insertController를 만들 때 (+update도) 위 코드를 사용해도 된다.

                                                                                                                                                                                                        2번째 생략에 위 PasswordEncode 메소드를 넣어주어도 좋지만, @Bean으로 사용하는게 더 좋다.

 

이렇게 해도 좋지만, 

 

principal 을 사용해서 쓰는 것이..  더 편함 ? 좋음 ?

 

요약

                                                                                                                                                                                                  

728x90

관련글 더보기