📅 2025-12-23 개발 일지: Spring Security 보안 설정 및 SQL 심화
핵심 요약: 스프링 시큐리티를 활용한 인증·인가 체계 구축 및 SQL 서브쿼리와 상관 서브쿼리를 활용한 데이터 추출 로직 정교화
🔐 Spring Security: 보안 프레임워크 구축 및 설정
1. 보안의 핵심 개념
- 인증 (Authentication): 사용자가 누구인지 스스로 증명하는 과정 (로그인)
- 인가 (Authorization): 인증된 사용자에게 특정 리소스에 대한 권한을 부여하는 과정
- 인증 관리 체계: AuthenticationManager와 AuthenticationProvider를 통한 체계적인 인증 처리 프로세스 수행
2. 환경 설정 및 주요 구성 요소
- 의존성 추가 (pom.xml): Security Taglibs, Config, Web 라이브러리 연동
- 필터 설정 (web.xml): 보안 필터 및 필터 매핑을 통한 요청 제어
- SecurityConfig 설정:
- @EnableWebSecurity 적용을 통한 보안 기능 활성화
- BCryptPasswordEncoder: 비밀번호 암호화를 위한 단방향 해시 알고리즘 적용
- formLogin(): 기본적인 폼 기반 로그인 인터페이스 활성화
- CustomUserDetailsService: UserDetailsService 인터페이스 구현을 통해 사용자 정보를 빌드하고 인증 처리 로직 커스터마이징
3. 보안 정책 및 트러블슈팅
- CSRF (Cross-Site Request Forgery): 사이트 간 요청 위조 방지 설정
- POST 요청 제한: CSRF 설정 시 GET 방식은 문제없으나, POST 방식의 데이터 전송 시 토큰 검증 필요
🐬 SQL 실무: 조인(Join) 및 서브쿼리 심화
1. SQL 기본 구조 및 실행 순서
- 조인(Join) 기본형: INNER JOIN 및 LEFT JOIN을 활용한 테이블 간 공통 컬럼 연결
- 정렬(Order By): ASC(오름차순) 및 DESC(내림차순) 활용
- DML 작업: INSERT, UPDATE, DELETE를 활용한 데이터 조작
2. 데이터 집계 및 조합 로직
- COUNT + GROUP BY: 특정 그룹별 데이터 개수 산출
- JOIN + GROUP BY: 테이블 조인 후 그룹화하여 통계 데이터 추출
- 예: SELECT t1.ID, COUNT(*) FROM t1 LEFT JOIN t2 ON t1.ID = t2.ID GROUP BY t1.ID
3. 서브쿼리 활용 및 조건 필터링
- IN / NOT IN: 특정 목록 포함 여부 확인
- ANY / ALL: 서브쿼리 결과값의 최소값보다 큰지(ANY) 또는 최대값보다 큰지(ALL) 비교
- EXISTS / NOT EXISTS: 서브쿼리 결과의 존재 여부에 따라 참/거짓 판별 (상관 서브쿼리 활용)
- 특징: 한 줄이라도 결과가 있으면 TRUE를 반환하며, 성능 최적화에 유리
🗂️ 개발 메모 및 향후 로드맵
1. 인프라 및 빌드 환경
- 빌드의 본질: 정확한 자원 참조를 위한 경로 지정 최적화 과정
- 리눅스 및 도커: 우분투(Ubuntu) 환경 구축 및 컨테이너 기반 개발 환경 실습 예정
- 클라우드: AWS 명령어 학습을 통한 클라우드 배포 역량 강화
2. 프레임워크 종료 및 전환
- AOP (Aspect Oriented Programming): 관점 지향 프로그래밍 학습 후 스프링 프레임워크 과정 마무리 예정
- 협업 도구: 깃(Git) 배포 시 발생하는 정적 자원 경로 문제 해결 및 형상 관리 고도화
🛡️ JSTL Core 태그 3대장: 보안과 편의의 핵심 도구
핵심 요약: 해킹 방지(보안), 경로 자동 완성(편의), 데이터 배달(정확)을 담당하는 JSP 전용 기능 모음
1. <c:out> : 철통 보안 가드
- 개념: 데이터를 화면에 출력할 때 XSS(스크립트 해킹) 공격을 자동 차단하는 안전 출력 장치
- 특징:
- 이스케이프 처리: < 나 > 같은 기호를 문자로 변환하여 악성 스크립트 실행 방지
- 기본값 설정: 출력할 데이터가 없을 경우 default 속성으로 대체 문구 표시 가능
- 사용 예시:
<c:out value="${userInput}" default="내용 없음" />
2. <c:url> : 스마트 경로 내비게이션
- 개념: 웹 애플리케이션의 **컨텍스트 패스(프로젝트 경로)**를 포함한 완성형 주소 생성기
- 특징:
- 유지보수 용이: 서버 경로가 바뀌어도 소스 코드 수정 없이 유연한 대응 가능
- 자동 인코딩: URL 내 한글이나 특수문자가 깨지지 않도록 인코딩 처리 수행
- 사용 예시:
<c:url value="/main.do" var="mainPath" />
<a href="${mainPath}">홈으로 이동</a>
3. <c:param> : 데이터 배달 파트너
- 개념: URL 뒤에 붙는 쿼리 스트링(?id=123) 데이터를 안전하게 추가하는 보조 도구
- 특징:
- 종속적 사용: 단독 사용이 불가하며 반드시 <c:url>이나 <c:import> 태그 내부에 위치
- 가독성 향상: 복잡한 기호(&, ?) 없이 깔끔한 코드로 파라미터 전달 가능
- 사용 예시:
<c:url value="/list.jsp">
<c:param name="id" value="admin" />
<c:param name="page" value="1" />
</c:url>
🗂️ JSTL 태그 비교 및 핵심 요약
태그명 역할 핵심 가치
| <c:out> | 보안 출력 | 사용자 입력값 안전 노출 |
| <c:url> | 경로 생성 | 서버 환경 변화에 강한 유연성 |
| <c:param> | 변수 전달 | URL 파라미터 자동 인코딩 및 전달 |
💡 실전 조합 예시
- 시나리오: 특정 키워드로 검색된 결과 페이지 링크 생성
- 구조: <c:url> 내부에 <c:param>을 넣어 완성된 주소를 만들고, 검색어 자체는 <c:out>으로 안전하게 표시
<a href="<c:url value='/search.jsp'><c:param name='q' value='${keyword}'/></c:url>">
<c:out value="${keyword}" /> 결과 확인
</a>
'⏳ Time Log > 1. One Day (Daily · TIL)' 카테고리의 다른 글
| Day 50 (12/29) - 개발 일지: Spring AOP 심화 및 부트 환경 구축 (0) | 2026.02.23 |
|---|---|
| Day 48 (12/24) - 개발 일지: 보안 고도화 및 가상화 환경 구축 (0) | 2026.02.23 |
| Day 46 (12/22) - 개발 일지 및 학습 기록 (0) | 2026.02.23 |
| Day 45 (12/19) - 개발 일지: 프로젝트 최종 고도화 및 SQL 집중 학습 (0) | 2026.02.23 |
| Day 44 (12/18) - 개발 일지: 프로젝트 고도화 및 MySQL 집계 쿼리 (0) | 2026.02.23 |