plugins { // id 'org.springframework.boot' version '2.1.5.RELEASE' id 'org.springframework.boot' version '2.2.4.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java' }
부트 실행
2.2.4환경에서 실행 후
동일하게 포스트맨으로 send
아래의 에러 로그 확인
1 2
org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException: org.springframework.security.core.context.SecurityContextImpl; local class incompatible: stream classdesc serialVersionUID = 510, local class serialVersionUID = 520
SecurityContextImpl; local class incompatible: stream classdesc serialVersionUID = 510, local class serialVersionUID = 520
510???? 520??? 무슨 차이?
SecurityContextImpl.java
아래의 파일에서 SerialVersionId가 스프링시큐리티 코어 버젼에 따라 주입됨을 볼수가 있다.
/** * Global Serialization value for Spring Security classes. * * N.B. Classes are not intended to be serializable between different versions. See * SEC-1709 for why we still need a serial version. */ publicstaticfinallong SERIAL_VERSION_UID = 520L;
/** * Performs version checks */ privatestaticvoidperformVersionChecks(){ performVersionChecks(MIN_SPRING_VERSION); }
/** * Perform version checks with specific min Spring Version * * @param minSpringVersion */ privatestaticvoidperformVersionChecks(String minSpringVersion){ if (minSpringVersion == null) { return; } // Check Spring Compatibility String springVersion = SpringVersion.getVersion(); String version = getVersion();
if (disableChecks(springVersion, version)) { return; }
logger.info("You are running with Spring Security Core " + version); if (new ComparableVersion(springVersion) .compareTo(new ComparableVersion(minSpringVersion)) < 0) { logger.warn("**** You are advised to use Spring " + minSpringVersion + " or later with this version. You are running: " + springVersion); } }
/** * Disable if springVersion and springSecurityVersion are the same to allow working * with Uber Jars. * * @param springVersion * @param springSecurityVersion * @return */ privatestaticbooleandisableChecks(String springVersion, String springSecurityVersion){ if (springVersion == null || springVersion.equals(springSecurityVersion)) { returntrue; } return Boolean.getBoolean(DISABLE_CHECKS); }
/** * Loads the spring version or null if it cannot be found. * @return */ privatestatic String getSpringVersion(){ Properties properties = new Properties(); try { properties.load(SpringSecurityCoreVersion.class.getClassLoader().getResourceAsStream("META-INF/spring-security.versions")); } catch (IOException | NullPointerException e) { returnnull; } return properties.getProperty("org.springframework:spring-core"); } }
결론
세션에 userDetail정보가 저장될 때 별도의 userDetail을 Json으로 저장하도록 구현하지 않으면… 마이그레이션이 힘들다.
아무 생각 없이 세션을 쓰고 있는 프로젝트에서 스프링 시큐리티 버젼을 올릴 경우 위의 에러 문구를 만날수 있다.
스프링시큐리티코어(스프링프레임워크 버젼) 버젼에 따라 SERIAL_VERSION_UID이 바뀜을 인지하자.