>####
spring과 spring security적용하여 만들려고 하는데 3.0 이상으로 에노테이션도 자주 바뀌고 헷갈려서
용어와 security에 대해 정리해보려고 합니다!
@NoArgsConstructor: 주로 **JPA와** 함께 사용됨.
JPA에서의 엔티티 클래스는 기본 생성자가 필요!
DB -> ENTITY를 조회할때 **객체를 생성하고 필드를 채우기 위해 **필요함.
>@AllArgsConstructor :
모든 필드를 포함한 생성자가 필요한경우, 모든 필드를 초기화해야 하는 경우에 유용
**함께 쓰는 경우는?** : 클래스를 여러 용도로 쓸때
예를 들어, _**엔티티 클래스를 DTO로 사용하는 경우가 있는데**_
이 때는 JPA의 요구사항을 충족하기 위해 기본 생성자가 필요하고, 동시에 모든 필드를 포함한 생성자도 필요하다!
>
빌더(Builder) : 객체 생성을 단순화하고 가독성을 향상시키기 위한 디자인패턴 중 하나이다.
쓰는 이유 : 빌더 패턴은 객체의 생성 과정을 객_**체 자체가 아닌 별도의 빌더 객체에 위임하여 객체를 생성**_ 한다.
이렇게 함으로써 _**객체를 생성하는 코드가 간결하고 가독성이 높아지며, 더 많은 유연성을 제공**_ .
Security 부분
> BCryptPasswordEncoder : BCryptPasswordEncoder는 BCrypt 해싱 함수(BCrypt hashing function)를 사용해서 비밀번호를 인코딩해주는 메서드와 사용자의 의해 제출된 비밀번호와 저장소에 저장되어 있는 비밀번호의 일치 여부를 확인해주는 메서드를 제공합니다.
> UserDetails
> : Spring Security에서 사용자의 정보를 담는 인터페이스이자 사용자의 정보를 불러오기 위해서 구현해야 하는 인터페이스
UserDetailsService(prePostEnabled = true) :
Spring Security에서 유저의 정보를 가져오는 인터페이스자 유저의 정보를 불러오기 위해서 구현해야하는 인터페이스
> @EnableWebSecurity
: Spring Security를 활성화하고, 기본적인 웹 보안 구성을 제공.
예를 들어, 사용자 인증, 권한 부여, 세션 관리 등의 보안 관련 기능을 구성할 때 사용
> @EnableGlobalMethodSecurity(prePostEnabled = true) : 메소드 수준의 보안을 구성할 수 있음
prePostEnabled = true로 설정되어 있으면, 메서드 수준의 보안 애노테이션을 활성화.
주요한 애노테이션으로는
**@PreAuthorize**: 메서드 호출 전에 지정된 표현식을 사용하여 인가(Authorization) 검사.
**@PostAuthorize**: 메서드 실행 후에 지정된 표현식을 사용하여 결과를 검사
**@Secured**: 특정 역할(Role)을 가진 사용자만이 해당 메서드를 호출할 수 있도록 제한.
> AuthenticationManager : Spring Security에서 사용자의 인증(Authentication)을 관리하는 핵심 인터페이스 중 하나이며
사용자의 인증은 사용자가 제공한 자격 증명(주로 아이디와 비밀번호)을 기반으로 사용자를 식별하고 인증하는 과정을 말한다.
> .Csrf : 같은 ui에서 요청했을 때만 반환하도록 토큰을 사용
Spring Security에서는 기본적으로 제공하지만
.csrf(AbstractHttpConfigurer::disable) <- 개발단계에서는 이 로직으로 잠시 혜제
>authorizeHttpRequests : HTTP 요청에 대한 인가 설정을 사용할 때 사용되는 메소드
requestMatchers() : 메소드를 사용하여 인가를 설정해줄 수 있음
"/user/** -> 이런식으로 사용하여 user로 시작하는 경로에 대해 인가설정 가능
permitAll() : 해당 경로에 대한 모든 인가를 허용함.
hasRole()로 해도 되지만 나는 일기장을 만드는거라 권한은 필요없어서 pass 했다.
> .anyRequest().authenticated() : 요청에 대하여 인증된 사람만 접근할 수 있도록 허용하기
> ```java
.formLogin((formLogin) -> {
formLogin.loginPage("/login");
})
// /login 으로 이동하면 spring Sercurity 에서 제공하는 login form 받기 가능
```
> @Transactional : 자체적으로 커밋하고 롤백하는 과정을 해줌.
해당 어노테이션은 getConnection(), setAutoCommit(false), 예외 발생 시 롤백, 정상 종료 시 커밋 등의 필요한 코드를 삽입해준다.
>@AuthenticationPrincipal
현재 사용자의 인증된 Principal 객체에 액세스하기 위해 사용된다.
예를 들면 @AuthenticationPrincipal 어노테이션을 사용하여 현재 사용자의 UserDetails 객체를 주입받고. 이를 통해 사용자의 이름이나 권한 등의 정보를 가져와서 모델에 추가할 수 있다.
>JPA의 영속성 컨테스트
트랜잭션 안에서 데이터베이스의 데이터를 가져오면 이 데이터는 영속성 컨텍스트가 유지된 상태가 된다.이 상태에서 해당 데이터의 값을 변경하면 트랜잭션이 끝나는 시점에 변경된 데이터를 데이터베이스에 반영해준다.
**이러한 개념을 변경 감지(더티 체킹) 이라고 한다!**
> ```java
User
@Bean
AuthenticationManager authenticationManager(
AuthenticationConfiguration authenticationConfiguration) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
```
AuthenticationManager는 Spring Security에서 인증을 처리하는 핵심 인터페이스이다. 이 인터페이스는 authenticate 메서드를 통해 사용자의 자격 증명을 검증 하면서 **유효한 경우 인증된 Authentication 객체를 반환하게 된다. **
>```java
SecurityContextHolder.getContext().setAuthentication(authentication)
```
주어진 authentication 객체를 사용하여 현재 사용자의 인증 상태를 설정. 이렇게 함으로써, 사용자의 **인증 상태가 변경되더라도 인증을 새로 진행할 필요 없이 해당 변경된 인증 상태를 반영하게 된다.**
즉 사용자의 로그인 정보가 변경되거나 권한이 변경되는 경우에도 해당 코드를 사용하여 인증 상태를 업데이트할 수 있다
공부해도 공부해도 어렵다..
완결편에서는 코드에서의 전체적인 흐름을 올려보겠습니다~!
'waffle' 카테고리의 다른 글
[waffle] Triple-Jack 팀 최종정리 - Frontend (0) | 2024.04.08 |
---|---|
[waffle] 쿠라스트로 팀 최종정리 - Frontend (0) | 2024.04.07 |
[waffle] Triple-Jack 팀 중간정리 - Frontend (1) | 2024.03.27 |
[waffle] 쿠라스트로 팀 중간정리 - Frontend (0) | 2024.03.23 |
[waffle] 쿠라스트로 팀 중간정리 - ML (0) | 2024.03.16 |