TIL ... day 21 4주차 - Spring 6일차 프로젝트 회고… 22.06.02

BYEONGMIN CHOI·2022년 6월 2일
0

TIL(Today I Learned)

목록 보기
15/24

오랜만에 TIL을 적어봅니다. 이틀간 spring project를 마무리 하면서 발생했던 일에 대해 회고록을 작성해 볼려고 합니다.

프로젝트의 요구사항은 깃허브에 기재되어 있으므로 이슈가 발생했거나 막혔던 부분을 위주로 작성해 볼려고 합니다. JWT 와 Spring Security 를 이용한 회원가입에서 이슈가 발생하였고 토큰을 생성하고 생성한 토큰을 api로 전달하는 과정을 구현하는데 어려움을 겪었다.

또한 User와 Admin 계정을 나누는데 있어 Admin계정을 구별하지 못하였으며 게시글과 댓글의 연관관계 매핑에 있어 이슈가 있었으나 해결하였다. 이전 회고 내용 : 연관관계 매핑

Spring Security

  • 어플리케이션의 보안(인증 및 권한)을 담당하는 프레임워크

동작 위치

Tomcat

  • Tomcat은 서블릿 컨테이너라고 불리며 다양한 필터와 서블릿으로 구성되어 잇다.
  • 웹 개발 시 Dispatcher Sevlet 하위에 컨트롤러부터 시작하는 흐름을 보통 많이 다루는데 Spring Security는 필터 부분을 조작하게된다.

Spring Security

  • Spring Security가 포함된 흐름도
  • 여러가지의 필터로 이루어져 있으며 필터들이 순서대로 동작한다. 이러한 구조를 Filter Chain 구조라 한다.

Spring Security에서의 인증/ 인가

  • Spring Security는 기본적으로 인증 절차를 거친 후 인가에 대한 절차를 진행하게 되며 인가 과정에서 해당 리소스에 대한 접근 권한이 있는지 확인을 하게된다. Spring Security에서는 이러한 인증과 인가를 위해 Principal을 아이디로, Credential을 비밀번호로 사용하는 Credential 기반의 인증 방식을 사용한다.

Principal(접근 주체) : 보호받는 리소스에 접근하는 대상
Credential(비밀번호) : 리소스에 접근하는 대상의 비밀번호

SecurityContextHolder

  • SecurityContextHolder는 보안 주체의 세부 정보를 포함하여 프로그램의 현재 보안 컨텍스트에 대한 세부 정보가 저장된다. 

SecurityContext

  • Authentication을 보관하는 역할을 하며 SecurityContext를 통하여 Authentication 객체를 꺼내올 수 있다.

Authentication

  • Authentication은 현재 접근하는 주체의 정보와 권한을 담은 인터페이스이다. Authentication 객체는 SecurityContext에 저장되며 SecurityContextHolder를 통해 SecurityContext에 접근하고 SecurityContext를 통해 Authentication에 접근할 수 있다.

UsernamePasswordAuthenticationToken

  • UsernamePasswordAuthenticationToken은 Authentication을 implements한 AbstractAuthenticationToken의 하위 클래스로 User의 ID가 Principal의 역할이고 Password가 Credential의 역할을 합니다. UsernamePasswordAuthenticationToken의 첫번째 생성자는 인증전의 객체를 생성하고 두번재 생성자는 인증이 완료된 객체를 생성합니다.

AuthenticationProvider

  • AuthenticationProvider에서는 실제 인증에 대한 부분을 처리하는데 인증 전의 Authentication 객체를 받아서 인증이 완료된 객체를 반환하는 역할

Authentication Manager

  • 인증에 대한 부분은 Spring Security의 AuthenticationManager를 통해서 처리되는데 실질적으로는 AuthenticationManager에 등록된 AuthenticationProvider에 의해 처리

UserDetails

  • 인증에 성공하여 생성된 UserDetails 객체는 Authentication 객체를 구현한 UsernamePasswordAuthenticationToken을 생성하기 위해 사용

UserDetailsService

  • UserDetailsService 인터페이스는 UserDetails 객체를 반환하는데 loadUserByUsername() 메서드를 재정의하여 데이터베이스에서 유저가 있는지 확인

JWT... 다음에 이어서 정리하겠습니다.


부끄럽지만 아직 수정중인 깃헙 공유
Github : developerchoi90

profile
스스로 성장하는 개발자가 되겠습니다.

0개의 댓글