Spring Session JDBC를 활용한 SSO 기초 구현 및 트러블슈팅
작업의 진행상황은 github을 확인해주세요
GitHub : https://github.com/dopal2?tab=repositories
egov : https://github.com/dopal2/egovegovproject : https://github.com/dopal2/egovproject
웹 프로젝트(dopal2.egov)와 템플릿 프로젝트(dopal2.egovproject)를 활용하여 "사이트 A에서 로그인하면 사이트 B에서도 로그인되어 있는가?"를 검증하는 SSO(Single Sign-On) 기초 테스트를 진행했습니다.
1. 서버 인스턴스 분리 및 환경 구성
두 프로젝트를 동시에 띄우기 위해 톰캣 서버 인스턴스를 두 개로 분리하고 포트 충돌을 방지했습니다.
- Tomcat A: HTTP 포트 80 / 8005(Shutdown) 사용 / dopal2.egov 서비스
- Tomcat B: HTTP 포트 8080 / 8006(Shutdown) 사용 / dopal2.egovproject 서비스


2. 로그인 테스트용 DB 구성
공통으로 사용할 사용자 테이블을 생성하고 테스트 데이터를 주입합니다.
-- 1. 테스트용 사용자 테이블 생성
CREATE TABLE TEST_USER (
USER_ID VARCHAR(20) PRIMARY KEY,
USER_PW VARCHAR(100) NOT NULL,
USER_NM VARCHAR(50) NOT NULL
);
-- 2. 테스트 데이터 삽입
INSERT INTO TEST_USER (USER_ID, USER_PW, USER_NM) VALUES ('dopal2', '1234', 'dopal2');
INSERT INTO TEST_USER (USER_ID, USER_PW, USER_NM) VALUES ('admin', '1234', 'manager');
그리고 간단한 로그인 기능을 구현하기 위해 Controller, VO, Service, DAO, Mapper 등 관련 파일을 생성하고 테스트를 진행했습니다. 그리고 해당 내용은 https://dopal2.tistory.com/56을 참조하시면 됩니다.
[#SPRING] 10. 회원가입 기능_(회원가입 폼)
XX. 서버 수정 사용중인 톰캣에 http 포트 변경 8080 -> 80 Path경로 변경 /spring -> / 1. 파일 및 디렉토리 생성 - UserController 생성 /user/controller 하단에 UserController 생성 (/src/main/java/com/SpringProject/spring/user/c
dopal2.tistory.com




3. Spring Session JDBC 설정
메모리가 아닌 DB에 세션을 저장하기 위해 Spring Session 라이브러리를 사용합니다.
① DB Table 생성
-- 기본 세션 정보 테이블
CREATE TABLE SPRING_SESSION (
PRIMARY_ID CHAR(36) NOT NULL,
SESSION_ID CHAR(36) NOT NULL,
CREATION_TIME BIGINT NOT NULL,
LAST_ACCESS_TIME BIGINT NOT NULL,
MAX_INACTIVE_INTERVAL INT NOT NULL,
EXPIRY_TIME BIGINT NOT NULL,
PRINCIPAL_NAME VARCHAR(100),
CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
) ENGINE=InnoDB;
-- 세션 상세 속성 테이블 (UserVO 등이 직렬화되어 저장)
CREATE TABLE SPRING_SESSION_ATTRIBUTES (
SESSION_PRIMARY_ID CHAR(36) NOT NULL,
ATTRIBUTE_NAME VARCHAR(200) NOT NULL,
ATTRIBUTE_BYTES LONGBLOB NOT NULL,
CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),
CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID)
REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
) ENGINE=InnoDB;
② 의존성(pom.xml), Java 파일 생성, context-session.xml 생성
해당 기능은 Spring-session-jdbc를 활용하기 때문에 의존성을 주입합니다.

기존에는 context-session.xml을 사용했지만 오류가 발생해서 변경했습니다.
최신 환경에 맞게 SessionConfig 클래스를 통해 설정을 진행합니다.
config > SessionConfig.java를 생성합니다.
@Configuration
@EnableJdbcHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {
// DataSource 등은 XML 설정에서 자동 주입됨
}
그리고 context-session.xml을 생성합니다. 빈은 별도로 등록하지 않아도 됩니다.

③ UserVO 직렬화 설정
오류가 나서 찾아보니 DB에 객체를 저장하기 위해 VO 클래스에 Serializable 인터페이스를 반드시 구현을 해야한다고 해서 UserVO에 추가했습니다.
public class UserVO implements Serializable { ... }
그리고 필터를 설정해야합니다. 기존에는 tomcat과 session을 설정했지만 DB와 세션을 설정하기 때문에 web.xml에 필터를 추가해야합니다. 그리고 encodingFilter보다 먼저 실행되어야 한다고 해서 그 위에 추가했습니다.

🛠️ 트러블슈팅: ClassNotFoundException 해결
테스트 중 Tomcat B에서 세션을 읽어올 때 UserVO를 찾지 못하는 에러가 발생했습니다.
해결: 두 프로젝트의 패키지 경로 및 클래스명(UserVO), 인터페이스 구조를 동일하게 맞춘 후 정상 작동 확인
4. 최종 테스트 결과
사이트 A(80포트)에서 로그인한 후, 별도의 로그인 과정 없이 사이트 B(8080포트)에 접속했을 때 유저 정보가 정상적으로 공유되는 것을 확인했습니다. 이를 통해 기본적인 중앙 집중식 세션 관리 시스템이 완성되었습니다.

📝 오늘의 요약
- Spring Session JDBC를 쓰면 여러 서버가 하나의 DB를 통해 세션을 공유할 수 있다.
- 공유되는 객체(VO)는 반드시 패키지 경로까지 동일하게 맞춰야 역직렬화 오류가 없다.
- 필터 등록 시
springSessionRepositoryFilter가 가장 먼저 실행되도록 순서를 조정하자. - 현재 방식은 Session을 공유하는 방식이고 이것 이외에 JWT Tokken을 활용하는 방식을 나중에 구현해야겠다.
'Java > 전자정부프레임워크' 카테고리의 다른 글
| [#eGovFrame] 10. 커스텀 게시판 구축 및 CRUD 실습 (0) | 2026.02.22 |
|---|---|
| [#eGovFrame] 08. 인증서 발급 과제 목표 설계 및 테스트 시나리오 (0) | 2026.02.20 |
| [#eGovFrame] 07. MySQL DB 연동 및 한글 인코딩 트러블슈팅 (0) | 2026.02.20 |
| [#eGovFrame] 06. 템플릿 프로젝트 구조 분석 및 테스트 리포트 (0) | 2026.02.19 |
| [#eGovFrame] XX. 프로젝트 버전 관리 및 GitHub 연동 가이드 (0) | 2026.02.19 |
댓글