본문 바로가기
Java/전자정부프레임워크

[#eGovFrame] 09. SSO 기초: 서버 인스턴스 간 세션 공유 설정

by dopal2 2026. 2. 21.
반응형

Spring Session JDBC를 활용한 SSO 기초 구현 및 트러블슈팅

작업의 진행상황은 github을 확인해주세요

GitHub : https://github.com/dopal2?tab=repositories

egov : https://github.com/dopal2/egov
egovproject : 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 서비스
00. 프로젝트 및 톰캣 환경 구성

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

01. 로그인 기능 구성
02. 로그인 기능 테스트
03. 로그인 기능 테스트

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를 활용하기 때문에 의존성을 주입합니다.

04. spring-session-jdbc 추가

기존에는 context-session.xml을 사용했지만 오류가 발생해서 변경했습니다.

최신 환경에 맞게 SessionConfig 클래스를 통해 설정을 진행합니다.

config > SessionConfig.java를 생성합니다.

@Configuration
@EnableJdbcHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {
    // DataSource 등은 XML 설정에서 자동 주입됨
}

그리고 context-session.xml을 생성합니다. 빈은 별도로 등록하지 않아도 됩니다.

05. context-session.xml

③ UserVO 직렬화 설정

오류가 나서 찾아보니 DB에 객체를 저장하기 위해 VO 클래스에 Serializable 인터페이스를 반드시 구현을 해야한다고 해서 UserVO에 추가했습니다.

public class UserVO implements Serializable { ... }

 

 

그리고 필터를 설정해야합니다. 기존에는 tomcat과 session을 설정했지만 DB와 세션을 설정하기 때문에 web.xml에 필터를 추가해야합니다. 그리고 encodingFilter보다 먼저 실행되어야 한다고 해서 그 위에 추가했습니다.

06. 세션 필터 추가

 


🛠️ 트러블슈팅: ClassNotFoundException 해결

테스트 중 Tomcat B에서 세션을 읽어올 때 UserVO를 찾지 못하는 에러가 발생했습니다.

원인: 두 프로젝트 간의 UserVO 클래스 패키지 경로가 상이하여 역직렬화 실패
해결: 두 프로젝트의 패키지 경로 및 클래스명(UserVO), 인터페이스 구조를 동일하게 맞춘 후 정상 작동 확인

 


4. 최종 테스트 결과

사이트 A(80포트)에서 로그인한 후, 별도의 로그인 과정 없이 사이트 B(8080포트)에 접속했을 때 유저 정보가 정상적으로 공유되는 것을 확인했습니다. 이를 통해 기본적인 중앙 집중식 세션 관리 시스템이 완성되었습니다.

06. 기능구현 성공

 

📝 오늘의 요약

  • Spring Session JDBC를 쓰면 여러 서버가 하나의 DB를 통해 세션을 공유할 수 있다.
  • 공유되는 객체(VO)는 반드시 패키지 경로까지 동일하게 맞춰야 역직렬화 오류가 없다.
  • 필터 등록 시 springSessionRepositoryFilter가 가장 먼저 실행되도록 순서를 조정하자.
  • 현재 방식은 Session을 공유하는 방식이고 이것 이외에 JWT Tokken을 활용하는 방식을 나중에 구현해야겠다.

 

반응형

댓글