데브코스 33일차 TIL

Heesu Song·2025년 4월 17일

데브코스 - 백엔드

목록 보기
31/32
post-thumbnail

구글과 다르게 추가적인 설정을 수동으로 작성해 줘야 함

  security:
    oauth2:
      client:
        provider:
          naver:
            authorization-uri: https://nid.naver.com/oauth2.0/authorize
            token-uri: https://nid.naver.com/oauth2.0/token
            user-info-uri: https://openapi.naver.com/v1/nid/me
            user-name-attribute: response
        registration:
          naver:
            client-name: naver
            client-id: lItVtDzpM9_KHqoyG2ps
            client-secret: {password}
            redirect-uri:{baseUrl}/{action}/oauth2/code/{registration}”
            authorization-grant-type: authorization_code
            client-authentication-method: client_secret_post
            scope:
              - name
              - nickname
  • redirect-uri 형식 → “{baseUrl}/{action}/oauth2/code/{registration}”
  • authorization-grant-type : 권한 부여 방식 지정
  • client-authentication-method :

❗️여기까지 설정하고 실행하면 로그인 했을때 정보가 저장되지 않는 오류 발생

→ User Attribute 형식이 달라서

naver는 attribute에 response안에 Map 형식으로 들어가있기 때문


해결방법

→ Factory Pattern으로 객체를 생성해주는 클래스를 따로 만들어서 사용

    public static MemberDetails memberDetails(String provider,OAuth2User oauth2User) {

        Map<String, Object> attributes = oauth2User.getAttributes();

        switch ( provider.toUpperCase()){
            case "GOOGLE" -> {
                return MemberDetails.builder()
                        .name(attributes.get("name").toString())
                        .email(attributes.get("email").toString())
                        .attributes(attributes)
                        .build();
            }

            case "NAVER" -> {
                Map<String, Object> properties = (Map<String, Object>) attributes.get("response");
                return MemberDetails.builder()
                        .name(properties.get("name").toString())
                        .email(properties.get("id") + "@naver.com")
                        .attributes(attributes)
                        .build();
            }

            default -> throw new IllegalArgumentException("지원하지 않는 제공자: " + provider);
        }
    }

OAuth2User 를 매개변수로 받는다. → 공급자는 알 수 없기 때문에 provider 도 따로 매개변수로 받아준다.


Service 동작 수정

    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {

        OAuth2User oAuth2User = super.loadUser(userRequest);

        String provider = userRequest.getClientRegistration().getRegistrationId().toUpperCase();

        MemberDetails memberDetails = MemberDetailsFactory.memberDetails(provider, oAuth2User);

        Optional<Member> memberOptional = memberRepository.findByEmail(memberDetails.getEmail());

        //있으면 있는걸 반환해주고 없으면 안에 있는 것을 반환
        Member findMember = memberOptional.orElseGet(
                () -> {
                    Member saved = Member.builder()
                            .email(memberDetails.getEmail())
                            .name(memberDetails.getName())
                            .provider(provider)
                            .build();
                    return memberRepository.save(saved);
                }
        );

        //중복 가입 방지
        if(findMember.getProvider().equals(provider)) {
            return memberDetails.setRole(findMember.getRole());
        } else {
            throw new RuntimeException();
        }
  1. OAuth2User 를 받아옴
  2. provider 를 받아옴

@Accessors(chain = true) → Setter가 체이닝이 된다. → 반환 가능

Kakao OAuth2 실습도 Naver와 동일


JWT 실습


Security Config

  • httpBasic() → http와 관련된 요청 설정 → disable
  • cors() csrf() 도 disable
  • formLogin도 더 이상 HTML로 받지 않기 때문에 disable
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
  • sessionManagement → 세션에 대한 설정
    • sessionCreationPolicy → 세션을 어떻게 다룰지 정책을 결정

→ 더 이상 세션의 상태를 기억하지 않겠다는 설정

적은게 굉장히 적네...ㅎㅎ 아무래도 조퇴해서ㅜ
오늘은 실습 따라가기가 정말 힘들었지만 그래도 재밌다 재밌어!

profile
Abong_log

0개의 댓글