{"id":2524,"date":"2021-08-02T22:05:28","date_gmt":"2021-08-02T13:05:28","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2524"},"modified":"2021-08-03T16:49:08","modified_gmt":"2021-08-03T07:49:08","slug":"auth-server-session-%ec%a0%95%eb%b3%b4-redis-%ec%97%90-%ec%a0%80%ec%9e%a5","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2524","title":{"rendered":"Auth Server Session \uc815\ubcf4 Redis \uc5d0 \uc800\uc7a5"},"content":{"rendered":"<h1>Auth Server Session \uc815\ubcf4 Redis \uc5d0 \uc800\uc7a5<\/h1>\n<h2>Redis \ud65c\uc131\ud654<\/h2>\n<p>build.gradle<\/p>\n<pre><code class=\"language-gradle\">......\ndependencies {\n    \/\/ ......\n    implementation &#039;org.springframework.boot:spring-boot-starter-data-redis&#039;\n    implementation &#039;org.springframework.session:spring-session-data-redis&#039;\n    \/\/ ......\n}\n......<\/code><\/pre>\n<p>application.yml<\/p>\n<pre><code class=\"language-yaml\">spring:\n  redis:\n    cluster:\n      nodes: 127.0.01:6379\n  session:\n    store-type: redis\n\nserver:\n  port: 9000\n  servlet:\n    session:\n      timeout: 43200m      # 60m * 24h * 30d\n      cookie:\n        max-age: 43200m    # 60m * 24h * 30d\n        name: AUTHSID\n        http-only: true\n        # secure: true<\/code><\/pre>\n<p>RedisConfig.java<\/p>\n<pre><code class=\"language-java\">@RequiredArgsConstructor\n@Configuration\n@EnableRedisRepositories\npublic class RedisConfig {\n\n    private final RedisProperties redisProperties;\n\n    @Bean\n    public RedisConnectionFactory redisConnectionFactory() {\n        return new LettuceConnectionFactory(redisProperties.getHost(), redisProperties.getPort());\n    }\n\n    @Bean\n    public RedisTemplate&lt;?, ?&gt; redisTemplate() {\n        RedisTemplate&lt;byte[], byte[]&gt; redisTemplate = new RedisTemplate&lt;&gt;();\n        redisTemplate.setConnectionFactory(redisConnectionFactory());\n        return redisTemplate;\n    }\n}<\/code><\/pre>\n<h2>Session \uc815\ubcf4 Redis \uc5d0 \uc800\uc7a5<\/h2>\n<p>SessionConfig.java<\/p>\n<pre><code class=\"language-java\">@Configuration\npublic class SessionConfig implements BeanClassLoaderAware {\n\n    private ClassLoader loader;\n\n    @Bean\n    public RedisSerializer&lt;Object&gt; springSessionDefaultRedisSerializer() {\n        return new GenericJackson2JsonRedisSerializer(objectMapper());\n    }\n\n    private ObjectMapper objectMapper() {\n        ObjectMapper mapper = new ObjectMapper();\n        mapper.registerModules(SecurityJackson2Modules.getModules(this.loader));\n        return mapper;\n    }\n\n    @Override\n    public void setBeanClassLoader(ClassLoader classLoader) {\n        this.loader = classLoader;\n    }\n}<\/code><\/pre>\n<h2>Entity Deserializer \uc0dd\uc131<\/h2>\n<p>UserDeserializer.java<\/p>\n<pre><code class=\"language-java\">public class UserDeserializer extends JsonDeserializer&lt;User&gt; {\n\n    @Override\n    public User deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {\n\n        ObjectCodec objectCodec = jsonParser.getCodec();\n        JsonNode node = objectCodec.readTree(jsonParser);\n\n        return User.builder()\n                .userId(node.get(&quot;userId&quot;).longValue())\n                .email(node.get(&quot;email&quot;).asText())\n                .password(node.get(&quot;password&quot;).asText())\n                .firstName(node.get(&quot;firstName&quot;).asText())\n                .lastName(node.get(&quot;lastName&quot;).asText())\n                .roles(node.get(&quot;roles&quot;).asText())\n                .build();\n    }\n}<\/code><\/pre>\n<pre><code class=\"language-java\">@JsonDeserialize(using = UserDeserializer.class)\n@Builder\n@Getter\n@NoArgsConstructor\n@AllArgsConstructor\n@Entity\n@Table(name = &quot;tbl_user&quot;)\npublic class User implements UserDetails {\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.AUTO)\n    private long userId;\n\n    \/\/ ......\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Auth Server Session \uc815\ubcf4 Redis \uc5d0 \uc800\uc7a5 Redis \ud65c\uc131\ud654 build.gradle &#8230;&#8230; dependencies { \/\/ &#8230;&#8230; implementation &#039;org.springframework.boot:spring-boot-starter-data-redis&#039; implementation &#039;org.springframework.session:spring-session-data-redis&#039; \/\/ &#8230;&#8230; } &#8230;&#8230; application.yml spring: redis: cluster: nodes: 127.0.01:6379 session: store-type: redis server: port: 9000 servlet: session: timeout: 43200m # 60m * 24h * 30d cookie: max-age: 43200m # 60m * 24h * 30d name:\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2524\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2524","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2524"}],"version-history":[{"count":5,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2524\/revisions"}],"predecessor-version":[{"id":2534,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2524\/revisions\/2534"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2524"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}