๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring Security

[Spring Security] Token Filter ๊ตฌํ˜„ํ•˜๊ธฐ

by ์šฐ์ฃผ๋ฌผ๊ณ ๊ธฐ 2025. 5. 5.
๋ฐ˜์‘ํ˜•

config ๋””๋ ‰ํ† ๋ฆฌ์—

TokenAuthenticationFilter.java ํŒŒ์ผ ๋งŒ๋“ค๊ฑฐ์ž„.

 

์ด ํ•„ํ„ฐ์—์„œ๋Š”, ํ† ํฐ์— ๋‹ด๊ธด Authorization ํ—ค๋” ๊ฐ€์ ธ์™€์„œ,

์—‘์„ธ์Šค ํ† ํฐ ์œ ํšจํ•˜๋ฉด ์ธ์ฆ ์ •๋ณด ์„ค์ •ํ•˜๋Š”๊ฑธ ํ• ๊ฑฐ์ž„.

 

 

@Override
    protected void doFilterInternal(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain filterChain) throws ServletException, IOException {

        // ์š”์ฒญ ํ—ค๋”์˜ Authorization ํ‚ค์˜ ๊ฐ’ ์กฐํšŒ
        String authorizationHeader = request.getHeader(HEADER_AUTHORIZATION);

        // ๊ฐ€์ ธ์˜จ ๊ฐ’์—์„œ ์ ‘๋‘์‚ฌ ์ œ๊ฑฐ
        String token = getAccessToken(authorizationHeader);

        if(tokenProvider.validToken(token)) {
            Authentication authentication = tokenProvider.getAuthentication(token);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }

        filterChain.doFilter(request, response);

    }

 

 

์ด ๋ฉ”์„œ๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด, ์ปจํŠธ๋กค๋Ÿฌ ๋„๋‹ฌ ์ „์— ํ˜ธ์ถœ๋จ.

 

์—ฌ๊ธฐ์„œ ๊ถ๊ธˆํ–ˆ๋˜์ ๋“ค์ด ์žˆ๋Š”๋ฐ, ํ•œ์ค„ํ•œ์ค„ ๋ณด์ž๋ฉด

 

 

Q1. HttpServletRequest request๋Š” ์•Œ๊ฒ ๋Š”๋ฐ, response๋Š” ๋ญ๋ƒ?

( ์ด ์ฝ”๋“œ๋Š” controller๋„๋‹ฌ ์ „์— ํ˜ธ์ถœ๋˜๋Š”๊ฑด๋ฐ,

์„œ๋น„์Šค ๋กœ์ง ๋“ค์–ด๊ฐ€์ง€๋„ ์•Š์•˜๋Š”๋ฐ ์›ฌ response?

request๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ณด๋‚ธ ์š”์ฒญ์ด๋‹ˆ๊นŒ ์•Œ๊ฒ ๋Š”๋ฐ... )

 

A.

์ด ์‹œ์ ์—์„œ๋Š” ์‘๋‹ต์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์€๊ฒŒ ๋งž์Œ.

์ฆ‰, reponse๊ฐ์ฒด๋Š” ์ด๋ฏธ ๋น„์–ด์žˆ๋Š” ์ƒํƒœ๋กœ ์ƒ์„ฑ๋˜์–ด์„œ ์ „๋‹ฌ๋œ๊ฑฐ์ž„!

HttpServletRequest๋ž‘ HttpServletResponse๋Š”

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋งŒ๋“œ๋Š”๋ฐ,

request๊ฐ์ฒด, response๊ฐ์ฒด๋„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์„œ

ํ•„ํ„ฐ์— ๋„˜๊ธฐ๋Š”๊ฑฐ์ž„!

 

[ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ]
   ↓
[ ํ†ฐ์บฃ(์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ) ]
   ↓
ํ•„ํ„ฐ →  ์ปจํŠธ๋กค๋Ÿฌ →  ์„œ๋น„์Šค
  ↓                                       ↑
   โ””โ”€โ”€ โ”€ โ”€< ์‘๋‹ต >โ”€โ”€โ”€โ”€โ”€โ”˜

 

์ฆ‰ response ๊ฐ์ฒด๋Š” ํ˜„์žฌ ๋น„์–ด์žˆ๋Š”๊ฑฐ์ž„.

์ปจํŠธ๋กค๋Ÿฌ ๊ฑฐ์นœ ํ›„์— ์ฑ„์›Œ์ง€๊ฒ ์ง€...

 

 

 

 

Q2. ๊ฐ€์ ธ์˜จ ๊ฐ’์—์„œ ์ ‘๋‘์‚ฌ ์ œ๊ฑฐํ•œ๋‹ค๋Š”๊ฒŒ, Bearer ey~์—ฌ๊ธฐ์„œ Bearer์—†์• ๋„ ์ •๋ง ๋”ฑ JWT ํ† ํฐ๋งŒ ๋‚จ๊ธฐ๊ฒŸ๋‹ค๋Š” ๋ชฉ์  ๋งž๋‚˜?

A.

๋งž์Œ!

 

 

 

 

 

Q3. tokenProvider.getAuthentication(token); ์˜ ์—ญํ• ์€?

A.

ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ Authentication๊ฐ์ฒด ๋งŒ๋“œ๋Š”๊ฑฐ์ž„

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฑธ SecurityContext์— ์ €์žฅํ•˜๋Š”๊ฒŒ ๋ฐ”๋กœ ๋‹ค์Œ์ค„ ์ฝ”๋“œ

( SecurityContextHolder.getContext().setAuthentication(authentication); )

 

์—ฌ๊ธฐ์„œ ํŒŒ์ƒ๋˜๋Š” ๋˜ ํ•˜๋‚˜์˜ ์งˆ๋ฌธ...

 

 

Q3-1. ๋งค๋ฒˆ Authentication๊ฐ์ฒด ๋งŒ๋“œ๋Š”๊ฒŒ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ธ๊ฐ€?

 

A. 

JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ

**๋ฌด์ƒํƒœ**๋•Œ๋ฌธ์—

๋งค ์š”์ฒญ๋งˆ๋‹ค ํ† ํฐ์—์„œ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š”๊ฑฐ์ž„.

์„œ๋ฒ„๋Š” "๋ˆ„๊ฐ€ ๋กœ๊ทธ์ธํ–ˆ๋Š”์ง€" ๊ธฐ์–ตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ.

๋”ฐ๋ผ์„œ ๋งค๋ฒˆ Authentication๊ฐ์ฒด ๋งŒ๋“ค ์ˆ˜๋ฐ–์— ์—†์Œ.

 

--> ๊ทธ๋ ‡๋‹ค๋ฉด SecurityContextHolder์˜ ์˜๋ฏธ๋Š” ๋ญ”๋ฐ?

๋งค ์š”์ฒญ๋งˆ๋‹ค ํ•„ํ„ฐ๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ,

ํ•ด๋‹น ์ธ์ฆ ๊ฐ์ฒด๋ฅผ SecurityContext์— ์ €์žฅํ•˜๋Š” ์šฉ๋„์ž„.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฑธ ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ์„œ๋น„์Šค๋กœ์ง์ด SecurityContext์—์„œ ๊บผ๋‚ด ์“ฐ๋Š”๊ฑฐ์ž„.

 

=

 

์ด ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ ํ•œ ์š”์ฒญ ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋‹ค๋Š”๊ฑฐ์ž„!

์š”์ฒญ์ด ๋๋‚˜๋ฉด SecurityContext๋„ ์‚ฌ๋ผ์ง

(์Šค๋ ˆ๋“œ๋กœ์ปฌ ๊ธฐ๋ฐ˜์ด๋‹ˆ๊นŒ)

 

 

 

 

 

Q4. filterChain.doFilter()๋Š” ๋ญํ•˜๋Š” ๋ฉ”์„œ๋“œ?

 

A.

๋‹ค์Œ ํ•„ํ„ฐ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์š”์ฒญ ๋„˜๊ธฐ๋Š”๊ฑฐ์ž„.

ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์ด ์™”๋Š”๋ฐ,

ํ•„ํ„ฐ์—์„œ ๋‹ค์Œ์œผ๋กœ ์•ˆ๋„˜๊ฒจ์ฃผ๋ฉด

๊ฑ ๋ฉˆ์ถ”๊ณ  ๋๋‚˜๊ธฐ๋•Œ๋ฌธ์—..

๊ทธ๋ƒฅ ๋‹จ์ง€ ํ๋ฆ„์„ ๋„˜๊ธฐ๋Š” ์—ญํ• ์ด์ง€,

๊ฐ’์„ returnํ•˜๊ฑฐ๋‚˜ ๊ทธ๋Ÿฌ์ง€๋Š” ์•Š์Œ.

 

 

 

 


๋‹ค์Œ์€ getAccessToken()ํ•จ์ˆ˜!

 

private String getAccessToken(String authorizationHeader) {
        
        if(authorizationHeader != null && authorizationHeader.startsWith(TOKEN_PREFIX)) {
            return authorizationHeader.substring(TOKEN_PREFIX.length());
        }
        
        return null;
}

 

์ด ํ•จ์ˆ˜๋Š”

doFilterInternal()๋ฉ”์„œ๋“œ์—์„œ ํ˜ธ์ถœํ•˜๊ฒŒ๋˜๋Š”๋ฐ

๊ฑฐ๊ธฐ์„œ request.getHeader()ํ•ด์„œ ํ—ค๋”๋งŒ ๋˜‘ ๋–ผ์˜ค๊ณ 

(๊ทธ๋Ÿฌ๋ฉด Bearer ey~~์ด๋Ÿฐ์‹์ด ๋˜๊ฒ ์ง€?)

 

๊ทธ ๋‹ค์Œ์— ๊ฐ€์ ธ์˜จ ๊ฐ’์—์„œ ์ ‘๋‘์‚ฌ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

์ฆ‰, ์š”์ฒญ ํ—ค๋”์—์„œ ์‹ค์ œ JWT ํ† ํฐ(ey~)๋งŒ ์ถ”์ถœํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š”๊ฑฐ์ž„.

 

์ฐธ๊ณ ๋กœ Authorizationํ—ค๋”๋Š” ๋ณดํ†ต

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6...

 

์ด๋Ÿฐ์‹์œผ๋กœ ์ „๋‹ฌ๋จ!

 

 

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ํ† ํฐ API๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒ ์Œ!

 

๋ฐ˜์‘ํ˜•