Spring Framework/Spring & Spring Boot

[Spring] Spring Security @AuthenticationPrincipal

soogoori 2024. 4. 10. 00:31

 

์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•˜๋‹ค. 

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String currentPrincipalName = authentication.getName();
UserDetails userDetails = (UserDetails) authentication.getPrincipal();

์˜ˆ์ „์—๋Š” ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์œ ์ €๋ฅผ ๋ถˆ๋Ÿฌ์™”๋‹ค.

SecurityContext์— ์ธ์ฆ๋œ Authentication ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด๋‘๊ณ  ํ˜„์žฌ ์Šค๋ ˆ๋“œ ๋‚ด์—์„œ ๊ณต์œ ๋˜์–ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด getName()๋งŒ ๋ถ€๋ฅผ ์ˆ˜๋ฐ–์— ์—†๋‹ค. 

 

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋˜ ์—†๋Š”์ง€ ์ฐพ์•„๋ณด๋˜ ์ค‘์— @AuthenticationPrincipal ์–ด๋…ธํ…Œ์ด์…˜ ํ•˜๋‚˜ ๋ถ™์—ฌ์„œ ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ง๊ด€์ ์ด๊ณ  ํŽธ๋ฆฌํ•œ ๊ฒƒ ๊ฐ™์ด ๋Š๊ปด์ ธ ์ด ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค. 

 

์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€ ์•Œ์•„๋ณด์ž. 

 

@AuthenticationPrincipal

@AuthenticationPrincipal ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ๊ฐ์ฒด(UserDetails ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์œ ์ € ๊ฐ์ฒด)๋ฅผ ์ธ์ž์— ์ฃผ์ž…ํ•˜์—ฌ JWT ์ •๋ณด์— ํ•„ํ„ฐ๋ง๋œ ์œ ์ € ์ •๋ณด๋ฅผ Controller์— ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 

@RestController
public class GetUserWithAuthenticationPrincipalAnnotationController {
    
    @GetMapping("/user")
    public String getUser(@AuthenticationPrincipal UserDetails userDetails) {
        return "User Details: " + userDetails.getUsername();
    }
}

 

 

โ˜€๏ธ ์ž‘๋™์›๋ฆฌ 

 

@AuthenticationPrincipal ์–ด๋…ธํ…Œ์ด์…˜ ์ž‘๋™ ์›๋ฆฌ๋Š” ์œ„์™€ ๊ฐ™๋‹ค. 

์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” SecurityContext์—์„œ ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , authentication ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค.

Authentication ๊ฐ์ฒด๋Š” getPrincipal()๋กœ ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ์ฃผ์ฒด(Principal)์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ parameter๋ฅผ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ฒฐ๊ตญ SecurityContextHolder์— ์ €์žฅ๋œ ์ธ์ฆ ๊ฐ์ฒด์˜ principal์„ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ค„์—ฌ์ค€ ๊ฒƒ์ด๋‹ค!

 

 

 

User ๊ฐ์ฒด ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์œ ์ € ๊ฐ์ฒด๋ฅผ ์ „๋ถ€ ๊ฐ€์ ธ์™€ ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. 

๋ณดํ†ต UserDetails ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด ์‚ฌ์šฉ์ž์˜ ๊ธฐ๋ณธ์ •๋ณด + ์‚ฌ์šฉ์ž ์ง€์ • ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” UserAccount๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค. 

์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฉ”์„œ๋“œ์ธ loadUserByUsername()๋ฅผ ํ†ตํ•ด UserAccount ํด๋ž˜์Šค๊ฐ€ ๋ฐ˜ํ™˜๋˜๋„๋ก ์ž‘์„ฑํ–ˆ๋‹ค. 

JwtTokenProvider ํด๋ž˜์Šค์— ์ƒ์„ฑํ•œ ๋ฉ”์„œ๋“œ

ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ์œ„์™€ ๊ฐ™์ด ํ™œ์šฉ๋œ๋‹ค. 


์™„์„ฑ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์œ ์ €์˜ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ

https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/core/annotation/AuthenticationPrincipal.html

https://www.baeldung.com/get-user-in-spring-security

https://wildeveloperetrain.tistory.com/324#google_vignette