프로그램/Web

온라인강좌 사이트 만들기 restart 로그인,공통코드(2025.04.08~)

대박당 2024. 11. 19. 09:40
728x90
더보기

 잠시 개인 사정으로 머리를 식히고 다시 개인 프로젝트 시작합니다.

( 2024.11.08~ 1W : 신규프로젝트 투입으로 중지)

( 2025.04.08~ 진행중)

 멈춰서서 돌아보고 추진력이 없으면 수입이 들어오기 어렵다는 것을 알고 프로그램을 완성 못하는 솔루션을 경험도 해봤지만, 추진력을 예측만하고 프로그램을 완성해야 하는 경우도 경험해 봤습니다.

 이번 개인프로젝트는 요청이 들어왔지만 개인적 확인을 목적도 있었기 때문에 더욱 빨리 완성할 수 있다고 생각했습니다. 솔루션 개발시 늘 경험을 하듯 어떤 원인으로든 추진력을 잃어버리고 방황하는 시기를 볼 수 있는데 개인 프로젝트에서도 ...

 중요한 것은 다시 시작하기!!! 칠전팔기 정신으로 다시 정리하면서 시작하려합니다.

 이번에 할것은 로그인 처리와 공통코드 메모리 업데이트 관리부터 접근해 봅시다.

 

※ 최신버전도 좋지만 버전변경 점을 확인하고 적용해야 함으로 버전을 유지

  spring boot version 3.3.3   ( spring.io 에 3.3.5 버전가이드가 나와있네요. )

  spring security version 6.3.X

  ( thymeleaf-extras-springsecurity6:3.1.2release )

  흠음 spring AI 메뉴가 추가 되어 있네요. 개인 플제 간단하게 하고 spring.io 사이트 공부 다시 해야 겠네요. ai 시대에 맞춰서 변경된 것이 있는것 같습니다.

 

 spring boot 에서 security 관련된 것은 사전에 정의된 filter 를 재정의해서 사용하면 되기 때문에 버전별 사용가능한 필터를 알고 있어야 하기 때문에 사용하는 버전의 필터를 정리해 봅시다. 주 사용은 로그인 예외페이지 설정, 로그인 정보 관리하는 것, 그외 api 연동등 port나 url 접근 허용 처리 입니다.

 

SAML 추후 확장을 고려해서 검토

더보기

SAML( Security Assertion Markup Language) : 외부 애플리케이션 및 서비스에 사용자가 자신이 누구인지 알려주는 표준화된 방법으로 사용자를 한번 인증한 다음 해당 인증을 여러 애플리케이션에 전달하는 방법을 제공하여 SSO(Single Sign-On) 기술을 가능하게 합니다. 

SAML인증은 id 공급자를 활용하여 광범위한 비제휴 웹사이트에서 사용자를 중심적으로 인증하는 신원 확인 방법으로

신뢰할 수 있는 단일 ID 공급자에게 인증 프로세스를 전달함으로써 기업은 다양한 보안 및 관리, 비용 절감 이점을 달성할 수 있으며, 특히 사용자에게서 수십 개의 사로 다른 사용자 이름과 비밀번호를 관리할 필요성을 줄여줍니다.

SAML 최신버전은 2.0으로 2005년부터 사용되고 있습니다.

 

SAML 인증 작동 원리

1. SAML 인증을 이용하면, 사용자가 앱에 접근할 때마다 SAML ID 공급자가 인증 프로세스를 전달받습니다.

2. 사용자가 자격증명(예: 비밀번호, OTP, 컨텍스트 속성)을 입력하면 ID 공급자가 확인합니다.

3. ID공급자가 SAML 표명(assertion) 형식으로 접근 또는 거부 응답을 반환합니다.

인증에 성공하면 사용자에게 리소스에 대한 접근 권한을 부여하고 그렇지 않으면 권한을 거부합니다.

 

유저 -> login ->

 

https://github.com/spring-projects/spring-security-samples/tree/main/servlet/java-configuration/saml2/login

1. 로그인 기본 필터  

더보기

필터 기본 구조

 

https://docs.spring.io/spring-security/reference/servlet/architecture.html

 

Multiple SecurityFilterChain

 

Authentication Architecture

 이중에 우리가 사용할 것은 SecurityFilterChain를 통해서 authorize와 login, session를 관리하고 인증(Authentication)처리를 UserDetailsService를 구현하여 처리할 것입니다.

 추후 인증 성공/실패 핸들러를 구현하고 기억처리도 할 예정입니다.

2. 로그인처리 과정

더보기

 다양한 필터와 전처리 후처리를 사용가능하나 기본 정의 되어 있는 것을 사용 기준으로 로그인한 유저 정보로 인증처리를 다음과 같이 한다고 보면 됩니다.

SecurityFilterChain -> formLogin -> Authentication () -> session create -> SecurityContextHolder

 

 요약하면 세션에 userdetails를 상속받은 객체를 저장한다고 보면 되고 그것을 위해 UserDetailsService와 UserDetails 상송받은 User정보 저장객체를 만들것입니다.

- SecurityContextHolder = 시큐리티 인메모리 세션 저장소

- security_session에 athentication 타입 객체로 user정보가 UserDetails타입 개체로 들어간다.

 개념은 접어두고 구현 항목을 적어보자. 참고로 개념이 더 중요하다 전체 filter와 처리 프로세스를 알고 있다면 처리를 다른 곳에서 처리하는 방법도 고려할 수 있기 때문이다.

(2025..4.10 예제코드 구현부분 참고용으로 정리 )

  -- SecurityConfig.java

 @Bean PasswordEncoder 선언

 인증예외페이지 등록 : login 페이지 필수

 cors 예외 주소 등록 : front, back 분리 개발 또는 개발서버와 로컬 구동등 고려

로그인, 로그아웃(세션정리까지)

필터체인에 OncePerRequestFilter 추상화 클래스를 상속받은 사용자 클래스(jwtFilter)를 UsernamePasswordAuthenticationFilter 클래스 보다 먼저 실행하도록 필터 등록

( 로그인 성공시 필요한 처리를 하는 것과 로그인 실패시 처리 추가 )

 -- jwtFilter.java

doFilterInternal 를 오버로드로 구현

HttpServletRequest 에서 토큰 정보를 가져와서 정상이면 토큰에 있는 유저 정보로 UsernamePasswordAuthenticationToken를 만들어 SecurityContextHolder에 인증정보로 등록

-- UserDetailServiceImpl.java

userDetailService를 상속받아 loaduserByusername를 오버로드구현 로그인 정보로 들어온 id로 DB조회 구현하고 조회된 유저의 UserDetails 를 구성해서 넘겨주면 화면에서 넘겨준 패스워드와 DB에서 조회한 패스워드를 다른 곳에서 비교한다. 

 이부분까지가 jwt 구성의 가장 단순정리일 것 같다. 

 

(2025..4.10 예제코드 구현부분 참고용으로 정리  AuthenticationProvider 상속한 사용자 클래스를 만들어  UsernamePasswordAuthenticationToken 를 생성해서 넘기는 방식도 있습니다.)

 

 

※ 기본 폴더구조(아키텍쳐)

더보기

src>comm>config:공통설정-Thymeleaf,security config

src>comm>service: 공통서비스

src>comm>utils: 공통유틸

 

src>업무분류폴더>controller: 개별컨트롤&서비스

src>업무분류폴더>service: 개별서비스

src>업무분류폴더>mapper: interface ( sql matching - mybatis )

 

src>repository : jpa 레파지토리 인터페이스 ( JPA 사용 )

src>model : 계층간 연결용 DTO - service data 단위, domain DB연결용 VO - domain

 

※용어 간략 설명 

※ DTO : Data Transfer Object 계층간 데이터 전달을 위한 객체로 View 모델 정도로 개념을 잡으면 편하다.

※ VO : Value Object 로 DB domain 기준으로 작성

DAO : Data Access Object 실제 DB data에 접근하기 위한 객체, Service 단과 DB 연결하는 고리 역할.

※ POJO : Plain Old Java Objects로 EJB에 대응되는 개념으로 특정 기술에 종속되어 있지 않은 순수 자바 객체로 getter, setter 만 가지고 있는 기본적인 형태의 java 객체

AOP : Apsect-Oriented Programming 관점 지향 프로그래밍, 공통 관심사를 모듈화하여 코드의 중복을 줄이고 유지보수성을 향상시키기 위한 것으로 주로 로깅, 트랜젝션 관리, 보안 등에 활용( Aspect - 공통 관심사를 모듈화한 단위 )

PSA : Portable Service Abstraction 은 개발자가 특정 기술에 강한 결합이 되지 않은 애플리케이션을 만들수 있도록 하는 설계 구조 ( etc. service interface와 service implemented 를 따로 구현하여 추상화를 사용, dbclient에서 jdbc 라이브러리를 사용하는거 )

IoC / DI : Inversion of Control - 제어의 역전, Dependency Injection - 의존성 주입

  

 

  

728x90