소셜 로그인 구현하기(1)

양현민·2025년 5월 19일
1

이번에는 전에 구현하였던 스프링 부트 게시판에 Google 소셜 로그인 기능을 추가할 것이다.
코드보다는 어떤 흐름으로 흘러가는지 정리하고 실제 전체 코드는 깃허브에 정리할 것이다 !!


🌟 소셜 로그인 흐름 정리 🌟

1. 사용자가 "Google로 로그인" 버튼 클릭
2. 구글 로그인 페이지로 이동
3. 구글 계정으로 로그인
4. 로그인 성공 후, 다시 우리 서버로 이동
5. 서버가 구글에서 사용자 정보 받아옴 (이메일 등)
6. 사용자 정보로 DB에 가입 or 로그인 처리
7. 그 사용자에게 JWT 토큰을 발급해서 응답으로 전달
8. 이후 요청부터는 이 JWT를 이용해서 인증 처리

1. 구글 클라우드 콘솔에서 클라이언트 ID, 시크릿 발급

구글 클라우드 콘솔에서 클라이언트 ID랑 비밀번호를 발급받으면 되는데 이때 비밀번호는 한 번만 확인 가능하므로 꼭 기억해 둘 것 !!


2. application-oauth.yml 생성

OAuth 인증 정보를 스프링에 등록하기 위한 설정 파일
(Spring이 구글과 통신할 때 이 정보들을 사용함)

# src/main/resources/application-oauth.yml
spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: [발급받은 client-id]
            client-secret: [발급받은 secret]
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            scope:
              - email
              - profile

3. application.properties설정

application.properties에 설정 파일을 불러온다.

spring.config.import=optional:application-oauth.yml

4. SecurityConfig.java 생성

구글 소셜 로그인을 구현하기 위해 Spring Security가 로그인 요청을 어떻게 처리할지 설정하는 단계**

  • 누가 어떤 URL에 접근할 수 있는지
  • 로그인은 구글로 할지, 일반 로그인을 쓸지
  • 로그인 성공하면 어떤 처리를 할지
    이걸 모두 알려주는 파일이 SecurityConfig.java다.

5. CustomOAuth2UserService 생성

사용자가 구글 로그인을 성공하면, 구글이 우리 서버로 "이 사람 이메일, 이름 이런 정보야~" 라고 보내준다.
이때 이 정보를 받아서 우리 DB에 있는 회원인지 확인하고, 없으면 회원가입 처리까지 하는 클래스이다.

✔️ 이 클래스가 하는 일 요약

  1. 구글에서 사용자 정보(email 등) 받아옴
  2. 필요한 정보(email)을 추출함
  3. (나중에) DB에 이 이메일이 있는지 확인할 수 있음
  4. 권한 + 사용자 정보 묶어서 리턴함

6. OAuth2SuccessHandler 생성

로그인에 성공했을 때 JWT 토큰을 생성해서 응답 헤더에 넣어주는 클래스

✔️ 이 클래스가 하는 일 요약

  1. 로그인 성공 시 실행됨 (Spring Security가 자동으로 호출)
  2. 로그인한 사용자 정보(이메일) 꺼냄
  3. 그 이메일로 JWT 토큰 생성
  4. JWT 토큰을 클라이언트가 저장할 수 있도록 응답에 실어 보냄
  5. "/" 등 원하는 페이지로 리다이렉트함

7. JWTUtil.java 생성

로그인 성공 시, 사용자 이메일을 넣고 JWT 토큰을 만들어주는 도구 역할을 하는 클래스
(나중에 이 토큰을 검증하고 유저 정보 추출할 때도 이 클래스에서 처리)


// JWT는 다음과 같이 생성됩니다:

public String createJwt(String email, long expireMs) {
    return Jwts.builder()
        .setSubject(email)
        .setIssuedAt(new Date())
        .setExpiration(new Date(System.currentTimeMillis() + expireMs))
        .signWith(SignatureAlgorithm.HS256, secretKey)
        .compact();
}

이메일과 만료 시간을 바탕으로 JWT 토큰을 만들어 반환


8. JWTFilter.java 생성

사용자가 구글 로그인 -> JWT 발급 받아서 저장한 것을 사용자가 다른 페이지나 API를 요청할 때 Authorization 헤더에 있는 JWT 토큰을 읽고, 유효한지 확인하는 필터

✔️ 이 필터가 하는 일 요약

  1. 요청 헤더에서 JWT 토큰을 꺼낸다.
  2. JWT를 검증해서 사용자 이메일을 확인한다.
  3. 그 이메일로 인증 객체를 만들어 Spring Security에 등록한다.
  4. 이후 요청은 "로그인 된 사용자"로 처리된다.

아래와 같이JWTFilterSecurityConfig에 등록해주면 된다.

http.addFilterBefore(jwtFilter,UsernamePasswordAuthenticationFilter.class);

마무리..

구현 과정에서 예상보다 많은 오류가 발생했지만, 단계별 흐름을 정리하면서 구조를 이해할 수 있었다. 다음주까지는 오류를 모두 해결하고 실제 작동하는 로그인 기능까지 완성해야겠다 !!

2개의 댓글

comment-user-thumbnail
2025년 5월 20일

이미지로 처음에 정리해주셔서 이해하기 편했습니다! 고생하셨습니다..!

답글 달기
comment-user-thumbnail
2025년 5월 27일

고생하셨습니다

답글 달기