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

[Spring Security] ํ† ํฐ ์ƒ์„ฑ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ์ •๋ณด ๋นผ์˜ค๋Š” ํด๋ž˜์Šค ์ฝ”๋“œ - TokenProvider

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

์ „ ํฌ์ŠคํŒ…์—์„œ ์˜์กด์„ฑ ์ถ”๊ฐ€,

์ด์Šˆ ๋ฐœ๊ธ‰์ž & ๋น„๋ฐ€ํ‚ค ์„ค์ •ํ•œ๋‹ค์Œ

๊ทธ๊ฑธ ๋ณ€์ˆ˜๋กœ ๊ฐ–๊ณ ์˜ค๋Š” ํด๋ž˜์Šค (JwtProperties.java) ๋งŒ๋“ค์—ˆ์Œ

โ€‹

์ด๋ฒˆ์—๋Š” ํ† ํฐ ์ƒ์„ฑํ•˜๊ณ , ์œ ํšจ์„ฑ ๊ฒ€์ฆํ•˜๊ณ ,

ํ† ํฐ์—์„œ ํ•„์š”ํ•œ ์ •๋ณด ๋นผ์˜ค๋Š” ํด๋ž˜์Šค ์ž‘์„ฑํ• ๊ฑฐ์ž„

โ€‹

์ด๋ฆ„์€ TokenProvider.java

์œ„์น˜๋Š”

config/jwt ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด

 

 

 

/*
ํ† ํฐ ์ƒ์„ฑ & ์˜ฌ๋ฐ”๋ฅธ ํ† ํฐ์ธ์ง€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
ํ† ํฐ์—์„œ ํ•„์š”ํ•œ ์ •๋ณด ๊ฐ€์ ธ์˜ค๋Š” ํด๋ž˜์Šค
 */
@RequiredArgsConstructor
@Service
public class TokenProvider {

    private final JwtProperties jwtProperties;

    public String generateToken(User user, Duration expiredAt) {

        Date now = new Date();

        return makeToken(new Date(now.getTime() + expiredAt.toMillis()), user);

    }

    // JWT ํ† ํฐ ์ƒ์„ฑ ๋ฉ”์„œ๋“œ
    private String makeToken(Date expiry, User user) {

        Date now = new Date();

        return Jwts.builder()
                .setHeaderParam(Header.TYPE, Header.JWT_TYPE)
                .setIssuer(jwtProperties.getIssuer())
                .setIssuedAt(now)
                .setExpiration(expiry)
                .setSubject(user.getEmail())
                .claim("id", user.getId())
                .signWith(SignatureAlgorithm.HS256, jwtProperties.getSecretKey())
                .compact();
    }

    // JWT ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋ฉ”์„œ๋“œ
    public boolean validToken(String token) {
        try{
            Jwts.parser().setSigningKey(jwtProperties.getSecretKey())
                    .parseClaimsJws(token);

            return true;
        } catch (Exception e){
            return false;
        }
    }

    // ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ
    public Authentication getAuthentication(String token) {

        Claims claims = getClaim(token);

        Set<SimpleGrantedAuthority> authorities = Collections.singleton(new SimpleGrantedAuthority("ROLE_USER"));

        return new UsernamePasswordAuthenticationToken(new org.springframework.security.core.userdetails.User(claims.getSubject(), "", authorities), token, authorities);
    }

    // ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ ์ € ID ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ
    public Long getUserId(String token) {

        Claims claims = getClaim(token);

        return claims.get("id", Long.class);
    }

    private Claims getClaim(String token) {
        return Jwts.parser()
                .setSigningKey(jwtProperties.getSecretKey())
                .parseClaimsJws(token)
                .getBody();
    }
}

 

์ฑ…์— ์žˆ๋Š” ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ์ธ๋ฐ,

import ๋ช‡๊ฐœ ์ž˜๋ชปํ•ด์„œ ์—๋Ÿฌ๋‚ฌ์—ˆ์Œ

โ€‹

์Œฉ๋šฑ๋งž์€๊ฑฐ importํ•˜์ง€์•Š๊ฒŒ ์กฐ์‹ฌํ•˜์‚ผ

โ€‹

โ€‹

์ด์ œ ํ•œ์ค„์”ฉ ๋œฏ์–ด์„œ ๋ถ„์„ํ•ด๋ณด๊ฒŸ์‚ผ

 

 

 


 

 

public String generateToken(User user, Duration expiredAt) {

        Date now = new Date();

        return makeToken(new Date(now.getTime() + expiredAt.toMillis()), user);

    }

 

์ œ์ผ ๋จผ์ € ํ† ํฐ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜

generateToken ๋ฉ”์„œ๋“œ

์ธ์ž๋กœ user๋ž‘ ๋งŒ๋ฃŒ์ผ์ž ๋ฐ›์•„์„œ ๋งŒ๋“ ๋‹ค

return ํƒ€์ž…์€ String์ด๊ณ 

makeToken๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋งŒ๋“  ํ† ํฐ์„ returnํ•จ

 

 

 

 


 

์ด์ œ makeToken()๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ฉด

 

// JWT ํ† ํฐ ์ƒ์„ฑ ๋ฉ”์„œ๋“œ
    private String makeToken(Date expiry, User user) {

        Date now = new Date();

        return Jwts.builder()
                .setHeaderParam(Header.TYPE, Header.JWT_TYPE)
                .setIssuer(jwtProperties.getIssuer())
                .setIssuedAt(now)
                .setExpiration(expiry)
                .setSubject(user.getEmail())
                .claim("id", user.getId())
                .signWith(SignatureAlgorithm.HS256, jwtProperties.getSecretKey())
                .compact();
    }

 

์ด๊ฒŒ ์ด์ œ ๋”ฑ JWT ํ† ํฐ์„ ๋งŒ๋“œ๋Š” ๋ฉ”์ธ ํ•จ์ˆ˜์ž„

โ€‹

โ€‹

expiry๋ž‘ user๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์Œ.

expiry๋Š” new Date(now.getTime() + expiredAt.toMillis())

๋กœ generateToken์—์„œ ๋„ฃ์–ด์ฃผ๊ณ ์žˆ์Œ.

โ€‹

์ฆ‰, ํ˜„์žฌ ์‹œ๊ฐ now๋กœ๋ถ€ํ„ฐ expiredAt๋งŒํผ ๋”ํ•œ ์‹œ์  = ๋งŒ๋ฃŒ ์‹œ๊ฐ„(expiry) ์„ ๊ณ„์‚ฐ

์ •๋ฆฌํ•˜์ž๋ฉด

expiry๋Š” JWT์˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ์•Œ๋ ค์ฃผ๋Š” Duration๊ฐ์ฒด์ž„!

โ€‹

์ฐธ๊ณ ๋กœ

Jwts.builder() ๋ถ€๋ถ„์€ JWT ํ† ํฐ์„ "์ง์ ‘ ๊ตฌ์„ฑ(Build)"ํ•˜๋Š” ๊ณณ

โ€‹

โ€‹

.setHeaderParam(Header.TYPE, Header.JWT_TYPE)

ํ—ค๋” ํƒ€์ž…์„ JWT๋กœ ์ง€์ •ํ•˜๊ณ 

โ€‹

.setIssuer(jwtProperties.getIssuer())

propertiesํŒŒ์ผ์—์„œ ์ง€์ •ํ•œ ์ด์Šˆ์–ด ๊ฐ’์œผ๋กœ ์ง€์ •ํ•จ

โ€‹

.setIssuedAt(now)

.setExpiration(expiry)

๋งŒ๋“ค์–ด์ง„ ์‹œ๊ฐ„, expiry(์œ ํšจ์‹œ๊ฐ„) ๋„ฃ์–ด์ฃผ๊ณ  ์žˆ๊ณ 

โ€‹

.setSubject(user.getEmail())

์œ ์ € ์ด๋ฉ”์ผ ๋„ฃ์–ด์ฃผ๊ณ ์žˆ์Œ

์‚ฌ์šฉ์ž ์‹๋ณ„ ์ •๋ณด

์ธ์ฆ ๊ณผ์ •์—์„œ ใ…‡์ด ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ์ž ์กฐํšŒํ•  ์ˆ˜๋„์žˆ๋‹ค๊ณ  ํ•จ

โ€‹

โ€‹

.claim("id", user.getId())

์ฟจ๋ž˜์•” id = ์œ ์ € ID

์ปค์Šคํ…€ ํด๋ ˆ์ž„ ๋„ฃ๋Š” ๋ถ€๋ถ„.

id๋ผ๋Š” ํ‚ค์— ์œ ์ €ID๋ฅผ ๋„ฃ๊ณ ์žˆ์Œ.

์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ํ‚ค-๊ฐ’ ํ˜•ํƒœ๋กœ ์‚ฝ์ž… ๊ฐ€๋Šฅ

(ex. claim("role", "ADMIN") ๋“ฑ..)

โ€‹

.signWith(SignatureAlgorithm.HS256, jwtProperties.getSecretKey())

ํ† ํฐ์— ๋””์ง€ํ„ธ ์„œ๋ช…

์š” ์„œ๋ช…์„ ํ†ตํ•ด์„œ ๋ณ€์กฐ ์—ฌ๋ถ€ ํŒ๋‹จ ๊ฐ€๋Šฅ

โ€‹

.compact();

์ง€๊ธˆ๊นŒ์ง€ ์„ค์ •ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํ•˜๋‚˜์˜ JWT ๋ฌธ์ž์—ด(String)์œผ๋กœ ์••์ถ•ํ•ด์„œ

๋ฐ˜ํ™˜!!!!

โ€‹

๊ทธ๋Ÿผ ์ตœ์ข…์ ์œผ๋กœ

aaaaa.bbbbb.cccc

์ด๋Ÿฐ ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” JWTํ† ํฐ ๋ชจ์–‘์ƒˆ๊ฐ€ ๋จ.

โ€‹

โ€‹

 


๋‹ค์Œ์€ JWTํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฉ”์„œ๋“œ

 

// JWT ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋ฉ”์„œ๋“œ
    public boolean validToken(String token) {
        try{
            Jwts.parser().setSigningKey(jwtProperties.getSecretKey())
                    .parseClaimsJws(token);

            return true;
        } catch (Exception e){
            return false;
        }
    }

โ€‹

 

Jwts.parser().setSigningKey(jwtProperties.getSecretKey())

.parseClaimsJws(token);

์šฐ๋ฆฌ๊ฐ€ propertiesํŒŒ์ผ์—์„œ ์ง€์ •ํ•ด๋†จ๋˜

secret_key๋กœ ๋ณตํ˜ธํ™” ํ•˜๋Š” ๊ณผ์ •์ž„.

โ€‹

๋ณตํ˜ธ ๊ณผ์ •์—์„œ ์—๋Ÿฌ ์•ˆ๋‚˜๋ฉด true ๋ฐ˜ํ™˜ํ•จ.

 

 

 


 

 

// ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ
    public Authentication getAuthentication(String token) {

        Claims claims = getClaim(token);

        Set<SimpleGrantedAuthority> authorities = Collections.singleton(new SimpleGrantedAuthority("ROLE_USER"));

        return new UsernamePasswordAuthenticationToken(new org.springframework.security.core.userdetails.User(claims.getSubject(), "", authorities), token, authorities);
    }

 

์œ„์—์„œ ๋งŒ๋“  token์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ

์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์•„ Authentication๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž„.

โ€‹

Claims claims = getClaim(token);

JWT ํ† ํฐ ํŒŒ์‹ฑํ•ด์„œ JWTํŽ˜์ด๋กœ๋“œ(body)๋‚ด์šฉ์„ Claims ๊ฐ์ฒด ๋กœ ๋ฐ›์•„์˜ด

์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ์ด ๋“ค์–ด์žˆ๋Š” ํ† ํฐ ์ œ๋ชฉ sub์™€ ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ

์ธ์ฆ ์ •๋ณด๋ฅผ ์ƒ์„ฑ.

์ด ์•ˆ์— subject, id, exp..๋“ฑ ์žˆ์Œ

โ€‹

โ€‹

โ€‹

Set<SimpleGrantedAuthority> authorities = Collections.singleton(new SimpleGrantedAuthority("ROLE_USER"));

์œ ์ €์—๊ฒŒ ๋ถ€์—ฌ๋œ ๊ถŒํ•œ ๋ชฉ๋ก์„ ์„ค์ •ํ•จ

(์—ฌ๊ธฐ์„œ๋Š” ROLE_USER ํ•˜๋‚˜๋งŒ ์„ค์ •ํ–ˆ์Œ)

โ€‹

โ€‹

return new UsernamePasswordAuthenticationToken(new org.springframework.security.core.userdetails.User(claims.getSubject(), "", authorities), token, authorities);

์ด ์ค„์ด ํ•ต์‹ฌ์ธ๋ฐ,

์ตœ์ข…์ ์œผ๋กœ Authentication ๊ฐ์ฒด ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฑฐ์ž„

( ๋ณดํ†ต ์ด getAuthentication()๋ฉ”์„œ๋“œ๋Š”

JWT ํ•„ํ„ฐ ๋‚ด์—์„œ ํ˜ธ์ถœ๋จ.

Authentication๊ฐ์ฒด๋ฅผ SecurityContext์— ๋“ฑ๋กํ•ด์ฃผ๋Š”๊ฒƒ. )

โ€‹

์ธ์ž๊ฐ€ ์„ธ๊ฐœ์ธ๋ฐ,

UserDetail ๊ฐ์ฒด, token, authorities

์ด๋ ‡๊ฒŒ ์„ธ๊ฐœ์ž„.

์ง€ํ”ผํ‹ฐ ๋Œ๋ ค๋ณด๋‹ˆ๊นŒ

(principle, credentials, authorities๋ผ๊ณ  ํ•จ)

โ€‹

โ€‹

์ฒซ๋ฒˆ์งธ๋ถ€ํ„ฐ ๋ณด๋ฉด

principle์€ "์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด" ๋ผ๊ณ  ํ•จ.

new org.springframework.security.core.userdetails.User(claims.getSubject(), "", authorities)

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๋‚ด๋ถ€์ ์œผ๋กœ ์“ฐ๋Š” UserDetail ๊ฐ์ฒด ๋งŒ๋“ค๊ณ  ์žˆ์Œ.

UserDetail ๊ฐ์ฒด ๋„˜๊ฒจ์„œ, ๋‚˜์ค‘์— ์ปจํŠธ๋กค๋Ÿฌ์—์„œ @AuthenticationPrinciple๋กœ ์œ ์ € ์ •๋ณด

๋ฝ‘์•„๋‚ด์„œ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ.

โ€‹

claims.getSubject() ๋Š” ํ† ํฐ์—์„œ ์ถ”์ถœํ•œ ์ด๋ฉ”์ผ or ์œ ์ €๋„ค์ž„ (์‹๋ณ„๋˜๋Š”๊ฑฐ. ๋‚ด ๊ฒฝ์šฐ email)

โ€‹

"" : ๋นˆ ๋ฌธ์ž์—ด. ๋น„๋ฒˆ ํ•„์š” ์—†์œผ๋‹ˆ๊นŒ

์ด๊ฑฐ ์™œ๋„ฃ๋ƒ?

UserDetail ๊ฐ์ฒด์ธ User๋งŒ๋“ค ๋•Œ ๋น„๋ฒˆ๋„ ๋„ฃ์–ด์•ผ๋จ.

๊ทผ๋ฐ ์šฐ๋ฆฌ๋Š” JWT ๋ฐฉ์‹์œผ๋กœ ํ•˜๊ณ  ์žˆ์–ด์„œ ์•„๋ฌด ์˜๋ฏธ ์—†์Œ

๋…ธ์˜๋ฏธ. ๊ทธ๋ž˜์„œ ๋นˆ ๋ฌธ์ž์—ด ๋„ฃ๋Š”๊ฑฐ์ž„.

โ€‹

authorites : ์ด ์œ ์ €์˜ ๊ถŒํ•œ๋“ค. ์—ฌ๊ธฐ์„œ๋Š” ROLE_USER

โ€‹

โ€‹

๋‘๋ฒˆ์งธ ์ธ์ž ๋ณด๋ฉด

token

โ€‹

credentials๋ผ๊ณ  ํ•จ.

์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆํ•  ๋•Œ ์ œ์ถœํ•œ ์ž๊ฒฉ ์ฆ๋น™. ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ „ํ†ต์ ์ธ ๋กœ๊ทธ์ธ์ด๋ผ๋ฉด ์—ฌ๊ธฐ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค๊ณ ํ•จ.

โ€‹

๊ทผ๋ฐ ์šฐ๋ฆฐ JWT ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ํ•˜๋Š” ์ค‘์ด๋ผ

ํ† ํฐ ์ž์ฒด๊ฐ€ ์ธ์ฆ ์ˆ˜๋‹จ์ด๋ผ์„œ

๊ฑ token๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ ๋„ฃ๋Š”๊ฑฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

โ€‹

โ€‹

โ€‹

์„ธ๋ฒˆ์งธ ์ธ์ž ๋ณด๋ฉด

authorities

โ€‹

์œ„์—์„œ

Collections.singleton(new SimpleGrantedAuthority("ROLE_USER"))

๋กœ ๊ถŒํ•œ ๋ชฉ๋ก ๋งŒ๋“ค์—ˆ์Œ.

โ€‹

์ง€๊ธˆ์€ ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ROLE_USERํ•˜๋‚˜๋งŒ ๋„ฃ์€ ์ƒํƒœ๊ธดํ•จ.

โ€‹

์ด ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๊ถŒํ•œ์„ ๊ฐ–๊ณ  ์žˆ๋Š”๊ฐ€?๋ฅผ

์š”๊ฑธ๋กœ ์ฒดํฌํ•จ.

 

 

 

 

 

 


// ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ ์ € ID ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ
    public Long getUserId(String token) {

        Claims claims = getClaim(token);

        return claims.get("id", Long.class);
    }

 

ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ user์˜ ID๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ์ž„

JWTํ† ํฐ์—์„œ ์œ ์ € ID๋ฅผ ๊บผ๋‚ด๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜.

โ€‹

getClaimํ•จ์ˆ˜ ํ˜ธ์ถœํ•ด์„œ ํด๋ ˆ์ž„ ์ •๋ณด ๋ฐ›๊ณ ,

๊ทธ ํด๋ ˆ์ž„์—์„œ id ํ‚ค๋กœ ์ €์žฅ๋œ ๊ฐ’ ๊ฐ€์ ธ์™€์„œ ๋ฐ˜ํ™˜ํ•จ.

โ€‹

๊ทธ๋ ‡๋‹ค๋ฉด ์•„๊นŒ ์œ„์—์„œ Authentication๊ฐ์ฒด ๋งŒ๋“ค ๋•Œ๋„ userId ๊บผ๋‚ด์˜ค์ง€ ์•Š์•˜๋ƒ

์ด ํ•จ์ˆ˜๊ฐ€ ์™œ ํ•„์š”ํ•˜๋ƒ?

โ€‹

๊ทธ๊ฑด Authentication๊ฐ์ฒด ์•ˆ์“ฐ๊ณ  ํ† ํฐ์—์„œ ์œ ์ €ID๋งŒ ์ง์ ‘ ๊บผ๋‚ด๊ณ  ์‹ถ์„๋•Œ๊ฐ€

์žˆ๊ธฐ ๋•Œ๋ฌธ!

โ€‹

์•„๊นŒ ์œ„์—์„œ ํ•œ๊ฑด, Authentication๊ฐ์ฒด๋ฅผ

SecurityContext์— ๋“ฑ๋กํ•ด์„œ ๊บผ๋‚ด๋ณด๋Š” ์šฉ๋„์˜€์Œ.

โ€‹

โ€‹

โ€‹

๋˜ ๊ถ๊ธˆํ•œ๊ฒŒ

Authentication๊ฐ์ฒด์™€ JWT ํ† ํฐ์˜ ์—ญํ• ์ด ํ˜ผ๋™๋˜๊ธฐ ์‹œ์ž‘ํ•จ

โ€‹

getAuthentication()๋ฉ”์„œ๋“œ ์—ญํ• ์ด ์ธ์ฆ ์ •๋ณด ์ƒ์„ฑ์ด๋ผ๊ณ  ํ•˜๋˜๋ฐ

์ธ์ฆ ์ •๋ณด = JWT์•„๋‹Œ๊ฐ€?

 

 

 

๋ผ๊ณ  ํ•˜์‹ญ๋‹ˆ๋‹ค.

โ€‹

JWT๋Š”, ์ด ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ ๋ฐ›์•˜๋‹ค๋Š” ์ฆ๊ฑฐ๋ฅผ ๋‚ด๋ฏธ๋Š” ํ‹ฐ์ผ“๊ฐ™์€๊ฑฐ๊ณ 

Authentication๊ฐ์ฒด๋Š” ์ธ์ฆ ์ƒํƒœ ํ‘œํ˜„ ๊ฐ์ฒด..๋ผ๊ณ  ํ•จ.

โ€‹

์ฆ‰ getAuthentication()์ด ํ•˜๋Š” ์ผ์€,

JWT ํ† ํฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ,

์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ณตํ˜ธ!ํ•ด์„œ SpringSecurity๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š”

Authentication๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑฐ์ž„.

โ€‹

โ€‹

โ€‹

โ€‹

+

๋˜ ๊ถ๊ธˆํ–ˆ๋˜๊ฒŒ

UsernamePasswordAuthenticationToken์ด๊ฑฐ์˜€์Œ.

์ด๊ฑธ returnํ•˜๊ณ  ์žˆ๋˜๋ฐ, ํƒ€์ž…์€ Authentication์ž„

โ€‹

UsernamePasswordAuthenticationToken์€ Authentiation๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

โ€‹

๊ทธ๋ž˜์„œ

 

UsernamePasswordAuthenticationToken(Object principal, Object credentials, Collection authorities)

 

์ด๋Ÿฐ ๋А๋‚Œ์œผ๋กœ ๋งŒ๋“œ๋Š”๊ฑด๋ฐ,

SpringContextHolder๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋ฅผ UserDetails ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•œใ„ด๋‹ค๊ณ  ํ•จ.

๊ทธ๋ž˜์„œ JWT๋กœ๋ถ€ํ„ฐ ๋ฝ‘์•„๋‚ธ ์‚ฌ์šฉ์ž ์ •๋ณด( claims.getSubject(), "", authorities )

๋ฅผ UserDetailํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์„œ ๋„ฃ๋Š”๊ฒƒ.

โ€‹

โ€‹

โ€‹

โ€‹

โ€‹

๊ทธ๋ ‡๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

โ€‹

๋„˜ ๋ณต์žกํ•จ ใ… 

๋‚ด์ผ ๋‹ค์‹œ ์ •๋ฆฌํ•ด์•ผ์ง€

 

์ ˆ๋Œ€ ์ง€๊ธˆ ๊ท€์ฐฎ์•„์„œ ๊ทธ๋Ÿฐ๊ฑด ์•„๋‹˜

๋ฐ˜์‘ํ˜•