게시글
질문&답변
2024.07.26
SecurityContextRepository / SecurityContextHolderFilter - 2 강의 질문 있습니다
네 request 를 확인할 필요가 없는것이 request 는 매 요청마다 바뀌기 때문에 request 에 securityContext 가 존재할 수 없습니다. 그래서 인증이 없는 상태에서는 새롭게 securityContext 를 생성해서 스레드 로컬에 저장하는 것입니다. 그래서 세션에 securityContext 가 없다면 인증을 받지 않은 상태임을 의미하는 것이고 이는 곧 새로운 securityContext 을 만들어 익명 사용자의 인증상태를 나타내도록 AnonymousAuthenticationToken 을 생성하여 처리하고 있다고 보시면 됩니다.
- 0
- 2
- 62
질문&답변
2024.07.26
안녕하세요!
음.. 가능은 합니다만 좀 제약이 있습니다. 저의 자료에 있는 내용을 그대로 올리는 거나 비슷하게 올리게 되면 강의 내용 자체 유출이 될 수 있으므로 조심해 주시기 바랍니다. 현재 구글에서 저의 강의를 올린 블로그를 보는데 강의 내용을 그대로 한 부분이 발견이 되어 문제의 소지가 있어 좀 고민하고 있습니다. 개인적으로 공부한 부분을 요약하여 정리하신다는 기준으로 올리시기 바랍니다.
- 0
- 2
- 100
질문&답변
2024.06.27
ReentrantLock.lockInterruptibly() 질문
네 위 코드에서 IllegalMonitorStateException 가 발생하는 원인은 unlock 메서드가 락을 획득하지 않은 스레드에 의해 호출되기 때문인데요 ReentrantLock 객체의 unlock 메서드는 락을 획득한 스레드만이 호출할 수 있습니다. 위 코드에서는 thread1 이 인터럽트될 때 락을 획득하지 않은 상태에서 thread1 이 finally 에서 unlock 을 호출하게 되어 예외가 발생하고 있습니다. 그래서 다음과 같이 할 수 있습니다. Thread thread1 = new Thread(() -> { try { lock.lockInterruptibly(); // 락을 시도하며, 인터럽트가 들어오면 중단 System.out.println("스레드 1이 락을 획득했습니다"); } catch (InterruptedException e) { System.out.println("스레드 1이 인터럽트를 받았습니다"); } finally { if (((ReentrantLock) lock).isHeldByCurrentThread()) { lock.unlock(); System.out.println("스레드 1이 락을 해제했습니다"); } } }); 즉 finally 에서 현재 스레드가 락을 획득한 경우에만 unlock 을 호출하도록 하는 것입니다.
- 0
- 1
- 93
질문&답변
2024.06.27
AuthenticationManger - HttpSecurity 사용
강의 자료와 소스코드가 동기화 되어 있지 않을 수 있습니다. 강의에서 제공하는 소스코드를 중심으로 이해해 나가시면 됩니다. 직접 생성방식 formLogin 은 기본적으로 사용하는 것이고 추가적으로 CustomAuthenticationFilter 를 사용하고자 할 때를 설명하고 있는 것입니다. 여기서 중요한 것은 formLogin 에서 사용하고 있는 AuthenticationManager 가 아닌 직접 AuthenticationManager 를 생성해서 CustomAuthenticationFilter 로 부터 인증 지시를 받는 예를 든 것입니다. "우리가 생성한 필터?(CustomAuthenticationFilter이게 맞는지는 모르겠지만)를 통해 인증을 진행할 때 ,직접 생성한 AuthenticationManger를 사용해서 인증을 진행하도록 한다고 이해했습니다. 이게 맞나요?" 네 그렇게 이해하시면 됩니다. HttpSecurity 생성방식 네 기본적으로 AnonymousAuthenticationProvider 와 DaoAuthenctionProvider 를 가지고 있습니다. AnonymousAuthenticationProvider 는 기본 ProviderManager 가 가지고 있고 DaoAuthenctionProvider 는 기본 ProviderManager 의 parent 속성에 저장된 또 다른 ProviderManager 가 가지고 있습니다.
- 0
- 2
- 94
질문&답변
2024.06.27
JSP를 사용하는 경우 정적 자원 보호를 어떻게 설정해야 하나요?
보통 클라이언트에서 /WEB-INF/* 경로를 바로 접근하지 못하기 때문에 WEB-INF 설정은 필요하지 않을 것 같습니다. requestMatchers 는 클라이언트의 요청에 대한 심사를 하기 때문에 서버 내부적으로 포워딩하는 WEB-INF 설정은 별도로 필요하지 않습니다. 그리고 jsp 는 컨트롤러에서 요청을 받아 뷰로 반환하는 시점에 일어나기 때문에 스프링 시큐리티의 필터체인에 걸리지 않습니다
- 0
- 2
- 88
질문&답변
2024.06.27
HttpSecurity bean을 생성하는 메소드
네 초기화 시 여러번 호출되고 있습니다. 다만 맨 마지막에 호출되는 객체가 실행 시 사용되고 있습니다. HttpSecurity 는 scope 가 prototype 이기 때문에 호출될 때마다 새로운 빈이 생성되어서 객체간 간섭이 있지는 않습니다. 여러번 호출되는 명확한 이유는 저도 잘 모르겠으나 버그 혹은 오류는 아닌 것 같습니다. 내부적으로 실행되어지는 흐름인 것 같습니다. this 참조가 가리키는 객체가 변경되는 것도 여러개의 객체가 실행되고 있기 때문일 수 있습니다. 전반적으로 HttpSecurity 의 흐름을 이해하는 것에 의미를 두시면 될 것 같습니다.
- 0
- 2
- 94
질문&답변
2024.06.27
커스텀 인증상세 구현하기 - WebAuthenticationDetails / AuthenticationDetailsSource 강의 중 질문이 있습니다
사실 보안에 중요한 데이터는 위와 같이 보내는 것은 지양해야 합니다. 만약 보낸다면 서버에서 암호화 해서 보내고 다시 SSL 로 전송하는 식으로 해야 합니다. 그래서 중요한 데이터 보다는 비 보안 데이터 통신 시 활용하는 것이 좋습니다.
- 0
- 2
- 87
질문&답변
2024.06.27
invalidateHttpSession, clearAuthentication 메서드에 관하여
네 맞습니다. 스프링 시큐리티에서 Authentication 은 SecurityContext 에 저장되고 SecurityContext 은 스레드 로컬에 저장됩니다. 그리고 기본적으로 SecurityContext 은 세션에 저장됩니다. 세션에 저장되는 이유는 사용자의 인증 상태를 계속 유지하기 위함이고 스레드 로컬에 저장하는 이유는 각 사용자별 즉 스레드별로 인증상태를 구분하기 위함이라고 생각하시면 됩니다.
- 0
- 2
- 81
질문&답변
2024.06.27
커스텀 UserDetailService 구현하기 중 질문사항이 있습니다!
@Service어노테이션으로 인해 이미 빈으로 등록되어서 .userDetailsService(userDetailsService) 을 쓰지 않아도 자동으로 등록이 되는걸로 알고있었는데 코드를 쓰는 이유가 있나요? 네 좀 더 명확하게 설정하기 위함입니다. 그리고 그렇게 하면 코드를 보고 쉽게 이해할 수 있습니다. 왜 @Service 이름을 " userDetailsService" 로 하신건지 궁금합니다. 네 그건 특별한 이유는 없습니다. 관례적으로 많이 쓰는 이름이기 때문입니다. 이름은 자유롭게 사용해서 됩니다. SecurityConfig 에서 private final UserDetailsService userDetailsService; 에서 FormUserDetailsService 대신 UserDetailsService 을 쓰는 이유가 뭔지 궁금합니다. (그냥 클래스를 그대로 쓰면 안되는건가요?) 네 상관없습니다. 다만 구체적인 클래스 타입보다는 인터페이스처럼 추상화된 타입을 사용하것이 좀 더 객체지향적으로 좋은 코드라 보시면 됩니다. 다만 어떤 특정한 상황에서는 구체적인 클래스 타입으로 설정해야 할 때도 있습니다.
- 0
- 2
- 71
질문&답변
2024.06.27
질문있습니다
FilterChainProxy 는 여러개가 아닌 하나의 객체가 생성됩니다. CompositeFilterChainProxy 는 이번에 새롭게 추가된 클래스인데 내부적으로 FilterChainProxy 를 참조하고 있습니다. FilterChainProxy 는 여러개의 SecurityFilterChain 를 가지고 있으면서 클라이언트이 요청에 따라 적절한 객체를 선택해서 보안 과정을 거치게 합니다. CompositeFilterChainProxy 에 대해서는 그렇게 깊이 알고 있지 않아도 될 것 같습니다.
- 0
- 2
- 103