개발/Spring
-
[Security OAUTH2.0] Credential client, Public client개발/Spring 2024. 2. 1. 01:07
Public client front channel 요청에서 바로 엑세스 토큰을 주기 때문에 보안 레벨이 낮다. client id만 있어도 된다. 이 과정은 implicit flow라고 한다. Credential client front channel에서는 엑세스 토큰 발급을 위한 code를 내려주며, 해당 code를 back channel에서 인가서버로 요청을 보내는데 이 때 client secret을 함께 보낸다. 그러고 나서 인가 서버가 검증을 한 뒤에 엑세스 토큰을 발급해주기 때문에 보안 레벨이 높다. Authorization code flow라고 한다. 리소스 서버에 자원 요청을 할 때 엑세스 토큰을 Authorization 헤더에 Bearer 으로 해서 보낸다. 이 방법은 Bearer authen..
-
@RequiredArgsConstructor를 사용 못하는 경우개발/Spring 2023. 12. 24. 01:13
같은 타입의 빈을 복수로 정의했을 때는 모호성 에러가 발생하는데 이 때 생성자를 직접 정의해 객체를 주입할 때 @Qualifier를 사용해서 컴포넌트를 명시한다. public SecurityConfig( CustomUserDetails customUserDetails, PasswordEncoder passwordEncoder, AuthenticationDetailsSource authenticationDetailsSource, @Qualifier("customAuthSuccessHandler") AuthenticationSuccessHandler successHandler, @Qualifier("customAuthFailureHandler") AuthenticationFailureHandler failu..
-
[Spring Security5] Config에서 defaultSuccessUrl(), successHandler()의 순서 문제개발/Spring 2023. 12. 22. 16:58
successHandler()를 호출한 뒤에 defaultSuccessUrl()을 호출하니까 customSuccessHandler가 호출되지 않는 문제점이 있었다. 호출이 안 될 리 없지만 호출이 안 돼서 defaultSuccessUrl()을 들여다보니 다음과 같은 부분이 있었다. 자체적으로 successHandler()에 SavedRequestAwareAuthenticationSuccessHandler 핸들러를 넘기고 있었다. 그렇기 때문에 defaultSuccessUrl()을 호출하고 나서 successHandler()을 호출해야 한다.
-
[Spring Security5] SecurityContext에 가졌던 작은 오해개발/Spring 2023. 12. 18. 16:01
- 익명 사용자든 인증된 사용자든 매 요청 때마다 인증 객체(authentication)가 생성됨 - 인증 객체는 SecurityContext에 저장됨 - 익명 사용자의 요청일 때는 SecurityContext 객체를 만들어야 하지만, 인증 사용자는 Session에서 가져오기 때문에 미생성 - 인증 사용자는 SecurityContext 객체를 Session에 저장하지만, 익명 사용자는 Session에 저장하지 않음 - 각 요청마다 ThreadLocal이 만들어지고 SecurityContext는 각 ThreadLocal에 저장 - 이를 전역적으로 관리하는 SecurityContextHolder도 ThreadLocal에서 생성 - 이 안에서 ThreadLocal을 key, SecurityContext 객체를..
-
[Spring security5] 인증/인가에 대한 간략한 흐름개발/Spring 2023. 12. 16. 18:52
인증을 하지 않은 채로(로그인을 하지 않은 채로) 특정 자원에 접근하려고 한다면, 스프링 내부에선 어떤 흐름이 전객되는지 살펴보자. 루트 페이지로 접근했을 때의 과정이다. 1. 인가 실패이지만 익명 사용자는 조금 다른 로직을 거치게 된다 2. sendStartAuthentication() 실행 여기서 중요한 점은 reqeustCache 객체에 request를 저장한다는 점이다. 이는 인증과 인가에 성공했을 때 원래 접근하려던 url로 이동하게 하기 위함이다. saveRequest 함수 안에서 DefaultSavedRequest 객체를 만들어 해당 세션에 저장하게 되는데, savedRequest 객체 안에 요청 url이 저장되어 있다. 이는 로그인 성공 이후에 successHandler에서 이용한다. 그리..
-
내부 트랜잭션의 롤백과 외부 트랜잭션의 커밋개발/Spring 2023. 7. 6. 17:37
하나의 물리 트랜잭션(실제 commit, rollback을 수행할 수 있는 트랜잭션) 안에 두 개의 논리 트랜잭션이 있다고 가정해보자. 이 둘은 완전히 분리되어 있는 것이 아니라 하나의 트랜잭션 안에 다른 트랜잭션이 존재하는 경우다. 신규 트랜잭션을 외부 트랜잭션이라고 하고 외부 트랜잭션 안에 있는 논리 트랜잭션을 내부 트랜잭션이라고 한다. 내부 트랜잭션 생성 시 전파(propagation) 옵션을 변경하지 않는 한(기본값 REQUIRED), 물리 트랜잭션의 커밋, 롤백은 외부 트랜잭션에서만 가능하다. 기본 동작에서는 두 트랜잭션을 모두 커밋해야 물리 트랜잭션이 커밋된다. 신중하게 접근해야 할 예외 어느 한 쪽이라도 예외가 발생하면 전체 커밋이 불가능한데, 외부 트랜잭션이 롤백되는 경우는 당연히 롤백이 ..
-
트랜잭션 AOP개발/Spring 2023. 7. 6. 16:45
추상화된 트랜잭션 트랜잭션 AOP의 가장 큰 장점은 트랜잭션과 비즈니스 코드가 분리된다는 것에 있다. 역할과 기능에 따라 코드를 나눠놓으면 코드 가독성과 유지보수성이 좋아질 수밖에 없다. 실수할 여지가 줄어들기 때문에 결과적으로 생산성에 좋다. 스프링이 제공하는 트랜잭션 AOP는 추상화가 되어 있으므로 데이터 접근기술이 달라졌을 때, 트랜잭션과 관련한 코드를 직접 수정할 필요 없이 구현체만 바꾸면 된다. @Transactional 애노테이션을 이용해 트랜잭션을 편하게 적용할 수 있는데 이때 적용되는 방법이 프록시다. 스프링은 트랜잭션을 적용할 클래스의 객체를 상속받아 프록시를 생성한다. 해당 애노테이션을 클래스에 붙이든 메서드에 붙이든 어디에 붙어 있기만 하면 해당 객체의 프록시를 생성한다. 트랜잭션은 ..