Spring Security6 - Authentication(인증)
·
Spring/Spring Security
1. 인증 관련 주요 클래스와 인터페이스 및 동작원리 Authentication: 인증 요청과 인증된 주체를 나타내는 인터페이스이다. AuthenticationManager: 실제로 인증을 처리하는 인터페이스이다. UserDetailsService: 사용자의 세부 정보를 로드하는 방법을 정의한다. PasswordEncoder: 비밀번호의 암호화 또는 해싱을 처리한다. Spring Security 6의 주요 인증 방식(Basic Authentication, Form-Based Authentication, OAuth2, JWT)은 모두 AuthenticationManager를 사용한다. AuthenticationManager는 UserDetailsService를 호출하여 사용자 정보를 로드하고, Authen..
Spring Security와 CORS: 크로스 도메인 요청 처리 기법 알아보기
·
Spring/Spring Security
웹 애플리케이션을 개발하면서 보안과 리소스 공유는 중요한 고려사항이다. 이번에는 Spring Security와 CORS(Cross-Origin Resource Sharing)에 대해서 자세히 알아보자 1. 크로스 도메인(Cross-Domain) 이해하기 1-1. 크로스 도메인 정의: 크로스 도메인은 한 도메인에서 실행되는 웹 페이지가 다른 도메인의 리소스에 접근할 때 발생하는 상황을 의미한다. 예시: http://domain-a.com에서 로딩된 웹 페이지가 http://domain-b.com의 이미지나 API에 접근하는 것이다. domain-a.com: 여기서 로딩된 웹 페이지가 다른 도메인의 리소스에 접근하려고 한다. domain-b.com: 이 도메인은 이미지나 API와 같은 리소스를 제공한다. A..
Spring Boot 3.1 & Spring Security 6: Security Config 최적화 리팩토링 (12편)
·
Spring/Spring Security
이번에는 필요없는 필터는 없애고 최적화를 진행하기 위해 Security Config를 리팩토링 했다. 1. SecurityConfig 리팩토링 앞의 게시글을 확인해보면 작성한 코드가 있기에 변경된 메서드만 설명하겠다. 일단 나는 ssl(서버 사이드 랜더링)이기 때문에 에러페이지, 메인페이지, 회원가입, 로그인, 정적 리소스는 모두 접근을 허가해줬다. 여기서 특히 바뀐건 addFilterBefore() 이것이다. jwtAuthorizationFilter 다음 바로 customAuthenticationFilter로 가도록 했다. @Bean public SecurityFilterChain filterChain( HttpSecurity http, CustomAuthenticationFilter customAut..
Spring Boot 3.1 & Spring Security 6: JWT 검증 리팩토링 (11편)
·
Spring/Spring Security
JWT 필터 스프링 시큐리티 코드 리팩토링을 진행했다. 1. JwtAuthorizationFilter 클래스를 리팩토링 했다. 기존에는 한줄로 이루어져있던 코드를 extract method로 각각 역할별로 추출했다. import com.fasterxml.jackson.databind.ObjectMapper; import com.recipia.web.config.security.jwt.TokenUtils; import com.recipia.web.domain.user.constant.RoleType; import com.recipia.web.exception.ErrorCode; import com.recipia.web.exception.RecipiaApplicationException; import io...
Spring Security 6 이해하기: 동작 원리와 보안 기능 탐구
·
Spring/Spring Security
스프링 시큐리티가 어떻게 동작하는지 궁금해서 알아봤다. 1. 최상위 필터 인터페이스인 SecurityFilterChain 확인 package org.springframework.security.web; import java.util.List; import jakarta.servlet.Filter; import jakarta.servlet.http.HttpServletRequest; /** * Defines a filter chain which is capable of being matched against an * {@code HttpServletRequest}. in order to decide whether it applies to that request. * * Used to configure a ..
[스프링, 스프링 부트] Spring test - when()에서 발생한 에러
·
Spring/테스트 코드
Pageable 테스트를 진행하던중 에러가 발생했다. 1. 에러가 발생한 코드 확인 when(boardService.selectAllBoardList(pageable)).thenReturn(boardDtoPage); 에러 메시지는 NullPointerException이었다. 이건 when(boardService.selectAllBoardList(pageable)).thenReturn(boardDtoPage); 부분에서 모의 객체의 동작을 설정할 때 문제가 발생한 것이다. 모의 객체의 동작을 when()또는 given()으로 설정할 때, 메서드 호출에 사용되는 인자가 정확히 일치해야 한다. Pageable 인스턴스는 동일한 페이지 번호와 페이지 크기를 가지더라도 다른 인스턴스일 수 있으므로, 이로 인해 문..
[스프링, 스프링 부트] Spring - ajax로 호출하는 controller 메서드 구현방법
·
Spring/Spring 기초 지식
이번에는 javaScript에서 ajax로 컨트롤러의 메서드를 호출할때 응답을 어떤식으로 하는게 좋을지 알아보자 바로 응답 객체를 반환하냐 아니면 ResponseEntity로 감싸서 반환하냐 둘중에 뭐가 더 좋을까? 1. 바로 응답 객체를 반환 받는방식 예시코드 /** * [READ] * 각각의 게시글에 달린 대댓글을 리스트로 받아오는 컨트롤러 * ajax로 호출한다. -> 동작: 댓글 하단의 댓글보기를 클릭하면 이 컨트롤러를 통해 그 댓글의 대댓글 정보를 보여준다. */ @ResponseBody @GetMapping("/get/{boardId}") public Page getBoardSubCommentList( @PathVariable Long boardId, @PageableDefault(size =..
[스프링, 스프링부트] Spring test - 스프링 시큐리티의 authentication객체를 어떻게 사용해야 할까?
·
Spring/테스트 코드
Controller 테스트를 하면서 시큐리티의 authentication객체를 매게변수로 받아서 사용하도록 작성한 메서드에서 많은 고민을 하게되었다. 왜냐하면 테스트를 위해 이 객체를 주입해줘야 했기 때문이다. 그래서 어떻게 해결할지 고민을 했다. 1. 먼저 커스텀 Annotation을 만들어서 사용해보자는 결심이 들었다. 1-1. config 패키지에 annotation 패키지를 생성한다. 1-2. annotation패키지에 아래의 클래스들을 생성한다 InjectAuthentication - 어노테이션 클래스 /** * 시큐리티 authentication을 주입하는 커스텀 annotation */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.MET..