Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE_5] JwtProperties 중앙 관리 & JwtFilter를 통한 토큰 검증 & 엑세스, 리프레쉬 기능 분리 & User별 JPA Generic 레포 변경 #62

Closed
pjhcsols opened this issue Aug 21, 2024 · 1 comment · Fixed by #83
Assignees
Labels
Refactor 코드리팩토링

Comments

@pjhcsols
Copy link
Owner

pjhcsols commented Aug 21, 2024

Refactor: JwtFilter를 통한 토큰 검증 & 엑세스, 리프레쉬 기능 분리 & User별 JPA Generic 레포 변경[박한솔]
pjhcsols

Feat: JwtProperties 중앙 관리 & 리프레쉬 토큰 로직 작성[박한솔]

  1. Jwt 관련 중앙 관리와 jwt 필터를 통한 토큰 검증과정에서 엑세스 토큰에 특정 클레임이 포함되어있다.
    특정 클레임이 없으면 권한이 없음을 제어를 할수있다. (리프레쉬, 엑세스 토큰의 기능 분리)

  2. User별 JPA Generic 레포 변경 리펙토링

다음은 OAuth 2.0 & JWT 기반 인증 시스템의 Spring Security Filter 인증 구조 다이어그램입니다. 이 다이어그램에서는 유저별 역할(Role) 을 나누고, JWT 기반의 인증 과정에서 어떤 흐름으로 요청이 처리되는지 시각적으로 표현하였습니다.


다음은 Spring MVC에서 Servlet Request 흐름을 기준으로 Filter → DispatcherServlet → Interceptor → AOP → Controller → Servlet Response의 실행 순서와 역할을 정리한 다이어그램 및 설명입니다.


📌 Spring MVC 요청 처리 흐름 (Servlet Request → Response)

┌───────────────┐
│ ServletRequest │  (HTTP 요청)
└──────▲────────┘
       │
       ▼
┌───────────────────┐
│      Filter       │  (인증, 로깅, CORS, JWT 검증)
│ (ex: JwtFilter)   │
└────────▲─────────┘
         │
         ▼
┌──────────────────────────────┐
│     DispatcherServlet        │  (요청을 적절한 컨트롤러로 전달)
│  (Spring MVC 핵심 컨트롤러)  │
└────────▲────────────────────┘
         │
         ▼
┌───────────────────────────┐
│       Interceptor         │  (권한 체크, 세션 검사, 로깅)
│ (preHandle)               │
└────────▲─────────────────┘
         │
         ▼
┌───────────────────────────┐
│       AOP (Aspect)        │  (트랜잭션 관리, 로깅, 성능 모니터링)
│ (@Around, @Before, @After)│
└────────▲─────────────────┘
         │
         ▼
┌───────────────────┐
│   Controller      │  (실제 요청 처리)
│ (@RestController) │
└────────▲─────────┘
         │
         ▼
┌───────────────────┐
│ ServletResponse   │  (HTTP 응답)
└───────────────────┘

📌 각 단계별 역할

단계 설명
1️⃣ Filter - 가장 먼저 실행되는 요청 필터
- 보안, 인증, CORS 설정, 로깅 수행
- (예: JwtFilter에서 JWT 검증)
2️⃣ DispatcherServlet - Spring MVC의 핵심 컨트롤러 역할
- 요청을 해당하는 컨트롤러로 전달
3️⃣ Interceptor - 컨트롤러 실행 전/후 로직 수행
- preHandle() → 요청 전
- postHandle() → 응답 후
- afterCompletion() → 완료 후 로깅
4️⃣ AOP (Aspect Oriented Programming) - 비즈니스 로직과 분리된 횡단 관심사 처리
- 로깅, 트랜잭션 관리, 성능 모니터링 등 수행
5️⃣ Controller - 실제 비즈니스 로직 실행
- API 요청 처리 후 데이터 반환
6️⃣ ServletResponse - 클라이언트에게 최종 응답 전달

📌 각 단계에서 수행되는 작업 예시

단계 주요 작업 예시
Filter JwtFilterAuthorization 헤더에서 JWT 검증
DispatcherServlet 요청을 적절한 컨트롤러로 라우팅
Interceptor (preHandle) 사용자 세션 체크, 권한 확인, 로그 기록
AOP (@around, @before, @after) 트랜잭션 관리, 성능 모니터링, 감사 로깅
Controller 클라이언트 요청을 처리하고, DB에서 데이터를 가져와 응답 생성
Interceptor (postHandle, afterCompletion) 응답 후 추가 로깅 및 성능 분석
ServletResponse JSON 데이터 또는 HTML 반환

📌 실제 흐름 예시 (JWT 기반 인증 + AOP + Interceptor 포함)

1️⃣ 사용자가 API 요청 (/user/profile)을 보냄

  • GET /user/profile HTTP 요청 발생

2️⃣ Filter 실행 (JwtFilter)

  • HTTP 요청 헤더에서 Authorization: Bearer <JWT> 확인
  • JWT가 유효하지 않으면 401 Unauthorized 반환
  • 유효하면 요청을 DispatcherServlet으로 전달

3️⃣ DispatcherServlet이 적절한 Controller로 라우팅

  • /user/profile 경로를 처리할 UserController를 찾음

4️⃣ Interceptor (preHandle()) 실행

  • 사용자의 세션 정보 확인
  • 필요한 경우 403 Forbidden 응답 반환

5️⃣ AOP 실행 (@Around)

  • 트랜잭션 시작 (@Transactional)
  • API 응답 시간 측정 (로깅)

6️⃣ Controller (UserController) 실행

  • 현재 로그인된 사용자의 프로필 데이터를 조회하여 반환

7️⃣ Interceptor (postHandle() & afterCompletion()) 실행

  • API 응답을 로깅
  • 요청 처리 완료 후 정리 작업 수행

8️⃣ ServletResponse가 클라이언트로 응답 전달

  • JSON 데이터 반환: { "id": 1, "name": "John Doe" }

📌 핵심 정리

FilterDispatcherServletInterceptorAOPControllerInterceptorServletResponse 흐름으로 동작
Filter: 보안, 인증 (JWT 검증)
Interceptor: 요청 전/후 작업 (세션 체크, 로깅)
AOP: 공통 관심사 처리 (트랜잭션, 성능 모니터링)
Controller: 비즈니스 로직 실행 후 응답 반환

이 구조를 기반으로 Spring Security, JWT, AOP, Interceptor를 조합하여 최적화된 API 인증 시스템을 설계할 수 있습니다! 🚀

🛠 인증 구조 다이어그램

┌──────────────────────────────────────────┐
│         사용자 (Client)                  │
│    ────────────────────────              │
│   1️⃣ 로그인 요청 (ID/PW)                │
└──────────────────────────────────────────┘
                 │  
                 ▼  
┌──────────────────────────────────────────┐
│        Spring Security (Filter Chain)     │
│  ───────────────────────────────────────  │
│   2️⃣ JWTFilter: HTTP 요청 헤더에서      │
│      Authorization 헤더 검증              │
│   3️⃣ JwtUtil.validateToken() 호출       │
│      - 유효한지 검사                       │
│      - 블랙리스트 검증                     │
│      - 만료 여부 확인                      │
└──────────────────────────────────────────┘
                 │  
                 ▼  
┌──────────────────────────────────────────┐
│         JWT Access Token 검증              │
│  ───────────────────────────────────────  │
│   4️⃣ JwtUtil.getUserId() 호출하여        │
│      유저 ID 추출                          │
│   5️⃣ Claims에서 role(권한) 확인         │
│      - USER / ADMIN / MANAGER 등          │
│   6️⃣ UsernamePasswordAuthenticationToken │
│      을 생성하여 SecurityContext에 저장   │
└──────────────────────────────────────────┘
                 │  
                 ▼  
┌──────────────────────────────────────────┐
│       요청된 서비스 (API Controller)       │
│  ───────────────────────────────────────  │
│   7️⃣ 인증이 완료되면 요청 처리 진행      │
│   8️⃣ 권한이 필요할 경우                  │
│      @PreAuthorize("hasRole('ADMIN')")     │
│      등을 통해 접근 제어                   │
│   9️⃣ 정상적인 응답 반환                   │
└──────────────────────────────────────────┘
                 │  
                 ▼  
┌──────────────────────────────────────────┐
│        사용자 (Client)                   │
│  ───────────────────────────────────────  │
│  🔟 API 응답 받음                         │
└──────────────────────────────────────────┘

📝 설명

  1. 사용자가 로그인 요청을 보냄 (/auth/login)
  2. Spring Security Filter에서 JwtFilter가 실행됨
  3. Authorization 헤더에서 JWT를 추출하여 검증 진행
  4. JwtUtil.validateToken()을 호출하여 유효한 JWT인지 확인
    • 유효하지 않은 경우: 401 Unauthorized 반환
    • 블랙리스트 토큰이면: 401 Unauthorized 반환
    • 만료된 토큰이면: 401 Unauthorized 반환
  5. JwtUtil.getUserId()를 사용하여 유저 ID를 가져옴
  6. JWT Claims에서 role을 확인하고, SecurityContext에 UsernamePasswordAuthenticationToken을 저장
  7. 요청된 API 컨트롤러로 접근 시도
  8. 접근 제어 (Authorization) 적용
    • @PreAuthorize("hasRole('ADMIN')")
    • @PreAuthorize("hasRole('USER')")
  9. 인증 및 권한 체크가 완료되면 요청 처리
  10. 클라이언트가 API 응답을 수신

🔑 유저별 역할(Role)

역할(Role) 설명
USER 기본 사용자 권한 (일반적인 API 사용 가능)
ADMIN 관리자 권한 (모든 API 접근 가능)
MANAGER 특정 리소스 관리 가능 (예: 주문 승인)
GUEST 인증되지 않은 사용자 (일부 API 제한됨)

🛠 JWT 토큰 검증 관련 주요 체크 사항

JwtFilter에서 토큰을 검증할 때:

  • Authorization 헤더 확인
  • JWT 서명(Signature) 검증
  • 토큰 만료 여부 확인
  • 블랙리스트 여부 확인
  • role(권한) 확인 후 SecurityContext에 저장

JwtUtil을 통한 토큰 생성 시:

  • AccessTokenRefreshToken을 분리
  • role을 Claim에 포함하여 유저별 권한을 다르게 설정

이 다이어그램과 설명을 기반으로 OAuth 2.0 & JWT 기반 인증 시스템의 동작 방식을 쉽게 이해 가능🚀**

@pjhcsols
Copy link
Owner Author

🚀 온프레미스 백엔드 서버 보안 아키텍처 및 동작 방식

온프레미스 환경에서 백엔드 서버를 운영할 때 보안 장비 및 계층별 보안 정책을 적용해야 합니다. 아래는 네트워크 → 애플리케이션 서버 → 컨트롤러까지의 보안 흐름 및 주요 보안 장비를 정리한 내용입니다.


✅ 1. 보안 장비 및 계층별 역할

온프레미스 환경에서 보안을 강화하기 위해 아래 5가지 핵심 보안 계층을 도입합니다.

보안 계층 보안 장비 및 기술 역할
1️⃣ 네트워크 보안 계층 방화벽 (Firewall), IDS/IPS, VPN, WAF 외부 공격 차단 및 패킷 모니터링
2️⃣ 시스템 보안 계층 HSM, 보안 OS 설정, SELinux, 파일 무결성 검사 OS 및 시스템 내부 보호
3️⃣ 애플리케이션 보안 계층 Spring Security, OAuth2, JWT, 인증 및 접근제어 사용자 인증 및 권한 관리
4️⃣ 데이터 보안 계층 TLS/SSL, DB 암호화, 백업 및 재해 복구(DR) 데이터 보호 및 암호화
5️⃣ 모니터링 및 로깅 계층 SIEM, 로그 분석, Security Auditing 실시간 감시 및 위협 탐지

✅ 2. 보안 장비 동작 방식 및 요청 흐름

온프레미스 서버에서 외부 요청이 들어와 컨트롤러에 도달하기까지의 보안 검증 과정을 아래의 6단계 흐름으로 정리했습니다.

📌 1️⃣ 네트워크 보안 계층 (외부 → 내부 접근 제한)

  1. 방화벽 (Firewall)

    • 외부 네트워크에서 내부로 들어오는 모든 트래픽을 IP 및 포트 단위로 제한
    • 허용된 IP, VPN 사용자, 특정 서비스(예: 443 HTTPS)만 접속 가능
  2. IDS/IPS (침입 탐지 및 방지 시스템)

    • 네트워크 패킷을 실시간으로 분석하여 비정상적인 트래픽 감지 및 차단
    • SQL Injection, XSS, DDoS 공격 탐지
  3. VPN (Virtual Private Network)

    • 내부 서비스 접근 시 VPN을 통해 안전한 터널링 연결
    • 직원 및 특정 사용자만 접근 가능하도록 제어
  4. WAF (Web Application Firewall)

    • HTTP/HTTPS 기반의 웹 요청을 SQL Injection, XSS, CSRF 공격으로부터 보호
    • 요청 헤더 및 바디를 분석하여 비정상적인 요청 차단

📌 2️⃣ 시스템 보안 계층 (서버 내부 보호)

  1. 보안 운영체제 설정 (SELinux, UFW)

    • 불필요한 포트 및 서비스 차단
    • 특정 프로세스만 시스템 자원 접근 가능하도록 제한
  2. HSM (Hardware Security Module) → TLS/SSL 키 관리

    • HSM을 통해 암호화 키 및 TLS 인증서 관리
    • 민감한 데이터 암호화 및 서명 생성

📌 3️⃣ 애플리케이션 보안 계층 (API 요청 인증 및 검증)

  1. Spring Security + OAuth2 + JWT 인증

    • 사용자 인증을 위해 OAuth2 및 JWT 기반의 인증 토큰 사용
    • JWT 토큰을 검증하고, 유효하지 않은 토큰(만료, 변조 등)은 차단
  2. API Gateway 및 Rate Limiting

    • API Gateway를 통해 각 API 요청을 제한(Rate Limiting)하여 악의적 요청 차단
    • Redis 기반의 요청 속도 제한 적용 (예: 사용자별 초당 10회 요청 제한)

📌 4️⃣ 데이터 보안 계층 (DB 접근 및 데이터 암호화)

  1. DB 암호화 및 접근 제어

    • MySQL, PostgreSQL의 데이터 암호화
    • AES256 및 TLS/SSL을 활용한 암호화된 데이터 전송
  2. 백업 및 재해 복구 (Disaster Recovery, DR)

  • 정기적인 데이터 백업 및 장애 발생 시 자동 복구 시스템 구축
  • Snapshot 백업, Incremental Backup 적용

📌 5️⃣ 모니터링 및 로깅 계층 (실시간 보안 감시)

  1. SIEM (Security Information and Event Management) 시스템 도입
  • 모든 보안 이벤트(로그인, DB 접근, 네트워크 활동)를 SIEM으로 실시간 분석
  • Datadog, ELK(Elasticsearch, Logstash, Kibana) 기반의 보안 로그 분석 적용
  1. 로그 감시 및 알림 시스템 (Alerting)
  • Slack, PagerDuty, Prometheus AlertManager와 연동하여 보안 이벤트 발생 시 자동 알림
  • 비정상적인 로그인 시도, API 트래픽 급증 감지

✅ 3. 전체 보안 아키텍처 다이어그램

다음은 온프레미스 백엔드 서버 보안 아키텍처 및 요청 흐름을 시각적으로 정리한 다이어그램입니다.

(1) 인터넷 사용자 요청  ───────────────────────────────────────────────────────────
             │
             ▼
  ┌───────────────────────────────────────┐
  │       🔥 방화벽 (Firewall)             │  → 허용된 IP만 접근 허용
  └───────────────────────────────────────┘
             │
             ▼
  ┌───────────────────────────────────────┐
  │       🛡️  IDS/IPS                     │  → 비정상적인 트래픽 감지 및 차단
  └───────────────────────────────────────┘
             │
             ▼
  ┌───────────────────────────────────────┐
  │       🔑 VPN / WAF                     │  → 내부 접근 보안 및 SQL Injection 차단
  └───────────────────────────────────────┘
             │
             ▼
  ┌───────────────────────────────────────┐
  │   🚀 API Gateway (Spring Boot)         │  → 요청 속도 제한 및 API 인증
  └───────────────────────────────────────┘
             │
             ▼
  ┌───────────────────────────────────────┐
  │       🏗️  Spring Security + JWT       │  → 사용자 인증 및 권한 검증
  └───────────────────────────────────────┘
             │
             ▼
  ┌───────────────────────────────────────┐
  │       💾  Database (MySQL, PostgreSQL) │  → AES256 암호화 저장 및 접근 제어
  └───────────────────────────────────────┘
             │
             ▼
  ┌───────────────────────────────────────┐
  │       📊 SIEM + 모니터링 시스템        │  → 실시간 보안 이벤트 감지 및 알림
  └───────────────────────────────────────┘

✅ 4. 보안 시스템 최적화 전략

  • 🚀 최소 권한 원칙 적용 (Principle of Least Privilege, PoLP)
    • 불필요한 접근을 차단하고 각 사용자에게 필요한 최소한의 권한만 부여
  • 🔐 보안 자동화 (Security Automation)
    • 보안 로그를 ELK Stack, SIEM, Datadog으로 자동 분석하고 위협 탐지
  • 📡 AI 기반 이상 탐지 (Anomaly Detection)
    • 머신러닝을 활용하여 비정상적인 로그인 및 트래픽 이상 감지

✅ 결론

온프레미스 환경에서 백엔드 서버의 보안을 강화하려면 방화벽, IDS/IPS, VPN, HSM, SIEM, API Gateway, 데이터 암호화 등의 다중 보안 계층을 적용해야 합니다.

또한 Spring Security + JWT/OAuth2 인증, WAF 보호, 실시간 로그 분석을 통해 실제 공격에 대한 대응력을 극대화할 수 있습니다. 🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment