[SpringBoot] 게시판 API 서버 만들기 - 인증과 인가

Jae·2024년 6월 23일

spring-api-practice

목록 보기
3/3

개요

로그인된 사용자를 인증하고, 요청한 자원에 접근할 수 있는지 검증하는 부분을 개발

패키지 구조

패키지 구조는 해당 기능을 구현하면서 수정되었거나 추가된 부분만 작성하였습니다.

.
└── authplatform
    ├── advise
    │   └── ExceptionAdvice.java
    ├── configuration
    │   └── security
    │       ├── CustomAccessDeniedHandler.java
    │       ├── CustomAuthenticationEntryPoint.java
    │       ├── CustomAuthenticationToken.java
    │       ├── CustomUserDetails.java
    │       ├── CustomUserDetailsService.java
    │       ├── JwtAuthenticationFilter.java
    │       └── SecurityConfig.java
    ├── controller
    │   ├── exception
    │   │   └── ExceptionController.java
    │   ├── member
    │       └── MemberController.java
    ├── dto
    │   ├── member
    │   │   └── MemberDto.java
    │   └── sign
    │       └── RefreshTokenResponse.java
    ├── exception
    │   ├── security
    │       ├── AccessDeniedException.java
    │       └── AuthenticationEntryPointException.java
    ├── service
    │   ├── member
    │   │   └── MemberService.java
    │   └── sign
    │       ├── SignService.java
    │       └── TokenService.java
    └── utils
        └── JwtTokenUtils.java

요구사항

  • 사용자 인증 정보와 권한을 요청할 수 있는 사용자 조회 및 삭제 API
  • 사용자 조회는 권한이 없어도 조회 가능.
  • 토큰을 사용하여 권한여부를 확인하고 계정 삭제

시나리오

  1. 인증 완료된 사용자는 토큰을 가지고 API를 요청한다.
  2. 필터에서 토큰을 검증하고 토큰의 사용자 정보를 DB에서 조회하여 SecurityContext에 저장한다.
  3. 요청한 URL의 접근 허용 여부를 검사한다.
  4. 인증되지 않은 사용자는 401, 인증되었으나 권한이 없는 사용자라면 403을 응답한다.

코드

https://github.com/jaeeunjeong

학습 내용

인증과 인가

인증

사용자의 권한을 인증하는 행위

인가

사용자가 특정 리소스에 부여할 수 있는 권한을 부여하는 것.

Filter/ Intercepter

WebSecurity / HttpSecurity

Security 설정을 하게되면 Websecurity / HttpSecurity 이 두 가지를 설정하는데 각 객체가 무엇을 의미하는지 정리하였다.

WebSecurity

  • HttpSecurity의 상위 객체이며, WebSecurity의 endpoint는 Security Filter Chain이 적용되지 않기때문에 인증과 인가를 거치지 않는다.
  • 인증이나 인가가 필요하지 않은 자원에 사용된다.(error 로그인 페이지 등)
  • Web 전반적인 보안 설정을 위해 사용되기 때문에 Http 보안 기능 역시 포함되는 것!

HttpSecurity

  • HttpSecurity의 경우에는 endpoint를 무시하지만, Spring Security Filter Chain를 거치기 때문에 인증에 접근할 수 있다.
  • HttpSecurity의 경우 WebSecurity에 적용된 path가 있다면, WebSecurity에 적용된 정책을 따라간다.
  • Http 프로토콜로 통신하는 어플리케이션의 보안을 구축하기 위해 사용한다.

UserDetails/ UserDetailsService

UserDetails

  • Spring Security에서 사용자 정보를 담는 인터페이스
  • 사용자 정보를 불러오기위해 구현해야하는 인터페이스

UserDetailService

  • 인증된 사용자의 정보를 가져오는 인터페이스로 인증이 잘못되면 Bad Cridential이라는 결과를 반환한다.
  • loadUserByUsername : 사용자 정보를 담는 부분

회고

일단 사용자 정보 검증하고 권한 부여하는 것까지 이해나 확인 완료했는데 시큐리티에서 제공하는 userdatail이 기능이 되게 많고 잘 쓰면 좋을 거 같아서 저 부분에 대한 학습을 잘 하면 좋을 거 같다.

참고

https://ravthiru.medium.com/springboot-security-configuration-using-httpsecurity-vs-websecurity-1a7ec6a23273

0개의 댓글