Spring Boot JDBC/이론정리

JWT를 이용한 자바 보안 시스템 설정

qoeka 2024. 12. 26. 19:52

 

 

1. JWT (JSON Web Token)

 

JWT는 인증 정보를 JSON 형식으로 담고, 이를 인코딩한 토큰이다.

JWT는 인증서를 대신하는 디지털 신분증 같은 것이다.

헤더는 신분증의 표지이고, 페이로드는 신분증 안의 개인 정보이며, 서명은 위조 방지를 위한 보안 도장이다.

서버가 사용자에게 신분증을 발급하고, 사용자는 이 신분증을 가지고 요청을 보낸다.

 

 

역할: 사용자의 인증 상태를 유지하는 데 사용된다.

구성: Header(헤더), Payload(내용), Signature(서명)으로 이루어진다.

 

장점 단점

무상태 인증: 서버는 세션을 저장하지 않아도 되어 확장성이 뛰어나다.

사용 편의성: 클라이언트가 토큰을 보유하므로 요청마다 재인증할 필요가 없다.

유연성: JSON 형식으로 정보가 포함되어 있어, 다양한 애플리케이션 시나리오에 활용 가능하
보안 리스크: 토큰 탈취 시 유효기간 동안 악용될 가능성이 있다.

크기 문제: 페이로드 크기가 커질수록 네트워크 트래픽에 영향을 줄 수 있다.

토큰 갱신: 토큰 만료 후 갱신 메커니즘이 필요하다.

 

2. JwtConfig (JWT 설정)

 

JwtConfig는 JWT 관련 설정을 정의한 클래스이다.

JwtConfig는 신분증을 발급할 때의 규칙을 정리한 매뉴얼 같은 것이다.

신분증의 유효 기간, 발급 기관, 보안 도장 방식 등을 기록해 두는 설명서이다.

이 매뉴얼에 따라 신분증을 발급하고 확인한다.

 

예시 설정 항목:

토큰 유효기간

서명 키(secret key)

토큰 헤더 이름 등

목적: JWT를 효율적으로 관리하기 위한 기본 환경을 설정한다.

 

 

 

 

3. SecurityConfig (보안 설정)

 

 

SecurityConfig는 Spring Security의 설정을 담당하는 클래스이다.

SecurityConfig는 건물의 보안 시스템을 관리하는 관리자 같은 것이다.

특정 구역에 누가 들어갈 수 있는지 정하고, 출입문에서 인증 절차를 설정한다.

방문객이 신분증(JWT)을 보여주면, 이 신분증이 유효한지 확인하고 출입을 허락한다.

 

 

주요 역할:

사용자 인증 및 권한 부여를 설정한다.

특정 URL에 대한 접근 제한을 걸 수 있다.

JWT 필터의 적용 위치를 정의한다.

구현 방법: @EnableWebSecurity와 함께 설정 클래스를 생성한다.

 

 

JwtConfig & SecurityConfig

장점 단점


구조화된 설정: JWT 관련 설정과 보안 규칙을 분리하여 코드 가독성이 높아진다.

커스터마이징 가능: 애플리케이션의 요구 사항에 맞게 인증 및 권한 부여를 쉽게 설정할 수 있다.

Spring Security 통합: 보안 설정이 표준화되어 있어 유지보수가 용이하다.


초기 복잡성: 설정이 많아지면 초기에 복잡하게 느껴질 수 있다.

학습 필요성: Spring Security와 JWT에 대한 기본 이해가 필요하다

 

4. JwtAuthenticatingFilter (JWT 인증 필터)

 

JwtAuthenticatingFilter는 HTTP 요청에서 JWT를 확인하고 인증을 처리하는 필터이다.

JwtAuthenticatingFilter는 건물 입구에서 신분증을 검사하는 경비원 같은 것이다.

방문객이 신분증을 제시하면, 유효한지 확인한 후 출입 여부를 결정한다.

가짜 신분증이나 유효 기간이 지난 신분증은 거부한다.

 

역할:  HTTP 요청 헤더에서 JWT를 추출한다.

JWT 유효성 검사 및 사용자 인증 정보를 설정한다.

적용 시점: Spring Security 필터 체인에 추가된다.

 

 

장점 단점


요청 필터링: 각 요청마다 토큰을 확인하여 인증 상태를 유지한다.

유연성: 다양한 인증 로직을 추가할 수 있다.
보안 강화: 헤더에서 JWT를 확인해 요청을 차단하거나 허용할 수 있다.

오버헤드: 매 요청마다 필터링 로직을 실행하므로 성능 저하가 발생할 수 있다.


구현 복잡성: 잘못 구현하면 인증 과정에서 문제가 생길 수 있다.

 

 

 

 

 

5. EmailValidator (유틸 클래스)

 

EmailValidator는 이메일 형식이 유효한지 확인하는 유틸리티 클래스이다.

EmailValidator는 초대장에 적힌 이메일 주소가 정확한지 확인하는 검수자 같은 것이다.

초대장을 받을 사람의 이메일 주소가 올바른 형식인지 확인한다.

주소가 잘못된 경우, 초대장을 발송하지 않는다.

 

기능:

정규표현식을 사용하여 이메일 형식을 검사한다.

회원가입 또는 사용자 인증 단계에서 유효성을 검증한다.

 

장점 단점

유효성 검사: 이메일 형식을 검증하여 잘못된 데이터 입력을 방지한다.

간단한 구현: 정규표현식을 사용하여 쉽게 구현할 수 있다.

보안성 강화: 입력 데이터의 무결성을 높여 SQL Injection 같은 공격을 방지한다.
정확성 제한: 정규표현식으로만 이메일 형식을 검사하므로, 실제 사용 가능한 이메일인지 확인하지 못한다.

추가 검증 필요: 이메일 서버 또는 도메인 유효성을 검사하려면 추가 구현이 필요하다.

 

 

 

 

 

 

 

 

6. pom.xml

pom.xml은 Maven 프로젝트의 설정 파일이다.

pom.xml은 건물을 짓기 위해 필요한 자재 목록과 설계도를 담은 문서 같은 것이다.

건축에 필요한 재료(Spring Security, JWT 라이브러리 등)를 관리한다.

설계도대로 건물을 짓고 유지보수하는 데 도움을 준다.

 

 

역할:

프로젝트 의존성을 관리한다 (e.g., Spring Security, JWT 라이브러리).

빌드, 테스트, 배포와 관련된 설정을 정의한다.

 

예시 의존성:

spring-boot-starter-security

jjwt (JWT 라이브러리)

 

장점 단점

의존성 관리: 프로젝트에 필요한 모든 라이브러리를 쉽게 관리할 수 있다.

표준화: 빌드, 테스트, 배포 과정을 자동화하여 생산성을 높인다.

호환성: Maven 중심의 생태계를 활용할 수 있다.

복잡성: 큰 프로젝트에서는 의존성이 많아져 관리가 어려울 수 있다.

의존성 충돌: 서로 다른 버전의 라이브러리 간 충돌이 발생할 수 있다.

초기 설정 부담: 프로젝트 시작 시 적절한 의존성을 찾아 설정하는 데 시간이 필요하다.

 

 

 

 

요약

위 요소들은 유기적으로 작동하여 보안성이 높은 시스템을 구축할 수 있는 도구이다. 초기 학습 곡선과 설정 복잡성이 단점으로 작용하지만, Maven과 Spring Security를 활용하면 이를 보완할 수 있다. 이 시스템은 신분증(JWT)을 기반으로 건물(SecurityConfig) 출입을 관리하며, 경비원(JwtAuthenticatingFilter)이 신분증을 검사한다. 설계도(pom.xml) 매뉴얼(JwtConfig)을 참고하여 효율적이고 안전한 보안을 제공한다. 모든 구성 요소는 유기적으로 작동하며, Spring Security와 Maven을 통해 유지보수와 확장이 용이한 환경을 만든다.