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

[OAuth2] OAuth2 ์‚ฌ์šฉ์ž ์„œ๋น„์Šค ๊ตฌํ˜„ํ•˜๊ธฐ

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

 

์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒํ•ด์„œ,

 

์œ ์ € ํ…Œ์ด๋ธ”์— ์ •๋ณด๊ฐ€ ์žˆ๋Š” ์‚ฌ์šฉ์ž๋ผ๋ฉด

๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ์ด๋ฆ„์„ ์—…๋Žƒํ•ด์คŒ.

 

์œ ์ € ํ…Œ์ด๋ธ”์— ์ •๋ณด๊ฐ€ ์—†๋Š” ์‚ฌ์šฉ์ž๋ผ๋ฉด

์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ด์„œ DB์— ์ €์žฅ

 

@Table(name = "users")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class User implements UserDetails {

	// ์ƒ๋žต
    
    // ๋‹‰๋„ค์ž„ ํ•„๋“œ ์ถ”๊ฐ€
    @Column(name = "nickname", unique = true)
    private String nickname;
    
    // ๋นŒ๋“œ ํŒจํ„ด์— ๋‹‰๋„ค์ž„ ์ถ”๊ฐ€
    @Builder
    public User(String email, String password, String nickname) {
    this.email = email;
    this.password = password;
    this.nickname = nickname;
    }
    
    // ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ณ€๊ฒฝ
    public User update(String nickname) {
        this.nickname = nickname;

        return this;
    }
    
    

}

 

 

 


๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜จ ์‚ฌ์šฉ์ž ์ •๋ณด๋กœ

ํ…Œ์ด๋ธ” ์กฐํšŒ & ์—…๋ฐ์ดํŠธor์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค

@RequiredArgsConstructor
@Service
public class OAuth2UserCustomService extends DefaultOAuth2UserService {

    private final UserRepository userRepository;


    // ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์—์„œ ๋ณด๋‚ด์ฃผ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฉ”์„œ๋“œ
    // ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์กฐํšŒํ•˜๊ณ 
    // user ํ…Œ์ด๋ธ”์— ์žˆ๋‹ค๋ฉด ์ด๋ฆ„์„ ์—†๋ฐ์ดํŠธ
    // ์—†๋‹ค๋ฉด saveOrUpdate()๋ฉ”์„œ๋“œ ์‹คํ–‰ํ•ด์„œ ํ…Œ์ด๋ธ”์— ํšŒ์› ์ถ”๊ฐ€.
    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {

        // ์š”์ฒญ์„ ๋ฐ”ํƒ•์œผ๋กœ ์œ ์ € ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด ๋ฐ˜ํ™˜
        OAuth2User user = super.loadUser(userRequest);

        saveOrUpdate(user);

        return user;
    }

    private User saveOrUpdate(OAuth2User oAuth2User) {
        Map<String, Object> attributes = oAuth2User.getAttributes();

        String email = (String) attributes.get("email");
        String name = (String) attributes.get("name");

        User user = userRepository.findByEmail(email)
                .map(entity -> entity.update(name))
                .orElse(User.builder()
                        .email(email)
                        .nickname(name)
                        .build());

        return userRepository.save(user);
    }
}

 

loadUser()๋ฉ”์„œ๋“œ๋Š”

๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์—๊ฒŒ ์—‘์„ธ์Šค ํ† ํฐ ์ฃผ๊ณ ,

์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž„.

GET https://kapi.kakao.com/v2/user/me
Authorization: Bearer {access_token}

์ด๋Ÿฐ ์‹์œผ๋กœ...

 

 

 

 

OAuth2UserRequest์—๋Š”

์—‘์„ธ์Šค ํ† ํฐ

ํด๋ผ์ด์–ธํŠธ ๋“ฑ๋ก ์ •๋ณด (๊ตฌ๊ธ€์ธ์ง€ ์นด์นด์˜ค์ธ์ง€..)

์‚ฌ์šฉ์ž ์ •๋ณด URI

 

๋“ฑ์„ ๋‹ด๊ณ  ์žˆ์Œ.

์‚ฌ์šฉ์ž ์ •๋ณด ์ž์ฒด๋Š” ์•ˆ๋“ค์–ด๊ฐ€ ์žˆ์Œ!

์‚ฌ์šฉ์ž ์ •๋ณด๋Š” super.loadUser()๋ถ€๋ชจ ๋ฉ”์„œ๋“œ ํ†ตํ•ด์„œ ์–ป์–ด์˜ด.

 

 

Q. ์‚ฌ์šฉ์ž ์ •๋ณด๋Š” ์–ด๋””์„œ ๋ฐ›๋ƒ?

super.loadUser(userRequest)๊ฐ€ ์—‘์„ธ์Šค ํ† ํฐ์œผ๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญํ•ด์„œ ๋ฐ›์•„์˜ค๋Š”๊ฑฐ์ž„.

 

Q. ์—‘์„ธ์Šค ํ† ํฐ์€ JSON์œผ๋กœ ๋ฐ›์•„์˜ค๋Š”๊ฑฐ๋ผ๋ฉฐ?

OAuth2UserRequest๋Š” SpringSecurity๊ฐ€ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์คŒ.

์ฆ‰, ์Šคํ”„๋ง์‹œํ๋ฆฌํ‹ฐ๋Š” JSON์„ ๋ฐ›์•„์„œ OAuth2UserRequest๋ฅผ ๋งŒ๋“œ๋Š”๊ฑฐ์ž„.

 

 

 

 

 

๋ฐ˜์‘ํ˜•