๐ํ๋ก๊ทธ๋๋จธ์ค ๋ฐฑ์๋ ๋ฐ๋ธ์ฝ์ค 4๊ธฐ ๊ต์ก๊ณผ์ ์ ๋ฃ๊ณ ์ ๋ฆฌํ ๊ธ์
๋๋ค.๐
HTTP์ Session
๊ทธ๋ฆผ ์ฐธ๊ณ
- ๊ทผ๋ณธ์ ์ผ๋ก HTTP๋ ๋ฌด์ํ ํ๋กํ ์ฝ์ด๊ณ ์ด๋ค ์ ๋ณด๋ ์ ์ฅํ์ง ์์
- ์๋ฒ๋ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด Session์ ๋ง๋ค๊ณ , ์๋ณ์์ธ session-id๋ฅผ ํด๋ผ์ด์ธํธ๋ก ์๋ตํจ
- ํด๋ผ์ด์ธํธ๊ฐ ์น ๋ธ๋ผ์ฐ์ ์ธ ๊ฒฝ์ฐ session-id๋ ๋ณดํต Cookie ์ ์ ์ฅ๋จ
- ํด๋ผ์ด์ธํธ๋ HTTP ์์ฒญ์ session-id๋ฅผ ํฌํจ์์ผ, ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ ์ ์๋๋ก ํด์ผํจ
- Session์ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ฌด ๋ง์์ง ๊ฒฝ์ฐ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ด ๋ฐ์ํ ์ ์์
ํน์ ์๋ฒ์์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ๊ฑฐ๊ธฐ์ ์๋ Session์ ์ ์ค์ด ๋ ํ
๋ฐ ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ์์๊น?
Session Cluster
๊ทธ๋ฆผ ์ฐธ๊ณ
- Session์ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋, ๋ณ๋์ ์ธ๋ถ ์คํ ๋ฆฌ์ง์ ์ ์ฅ
- ์ธ๋ถ ์คํ ๋ฆฌ์ง๋ ์กฐํ ์๋๋ฅผ ์ํด ๋ณดํต In-Memory ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง์ด ์ฌ์ฉํจ
- In-Memory ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋์คํฌ๊ฐ ์๋, ์ฃผ ๋ฉ๋ชจ๋ฆฌ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ผ๋ฐ์ ์ธ ๋์คํฌ ์กฐํ๋ณด๋ค ์๋๊ฐ ํจ์ฌ ๋น ๋ฅด์ง๋ง, ํ๋ฐ์ฑ์ด๊ธฐ ๋๋ฌธ์ ์๋ฒ๊ฐ ๊บผ์ ธ์ ๋ ์๊ฐ๋ ์๊ด์๋ ๋ฐ์ดํฐ (์ฟ ํค, ์ธ์
)์ ์ฌ์ฉ
- ๋ํ์ ์ผ๋ก Redis๊ฐ ์์
- ํน์ ์๋ฒ์ ๋ฌธ์ ๊ฐ ์๊ฒจ๋ ๋ค๋ฅธ ์ ์์ ์ธ ์๋ฒ์์ Session์ ์ธ๋ถ ์คํ ๋ฆฌ์ง์์ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ์ธ์ฆ์ด ํ๋ฆฌ์ง ์์
Spring Session
- Spring Session๋ Spring Boot ์น ์ดํ๋ฆฌ์ผ์ด์
์์ Session Cluster๋ฅผ ๊ตฌํํ๋๋ฐ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณต
- Session์ ์ ์ฅํ๊ธฐ ์ํ ์ธ๋ถ ์คํ ๋ฆฌ์ง๋ฅผ ์ถ์ํํจ์ผ๋ก์จ ์ผ๊ด๋ API๋ก JDBC, Redis, Hazelcast ๋ฑ ๋ค์ํ ์คํ ๋ฆฌ์ง๋ฅผ ํ์ฉ ๊ฐ๋ฅ
์ค์ ๋ฐฉ๋ฒ
-
gradle ์์กด์ฑ ์ถ๊ฐ ๋ฐ ์ค์
![](https://velog.velcdn.com/images/yumyeonghan/post/116a8eed-e62f-4dba-b646-dc3bfa2c6da1/image.png)
-
Spring Session ๊ด๋ จ ํ
์ด๋ธ ์ด๊ธฐํ
spring:
sql:
init:
platform: h2
mode: always
schema-locations: classpath:sql/schema_new.sql, classpath:org/springframework/session/jdbc/schema-h2.sql
data-locations: classpath:sql/data_new.sql
encoding: UTF-8
mode: always
- spring-session-jdbc๋ session ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด 2๊ฐ์ ํ
์ด๋ธ์ ์ฌ์ฉํจ
- sql.init.schema-locations ๋ถ๋ถ์ spring-session-jdbc์์ ์ฌ์ฉํ๋ ํ
์ด๋ธ ์์ฑ SQL ์ฟผ๋ฆฌ ํ์ผ์ ์ง์
- ํ
์ด๋ธ์ ์ถ๊ฐํ๊ธฐ ์ํ SQL ์ฟผ๋ฆฌ๋ spring-session-jdbc jar ๋ด๋ถ์ ์์นํจ
spring:
session:
store-type: jdbc
jdbc:
initialize-schema: never
- Spring Session ๊ด๋ จ ์ค์
- session.store-type ๋ถ๋ถ์ jdbc๋ฅผ ์
๋ ฅํจ
- jdbc ์ธ์ ์
๋ ฅ ๊ฐ๋ฅํ ๊ฐ์ redis, mongodb, hazelcast๋ฑ ์ด ์์
- session.jdbc.initialize-schema ๋ถ๋ถ์ never๋ฅผ ์
๋ ฅํจ
- sql.init.schema-locations๋ถ๋ถ์ spring-session-jdbc์์ ์ฌ์ฉํ๋ ํ
์ด๋ธ ์์ฑ SQL ์ฟผ๋ฆฌ ํ์ผ์ ์ง์ ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์์
- @EnableJdbcHttpSession ์ด๋
ธํ
์ด์
์ ์ถ๊ฐํ์ฌ, jdbc๊ธฐ๋ฐ spring session์ ํ์ฑํ
@Configuration
@EnableJdbcHttpSession
public class WebMvcConfigure {
}
h2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ธ
![](https://velog.velcdn.com/images/yumyeonghan/post/31d5af16-77c6-4049-8c35-de96052a4598/image.png)
![](https://velog.velcdn.com/images/yumyeonghan/post/fd37c5e8-a732-4b88-843e-27aba333b107/image.png)
- ๋ก๊ทธ์ธ ํ h2-console์์ SPRING_SESSION, SPRING_SESSION_ATTRIBUTES ํ
์ด๋ธ ์กฐํํด๋ณด๋ฉด, row๊ฐ ์
๋ ฅ๋ ์๋๊ฒ์ ํ์ธํ ์ ์์
- session_id โ ์ฌ์ฉ์์ Session์ ์๋ณํ๊ธฐ ์ํ ๊ณ ์ Key
- ๋ธ๋ผ์ฐ์ Cookie๋ฅผ ํ์ธํด๋ณด๋ฉด session_id ๊ฐ์ด Base64 ์ธ์ฝ๋ฉ๋ ํํ๋ก ์ ์ฅ๋์ด ์์
SessionRepository
public interface SessionRepository<S extends Session> {
S createSession();
void save(S session);
S findById(String id);
void deleteById(String id);
}
- Session์ ์์ฑ, ์ ์ฅ, ์กฐํ, ์ญ์ ์ฒ๋ฆฌ์ ๋ํ ์ฑ
์
- ์คํ ๋ฆฌ์ง ์ข
๋ฅ์ ๋ฐ๋ผ ๋ค์ํ ๊ตฌํ์ฒด๋ฅผ ์ ๊ณตํจ
- MapSessionRepository: In-Memory Map๊ธฐ๋ฐ์ด๋ฉฐ, ๋ณ๋์ ์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ ์์
- RedisIndexedSessionRepository: redis ๊ธฐ๋ฐ์ด๋ฉฐ, @EnableRedisHttpSession ์ด๋
ธํ
์ด์
์ผ๋ก ์์ฑ๋จ
- JdbcIndexedSessionRepository: jdbc ๊ธฐ๋ฐ์ด๋ฉฐ, @EnableJdbcHttpSession ์ด๋
ธํ
์ด์
์ผ๋ก ์์ฑ๋จ
SessionRepositoryFilter
๊ทธ๋ฆผ ์ฐธ๊ณ
- ๋ชจ๋ HTTP ์์ฒญ์ ๋ํด ๋์ํจ
- HttpServletRequest, HttpServletResponse ์ธํฐํ์ด์ค ๊ตฌํ์ SessionRepositoryRequestWrapper, SessionRepositoryResponseWrapper ๊ตฌํ์ฒด๋ก ๊ต์ฒดํจ
- ๊ต์ฒด๋ ๊ตฌํ์ฒด๋ HttpServletRequest, HttpServletResponse ์ธํฐํ์ด์ค์ Session ์ฒ๋ฆฌ์ ๊ด๋ จํ ๋ก์ง์ Overrideํจ
- Session ๊ด๋ จ ์์ฑ ๋ฐ ์
์ถ๋ ฅ์ SessionRepository ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฒ๋ฆฌํจ
- HttpSession ์ธํฐํ์ด์ค์ ๋ํด Spring Session ๊ตฌํ์ฒด HttpSessionWrapper๋ฅผ ์ฌ์ฉํ๋๋กํจ
Spring Security์ SecurityContextHolderFilter๋ SecurityContextRepository ์ธํฐํ์ด์ค ๊ตฌํ์ฒด์ธ, HttpSessionSecurityContextRepository ํด๋์ค ํตํด ์ฌ์ฉ์์ SecurityContext๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ๊ฐฑ์ ํจ
![](https://velog.velcdn.com/images/yumyeonghan/post/9855e9d8-e530-416d-8431-7801494132e2/image.png)
- HttpServletRequest ์ธํฐํ์ด์ค์ getSession() ๋ฉ์๋๋ฅผ ํตํด Session์ ๊ฐ์ ธ์ด
- ๋ฐ๋ก ์ด ์ง์ ์์ HttpServletRequest ์ธํฐํ์ด์ค์ ์คํ๋ง ์ธ์
๊ตฌํ์ฒด์ธ SessionRepositoryRequestWrapper ํด๋์ค๊ฐ ์ฌ์ฉ๋จ
- ๊ฒฐ๊ณผ์ ์ผ๋ก, Spring Security๋ HttpServletRequest ์ธํฐํ์ด์ค ๊ตฌํ์ฒด๋ฅผ ์ ํ์๊ฐ ์๊ณ , ๊ทธ๋ฅ ์ฌ์ฉํ๋ฉด ๋จ