๐Ÿค” Spring Security์˜ ๋‹ค์ˆ˜์˜ ์„ธ์…˜ ์ œ์–ด, ๊ณ ์ • ๋ณดํ˜ธ, ์ •์ฑ…

Daehyeon Yunยท2023๋…„ 8์›” 2์ผ
0

Spring boot

๋ชฉ๋ก ๋ณด๊ธฐ
8/8
post-thumbnail

Spring Security์˜ ๋‹ค์ˆ˜์˜ ์„ธ์…˜ ์ œ์–ด, ๊ณ ์ • ๋ณดํ˜ธ, ์ •์ฑ…

๋‹ค์ˆ˜์˜ ์„ธ์…˜์ด ์ ‘์†ํ•˜๊ฑฐ๋‚˜, ์š”์ฒญ์ด ์˜ค๋ฉด ์„ธ์…˜์„ ์ œ์–ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Spring Security์˜ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

1. ๋™์‹œ(๋‹ค์ˆ˜) ์„ธ์…˜ ์ œ์–ด

์ด์ „ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์„ ๋งŒ๋ฃŒ์‹œํ‚จ๋‹ค. or ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์„ ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
           .sessionManagement() // ์„ธ์…˜ ๊ด€๋ฆฌ ๋“ฑ๋ก
                .maximunSessions(1) // ์ตœ๋Œ€ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์„ธ์…˜ ์ˆ˜ ์„ค์ •, -1์€ ๋ฌด์ œํ•œ์œผ๋กœ ํ—ˆ์šฉํ•œ๋‹ค.
                .maxSessionPreventsLogin(true) // ๋™์‹œ ๋กœ๊ทธ์ธ์„ ์ฐจ๋‹จํ•œ๋‹ค. false๋กœ ์„ค์ • ์‹œ ๊ธฐ์กด์˜ ์„ธ์…˜์„ ๋งŒ๋ฃŒ์‹œํ‚จ๋‹ค. (๊ธฐ๋ณธ๊ฐ’)
                .invaliSessionUrl("/notsession") // ์„ธ์…˜์ด ์œ ํšจํ•˜์ง€ ์•Š์„ ๋•Œ URL ์„ค์ •
                .expiredUrl("/notfoundsession") // ์„ธ์…˜์ด ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ URL ์„ค์ •
    }

2. ์„ธ์…˜ ๊ณ ์ • ๋ณดํ˜ธ

๋งŒ์•ฝ, ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด์ปค๊ฐ€ ์‹ฌ์–ด๋†“์€ ์ฟ ํ‚ค๋กœ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๋”๋ผ๋„ ์ธ์ฆํ•  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์„ธ์…˜๊ณผ ์ฟ ํ‚ค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ณดํ˜ธํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
           .sessionManagement() // ์„ธ์…˜ ๊ด€๋ฆฌ ๋“ฑ๋ก
                .sessionFixation()
                    .changeSessionId() // ๊ธฐ๋ณธ ์„ค์ •๊ฐ’ none, migrateSession, newSession ์„ค์ • ๊ฐ€๋Šฅ
    }

3. ์„ธ์…˜ ์ •์ฑ…

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
           .sessionManagement() // ์„ธ์…˜ ๊ด€๋ฆฌ ๋“ฑ๋ก
                .sessionCreationPolicy(sessionCreationPolicy.Always) // ํ•ญ์ƒ ์„ธ์…˜์„ ์ƒ์„ฑํ•œ๋‹ค.
                .sessionCreationPolicy(sessionCreationPolicy.If_Required) // ํ•„์š”ํ•  ์‹œ ์ƒ์„ฑํ•œ๋‹ค. (๊ธฐ๋ณธ๊ฐ’)
                .sessionCreationPolicy(sessionCreationPolicy.Never) // ์ƒ์„ฑํ•˜์ง€ ์•Š์ง€๋งŒ, ๋งŒ์•ฝ ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๋ฉด ์‚ฌ์šฉํ•œ๋‹ค.
                .sessionCreationPolicy(sessionCreationPolicy.Stareless) // ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ์กด์žฌํ•ด๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    }

Spring Security์˜ ์„ธ์…˜ ์ œ์–ด ํ•„ํ„ฐ

Spring Security์˜ ์„ธ์…˜ ์ œ์–ด ํ•„ํ„ฐ๋Š” SessionManagementFilter๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ํ•ด๋‹น ํ•„ํ„ฐ์˜ ์—ญํ• ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ์„ธ์…˜์„ ๊ด€๋ฆฌํ•œ๋‹ค.
    ์ธ์ฆ ์‹œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ •๋ณด ๋“ฑ๋ก/์กฐํšŒ/์‚ญ์ œ ๋“ฑ์˜ ์ด๋ ฅ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
  2. ๋™์‹œ ์„ธ์…˜์„ ์ œ์–ดํ•œ๋‹ค.
    ๋™์ผ ๊ณ„์ •์— ๋Œ€ํ•œ ์ ‘์† ํ—ˆ์šฉ ์ตœ๋Œ€ ์„ธ์…˜ ์ˆ˜๋ฅผ ์ œํ•œํ•œ๋‹ค.
  3. ์„ธ์…˜์„ ๊ณ ์ •์œผ๋กœ ๋ณดํ˜ธํ•œ๋‹ค.
    ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์ง„ํ–‰ํ•  ๋•Œ ๋งˆ๋‹ค ์„ธ์…˜๊ณผ ์ฟ ํ‚ค๋ฅผ ์ƒˆ๋กœ ๋ฐœ๊ธ‰ํ•˜์—ฌ ์ฟ ํ‚ค ์กฐ์ž‘์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
  4. ์„ธ์…˜ ์ƒ์„ฑ ์ •์ฑ…์„ ๋”ฐ๋ฅธ๋‹ค.

๋งค ์š”์ฒญ๋งˆ๋‹ค ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ๋งŒ๋ฃŒ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ํ•„ํ„ฐ

ConcurrentSessionFilter๋Š” ๋งค ์š”์ฒญ๋งˆ๋‹ค ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์— ๋Œ€ํ•œ ๋งŒ๋ฃŒ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•œ๋‹ค. ๋˜ํ•œ
์„ธ์…˜์ด ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๊ฒฝ์šฐ ์ฆ‰์‹œ ๋งŒ๋ฃŒ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
session.isExpired()๊ฐ€ true๋ผ๋ฉด, ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ์™€ ํ•จ๊ป˜ ์ฆ‰์‹œ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ์‘๋‹ตํ•œ๋‹ค.


์ฐธ๊ณ 

์ƒˆ๋กœ์šด ๋„์ „์„ ์œ„ํ•œ ํ•œ๊ฑธ์Œ
๊น€๋ฏผ์ˆ˜๋‹˜
junhabaeks

profile
์—ด์‹ฌํžˆ ์‚ด์•„์•ผ์ง€

0๊ฐœ์˜ ๋Œ“๊ธ€