My Melody Is Cute Spring Security 1
본문 바로가기

개발공부🌷/Spring Security

Spring Security 1

Spring Security란?

Spring MVC 기반 애플리케이션의 인증(Authentication)과 인가(Authorization or 권한부여)기능을 지원하는 보안 프레임워크

 

Spring Security로 할 수 있는 보안 강화기능

1. 다양한 유형(폼 로그인 인증, 토큰 기반 인증, OAuth2 기반 인증, LDAP 인증)의 사용자 인증 기능 적용

2. 애플리케이션 사용자의 역할(Role)에 따른 권한레벨 적용

3. 애플리케이션에서 제공하는 리소스에 대한 접근 제어

4. 민감한 정보에 대한 데이터 암호화

5. SSL적용

6. 일반적으로 알려진 웹 보안공격 차단

 

Principal(주체)

프로세스가 성공적으로 수행된 사용자의 계정 정보

작업을 수행할 수 있는 사용자, 또는 디바이스, 시스템등

 

Authentication(인증)

사용자가 본인이 맞음을 증명하는 절차

Credential(신원증명정보)가 필요함 - 사용자를 식별하기 위한 정보 : 주민등록증,패스워드

 

Authorization(인가, 권한부여)

Authentication(인증)이 정상적으로 수행된 사용자에게 하나 이상의 권한(authority)을 부여하여

특정 애플리케이션의 특정 리소스에 접근하게 허가하는 과정

 

Access Control(접근제어)

사용자가 애플리케이션의 리소스에 접근하는 행위를 제어하는 것

 


SSR(Server Side Rendering) 방식으로 구현된 샘플로 실습진행

Spring Security의 기본 구조와 동작방식을 이해하기 쉬운 방식이 서버에서 HTML을 만들어 클라이언트로 내려주는 SSR 방식이기때문

세션기반의 폼 로그인 방식을 적용하기 가장 적합하다

 

UserDetails

인터페이스

구현체가 필요함

SecurityConfiguration

설정 정보를 담은 클래스(인증매커니즘,접근규칙(cors),세션관리등)

JavaConfiguration

회원가입에 필요한 MemberService를 선택하는 설정정보가 담긴 클래스

 

 

 

더보기
  1. SSR (Server-Side Rendering - 서버 사이드 렌더링):
    • 서버에서 초기 페이지를 렌더링한 후, 클라이언트에게 전송합니다.
    • 브라우저가 페이지를 받으면 사용자에게 보여줍니다.
    • 초기 로딩 속도는 느릴 수 있지만, 검색 엔진 최적화(SEO)에 유리합니다.
    • React, Angular, Vue와 같은 프레임워크에서도 SSR을 지원합니다.
  2. CSR (Client-Side Rendering - 클라이언트 사이드 렌더링):
    • 초기에는 비어 있는 HTML 페이지를 받아오고, 이후 JavaScript를 사용하여 동적으로 컨텐츠를 렌더링합니다.
    • 초기 로딩 속도는 빠르지만, 검색 엔진 최적화가 어렵습니다.
    • 단일 페이지 어플리케이션(SPA)에서 주로 사용되며, React, Angular, Vue와 같은 프레임워크에서 CSR을 채택하는 경우가 많습니다.

SSR은 완성된 페이지를 만들어서 보내주며 느린 초기 로딩이지만 SEO에 좋고,

CSR은 브라우저에 빈 페이지를 먼저 보내주고, 거기에 필요한 정보를 자바스크립트로 가져와서 채워 빠른 초기 로딩이지만 SEO에는 좀 약한 특징

 

 

1. 의존 라이브러리 추가

implementation 'org.springframework.boot:spring-boot-starter-security'

 

2. Spring Security에서 제공해주는 기본 로그인정보를 사용할 수있다

user / 로그에서 나오는 password 입력해서 자격증명에 성공해야함

-> 하지만 이 방식은 매번 실행시 패스워드가 바뀌고 회원 각자의 인증정보로 로그인하는것이 불가능

 

Spring Security의 @Configuration을 통해 인증방식을 설정

SecurityConfiguration 클래스에 인증과 권한부여설정하면 됨

 

 

🌟데이터베이스 연동없는 로그인인증

Spring Security에서 지원하는 InMemory User를 사용

 

CSRF설정 비활성화

 

InMemoryUserDetailsManager 데이터베이스 연동없이 테스트

withDefaultPasswordEncoder() 테스트 환경시 사용자계정정보를 고정시켜서 사용

 

Role별로 접근권한설정

 

회원가입폼을 통한 InMemory User 등록

1. MemberService Bean등록을 위한 JavaConfiguration 구성

2. InMemoryMemberService 클래스 구현

 

🌟데이터베이스 연동을 통한 로그인인증

InMemory User는 다시 시작하면 메모리에 등록된건 모두 사라지기 때문에

회원정보를 데이터베이스를 이용해서 관리

 

Custom UserDetailsService를 이용

 

User의 Role을 DB에서 관리하기

1.User권한정보를 저장하기위한 테이블생성

2.User의 권한정보(Role)를 데이터베이스에 저장하는 작업

3.로그인 인증시 User의 권한정보를 데이터베이스에서 조회하는 작업

 

Custom AuthenticationProvider 사용하는 방법

Custom UserDetailsService를 사용해 로그인하는 방식은 내부적으로 인증을 대신 처리해주는 방식이지만

Custom AuthenticationProvider를 이용해 직접 로그인 인증을 처리

 

AuthenticationProvider 인터페이스의 구현 클래스

authenticat(Authentication authentication) 메서드와

supports(Class<?> authentication) 메서드를 구현해야 함

 

 

Custom AuthenticationProvider 이용시 인증 실패할 때

왜 "Whitelebel Error Page"가 표시될까?

더보기

 

MemberService에서 등록된 회원정보가 없으면 BusinessLogicException을 throw하는데

Custom AuthenticationProvider를 거쳐 그대로 Spring Security내부로 throw되기 때문

 

Spring Security에서는 인증 실패시 authenticationException이 throw되지 않으면

Exception에 대한 별도의 처리를 하지 않고 서블릿 컨테이너인 톰캣쪽으로 처리를 넘김

그러면 "/error" URL로 포워딩하는데 뷰페이지를 별도로 구성하지 않았기때문에 디폴트페이지("Whitelebel Error")를 표시함

 

🍀해결책 : Custom AuthenticationProvider에서 Exception이 발생할 경우

catch해서 AuthenticationException으로  rethrow해주면 됨

 

 

 

 

'개발공부🌷 > Spring Security' 카테고리의 다른 글

Spring Security JWT 인증  (0) 2023.12.13