ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿ’ก Introduction
์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ ํ•ต์‹ฌ ๊ฐ€์ด๋“œ ์ฑ…์—์„œ ๋‚˜์˜จ Spring Security ๋ฅผ ์‚ฌ์šฉํ•ด ํ† ํฐ ์ธ์ฆ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์„ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์ˆœ์„œ์— ๋”ฐ๋ผ ์„ค๋ช…ํ•ด๋ณธ๋‹ค.

๐Ÿงพ ๋‹จ๊ณ„๋ณ„๋กœ ํด๋ž˜์Šค ์ƒ์„ฑํ•˜๊ธฐ

๋จผ์ €, ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ† ํฐ์„ ์ƒ์„ฑํ•ด์„œ ํ† ํฐ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

JwtTokenProvider ์˜ ์Šคํƒœํ‹ฑ ๋ฉ”์„œ๋“œ์ธ createToken() ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋‚˜์˜จ JwtTokenProvider ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์ž. ๊ทธ๋ฆฌ๊ณ  ๋‚ด๋ถ€์— createToken() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ์ „์—, ํ•„์š”ํ•œ ์˜์กด์„ฑ์ด ์žˆ๋‹ค:

๊ตฌ๊ธ€์—์„œ jwt maven repository ๋“ฑ์˜ ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ–ˆ๋‹ค.
build.gradle ์— ์œ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

์ด์ œ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์œผ๋‹ˆ, JwtTokenProvider ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณธ๋‹ค.

์šฐ์„  ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. @Component ๋ฅผ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

ํด๋ž˜์Šค ์ƒ์„ฑ ํ›„, JSON Web Token ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ createToken() ๋ฉ”์„œ๋“œ์—์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค:

์ฐจ๋ก€๋Œ€๋กœ ํ† ํฐ์ด ๋‹ด์„ ์ •๋ณด๋ฅผ ์„ค์ •ํ•˜๊ณ , ๋ฐœ๊ธ‰๋œ ๋‚ ์งœ, ๋งŒ๋ฃŒ๊ธฐํ•œ, ์„œ๋ช…์— ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ‚ค๋ฅผ ์„ค์ •ํ•œ๋‹ค.

์ด ์ •๋„ ์‹œ์ ์—์„œ ์šฐ์„  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ด ๋ณด์•˜๋‹ค. Swagger ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ˆ˜๋™ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ์— ํŽธ๋ฆฌํ•  ๊ฒƒ ๊ฐ™์•„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ๋กœ ํ–ˆ๋‹ค. springfox-boot-starter ์™€ springfox-swagger-ui ๋ฅผ ์˜์กด์„ฑ์— ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค. ๋‹ค์Œ ๋‘ ์ค„์ด๋‹ค:

implementation 'io.springfox:springfox-swagger-ui:3.0.0'
implementation 'io.springfox:springfox-boot-starter:3.0.0'

๊ทธ๋ฆฌ๊ณ  configuration ํŒจํ‚ค์ง€์— SwaggerConfig ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค:

Swagger ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์„ธํŒ… ๊ฐ’๋“ค์„ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

Swagger ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „, Spring Security ์—์„œ ์ธ์ฆ๊ณผ ์ธ๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ณด์•ˆ ํ•„ํ„ฐ๋ฅผ ๋จผ์ € ์”Œ์šฐ๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด SecurityConfig ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค:

์•„์ง ๋น„์—ˆ์ง€๋งŒ @EnableWebSecurity ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋ณด์•ˆ ํ•„ํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋จ์„ ์•Œ๋ฆฌ๊ณ  ์žˆ๋‹ค.

์ดํ›„ localhost:8080/swagger-ui/ ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ์˜ ๋ชจ์Šต์ด๋‹ค:

Swagger ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ์ฆ์ด ํ•„์š”ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ณด์•ˆํ•„ํ„ฐ๊ฐ€ ๋””ํดํŠธ๋กœ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•„ํ„ฐ์ธ UsernamePasswordAuthenticationFilter ๋Š” ์ธ์ฆ์ด ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ๋Š” ๋กœ๊ทธ์ธ ํผ์„ ํ™”๋ฉด์— ๋„์šด๋‹ค. ์ด์ œ, ๋ณด์•ˆ ํ•„ํ„ฐ์˜ ๋ช‡ ๊ฐ€์ง€ ์†์„ฑ๋“ค์„ ์„ค์ •ํ•ด์„œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ ๋™์ž‘์„ ์žฌ๊ตฌ์„ฑํ•ด๋ณด์ž.

 

๐Ÿ”’ ๋ณด์•ˆ ํ•„ํ„ฐ ๊ตฌํ˜„ํ•˜๊ธฐ

 

์šฐ์„ , ๋ณด์•ˆ ํ•„ํ„ฐ์˜ ๊ตฌํ˜„์€ SecurityConfig ํด๋ž˜์Šค์˜ securityFitlerChain() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ด๋ค„์ง„๋‹ค:

๋ณด์•ˆ ํ•„ํ„ฐ ์ฒด์ธ์„ ๊ตฌํ˜„ํ•จ์œผ๋กœ์„œ ์†์„ฑ๋“ค์„ ํ•„์š”์— ๋งž๊ฒŒ ์„ค์ •ํ–ˆ๋‹ค.

์š”์ฒญ๊ณผ DispatcherServlet ์‚ฌ์ด์˜ ํ•„ํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ์„ค์ •ํ•ด์ค€ ๊ฒƒ์ด๋‹ค. ์ด์ œ, ๋‹ค์‹œ Swagger ๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž. ์•„๋งˆ ์•„๋ฌด๊ฒƒ๋„ ๋‚˜์˜ค์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. addFilterBefore() ๋ฉ”์„œ๋“œ๊ฐ€ ์„ค์ •ํ•ด์ค€ ์†์„ฑ์ด Jwt ํ† ํฐ ํ•„ํ„ฐ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ , ์•„์ง Jwt ํ† ํฐ ํ•„ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๊ฒƒ๋„ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค. ์ด์ œ, ํ† ํฐ ํ•„ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณผ ์ฐจ๋ก€์ด๋‹ค.

 

๐Ÿ”‘ ํ† ํฐ ํ•„ํ„ฐ ๊ตฌํ˜„ํ•˜๊ธฐ

ํ† ํฐ ํ•„ํ„ฐ์˜ ์—ญํ• ์€ ํ† ํฐ์ด ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€์™€ ์œ ํšจํ•œ์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•œ ํ›„, ๊ฒ€์‚ฌ์—์„œ ํ†ต๊ณผํ•˜๋ฉด SecurityContextHolder ์— ์ธ์ฆ๋œ ํ† ํฐ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ €์žฅ๋œ ์ดํ›„์—๋Š” ์ธ์ฆ๋œ ํ† ํฐ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋ผ๋Š” ๊ฒƒ์ด ํ™•์ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋จผ์ €, ํ† ํฐ ํ•„ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•  JwtAuthenticationFilter ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค:

OncePerRequestFilter ๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. doFilterInternal() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

์˜ค๋ฒ„๋ผ์ด๋”ฉ๋œ doFilterInternal() ๊ฐ€ ๋ฐ”๋กœ ํ•„ํ„ฐ ๋‚ด์—์„œ ํ† ํฐ์ด ์กด์žฌํ•˜๋Š”์ง€, ํ•œ๋‹ค๋ฉด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๊ณ  ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ๊ธฐ๋Šฅ ํ•˜๋‚˜์”ฉ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ๋‹ค. ๊ทผ๋ฐ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ๊ตฌํ˜„ํ•ด๋„ ๋˜์ง€๋งŒ ์™ธ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜๋„ ์žˆ๋‹ค. ์ฑ…์„ ์ฐธ๊ณ ํ•œ ๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ช‡๋ช‡ ๋ฉ”์„œ๋“œ๋“ค์€ JwtTokenProvider์—์„œ ๊ตฌํ˜„ํ•˜๊ณ  ์ด๋ฅผ ํ† ํฐ ํ•„ํ„ฐ์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

1. ํ† ํฐ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ

๋จผ์ € ๋ฉ”์„œ๋“œ ์ƒ์œ„์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด POST ์š”์ฒญ์œผ๋กœ๋ถ€ํ„ฐ ํ—ค๋”๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ† ํฐ์„ ์ถ”์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ํ—ค๋”๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋‚ด์šฉ์ด ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์ด ์•„๋‹ ์‹œ ์„œ๋ธ”๋ฆฟ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ธ filterChain.doFilter() ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์š”์ฒญ์˜ ํ—ค๋”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๊ฑฐ๋‚˜ ํ† ํฐ ์ถ”์ถœ์ด ์‹คํŒจํ•˜๋ฉด ๋ฐ”๋กœ ์„œ๋ธ”๋ฆฟ์„ ์‹คํ–‰ํ•œ๋‹ค.

2. ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ

๋จผ์ € ํ† ํฐ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํ† ํฐ์˜ ๋งŒ๋ฃŒ ๋‚ ์งœ๊ฐ€ ์–ธ์ œ์ธ์ง€ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ† ํฐ์œผ๋กœ๋ถ€ํ„ฐ Claim ์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ JwtTokenProvider ์—์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค:

๋น„๋ฐ€ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์ฃผ์–ด์ง„ ํ† ํฐ์œผ๋กœ๋ถ€ํ„ฐ Claim ์ฆ‰ ์†์„ฑ๊ฐ’๋“ค์„ ์ถ”์ถœํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ์ถ”์ถœ๋œ ์†์„ฑ๊ฐ’๋“ค์—์„œ getExpiration() ์„ ์‚ฌ์šฉํ•ด ๋งŒ๋ฃŒ ๋‚ ์งœ๋ฅผ ๊ฐ€์ ธ์˜จ ๋’ค ํ˜„์žฌ์˜ ๋‚ ์งœ์™€ ๋น„๊ตํ•œ๋‹ค. ์ด๋ฏธ ๋งŒ๋ฃŒ ๋‚ ์งœ๊ฐ€ ํ˜„์žฌ ๋‚ ์งœ๋ณด๋‹ค ์ด์ „์— ์žˆ์œผ๋ฉด ์ด๋ฏธ ๋งŒ๋ฃŒ๋œ ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด boolean ํƒ€์ž…์˜ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค:

๋งŒ๋ฃŒ ๋‚ ์งœ๊ฐ€ ์˜ค๋Š˜๋ณด๋‹ค ์ด์ „์ด๋ฉด isExpired() ๋Š” true ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ† ํฐ ํ•„ํ„ฐ์—์„œ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋‹ค์Œ ํ•œ ์ค„๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค:

if (JwtTokenProvider.isExpired(token)) filterChain.doFilter(request, response);

3. ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๋Š” ๊ธฐ๋Šฅ

์‚ฌ์šฉ์ž ์ธ์ฆ์˜ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  • ์‚ฌ์šฉ์ž ์•„์ด๋””๋ฅผ ํ† ํฐ์œผ๋กœ๋ถ€ํ„ฐ ์•Œ์•„๋‚ธ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ํ† ํฐ์œผ๋กœ๋ถ€ํ„ฐ ์•Œ์•„๋‚ธ๋‹ค.
  • ์•„์ด๋””์™€ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์ธ์ฆ๋œ ํ† ํฐ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค UsernamePasswordAuthenticationToken ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • SecurityContextHolder ์— ์ธ์ฆ๋œ ํ† ํฐ์„ ์ €์žฅํ•œ๋‹ค.

ํ•˜๋‚˜์”ฉ ์ง„ํ–‰ํ•ด๋ณด์ž. ์šฐ์„  ์‚ฌ์šฉ์ž ์•„์ด๋””์™€ ๊ถŒํ•œ์€ ํ† ํฐ์˜ ํด๋ ˆ์ž„์œผ๋กœ๋ถ€ํ„ฐ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. JwtTokenProvider ์— ๋ฉ”์„œ๋“œ๋“ค์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค:

๊ฐ๊ฐ ํ† ํฐ์˜ ํด๋ ˆ์ž„์„ ์ถ”์ถœํ•ด์„œ ์‚ฌ์šฉ์ž ์•„์ด๋””์™€ ๊ถŒํ•œ์„ ์•Œ์•„๋‚ธ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์ธ์ฆ๋œ ํ† ํฐ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ JwtTokenProvider ์— ์ถ”๊ฐ€ํ–ˆ๋‹ค:

์‚ฌ์šฉ์ž ์•„์ด๋””์™€ ๊ถŒํ•œ์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

๋งŒ๋“  ๋ฉ”์„œ๋“œ๋“ค์„ ํ™œ์šฉํ•ด์„œ ํ† ํฐ ํ•„ํ„ฐ์—์„œ SecurityContextHolder ์— ์ธ์ฆ๋œ ํ† ํฐ์„ ์ €์žฅํ•œ๋‹ค:

๐Ÿšฉ ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ์‚ฌํ•ญ๋“ค

์ดํ›„, ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์•„๋‹Œ ์„œ๋น„์Šค์—์„œ ํ† ํฐ ์ƒ์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๊ฒ ๋‹ค๊ณ  ํŒ๋‹จ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ UserService ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์„œ๋น„์Šค๋ฅผ DI ๋ฐ›์•„์„œ ์„œ๋น„์Šค์—์„œ ๊ตฌํ˜„๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ๋‹ค:

UserService ๋ฅผ ์ƒ์„ฑํ•ด ์ •ํ•ด์ง„ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” authenticate() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.
UserService ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ DI ๋ฐ›์•„์„œ ํ† ํฐ์„ ์ƒ์„ฑํ•œ๋‹ค.

 

๋˜ํ•œ, ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” JwtTokenProvider ์—์„œ์˜ ๋น„๋ฐ€ ํ‚ค์™€ ํ† ํฐ ํ•„ํ„ฐ์—์„œ ์ธ์ฆ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋น„๋ฐ€ ํ‚ค๊ฐ€ ์ผ์น˜ํ•˜๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ† ํฐ ์ƒ์„ฑ ์‹œ ์„œ๋น„์Šค์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ๋ถ€ํ„ฐ ๋น„๋ฐ€ ํ‚ค๋ฅผ ๊ฐ€์ ธ์™€ createToken ์— ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋„ฃ์–ด์ฃผ๋„๋ก ๋ณ€๊ฒฝํ–ˆ๋‹ค. createToken ์€ ์ด์ „์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋˜ ์‚ฌ์šฉ์ž ์•„์ด๋””, ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์™ธ์—๋„ ๋น„๋ฐ€ ํ‚ค๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ† ํฐ ํ•„ํ„ฐ์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋น„๋ฐ€ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  JwtTokenProvider ์— ์žˆ๋Š” ์ƒ์„ฑ์ด ์•„๋‹Œ ์ธ์ฆ์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋“ค์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋„ฃ์–ด์ฃผ์–ด์„œ, ์ธ์ฆ ์‹œ์— ์ผ๊ด„์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๋น„๋ฐ€ ํ‚ค๋กœ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ธ์ฆ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค. ์ด์ œ ํ† ํฐ์„ ์ƒ์„ฑํ•  ๋•Œ์™€ ์ธ์ฆํ•  ๋•Œ ๊ฐ™์€ ๋น„๋ฐ€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํ•„ํ„ฐ ์ฒด์ธ ๋‚ด์—์„œ JwtTokenProvider ์˜ ๋ฉ”์„œ๋“œ๋“ค์„ ํ˜ธ์ถœํ•  ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ secretKey ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. ์ด secretKey ๋Š” ๋ณด์•ˆ ํ•„ํ„ฐ ์„ค์ •์—์„œ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„ addFilterBefore ์—์„œ ํ† ํฐ ํ•„ํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋„ฃ์–ด์ค€ secretKey ์™€ ๋™์ผํ•œ ๊ฒƒ์ด๋‹ค.

 

๋ณ€๊ฒฝ๋œ JwtTokenProvider ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค:

๋ชจ๋“  ๋ฉ”์„œ๋“œ์— secretKey ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
isExpired ์—์„œ๋„ extractClaims ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— secretKey ๊ฐ€ ํฌํ•จ๋˜์—ˆ๋‹ค.

์ด์ œ ๋‹ค์‹œ Swagger ๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž. ์ด์ „๊ณผ ๋‹ค๋ฅด๊ฒŒ addFilterBefore ์ด ์žˆ์–ด๋„ ํ™”๋ฉด์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค:

์ •์ƒ์ ์œผ๋กœ swagger ๊ฐ€ ๋‚˜์˜จ๋‹ค. ํ† ํฐ ํ•„ํ„ฐ๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿš€ ํŠน์ • API์—์„œ ์ธ์ฆ ์š”์ฒญํ•˜๊ธฐ

์ด์ œ ํŠน์ • POST API ์š”์ฒญ์—์„œ ์ด์ „์— ์„œ๋ฒ„์—์„œ ๋ฐœํ–‰๋œ ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ์ธ์ฆ๋ฐ›์ง€ ์•Š์œผ๋ฉด ์š”์ฒญํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“ค์–ด๋ณด์ž. ์ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ฒŒ์‹œํŒ์— ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž๋งŒ ๋Œ“๊ธ€์„ ๋‹ฌ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•œ๋‹ค. ์šฐ์„  SecurityConfig ํด๋ž˜์Šค์—์„œ ๋ณด์•ˆ ํ•„ํ„ฐ์˜ ์†์„ฑ๊ฐ’ ํ•˜๋‚˜๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ํŠน์ • URL ๋กœ ์˜ค๋Š” POST ์š”์ฒญ์„ ์ธ์ฆ์„ ๊ฑฐ์ณ์•ผ๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค:

 .antMatchers(HttpMethod.POST, "/api/v1/comments/new").authenticated()

์ดํ›„ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ์œ„์˜ URL ๋กœ ์ž„์˜์˜ POST ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ƒํ™ฉ์„ ๊ตฌํ˜„ํ•œ๋‹ค:

๋Œ“๊ธ€์„ ๋‹ค๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด์„œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” Authentication ๊ฐ์ฒด์ด๋‹ค.

์ด์ œ ๋‹ค์‹œ Swagger ๋ฅผ ์—ด๊ณ , ๋Œ“๊ธ€์„ ์•„๋ฌด๋‚˜ ๋‹ฌ ์ˆ˜ ์žˆ๋Š”์ง€, ์–ธ์ œ ์ธ์ฆ์ด ๋˜๋Š”์ง€๋ฅผ ํ™•์ธํ•ด๋ณด๋ คํ–ˆ์ง€๋งŒ, Swagger ์—์„œ๋Š” ํ—ค๋” ์„ค์ •์ด ๊นŒ๋‹ค๋กœ์›Œ์„œ Talend API tester ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค:

์šฐ์„  ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ํ† ํฐ์„ ๋ฐœํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ์˜€๋‹ค.
์ดํ›„ Authorization ํ—ค๋”๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ ๋Œ“๊ธ€์„ ๋‹ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๋‹ˆ, ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค. 403 ์—๋Ÿฌ๊ฐ€ ๋œฌ ๋ชจ์Šต์ด๋‹ค.
Authorization ์„ ํ—ค๋”์— ์ถ”๊ฐ€ํ•˜๊ณ , Bearer ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ† ํฐ ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ๋‹ˆ๊นŒ ์ •ํ™•ํ•˜๊ฒŒ ๋กœ๊ทธ์ธ ํ–ˆ๋˜ ์•„์ด๋””์™€ ํ•จ๊ป˜ ๋Œ“๊ธ€์ด ๋‹ฌ๋ ธ๋‹ค๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜์˜จ๋‹ค.

๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
๊ธ€ ๋ณด๊ด€ํ•จ