[OAuth2와 JWT] 프로젝트 생성과 설정, 프로젝트 구조

코린이서현이·2024년 6월 20일
0
post-thumbnail

들어가면서

아유 배아파~

프로젝트 생성

의존성과 버전 정보

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.3.0'
	id 'io.spring.dependency-management' version '1.1.5'
}

group = 'com.jsh'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
	implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
	implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
	implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'

}

DB 연결

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.3.0'
	id 'io.spring.dependency-management' version '1.1.5'
}

group = 'com.jsh'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
//	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
//	testImplementation 'org.springframework.security:spring-security-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
	implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
	implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
	implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'

}

tasks.named('test') {
	useJUnitPlatform()
}

프로젝트 구조

동작원리 (내부 로직)

  • 유저가 소셜로그인 버튼 클릭 -> 백엔드
  • 백엔드의 OAuth2AuthorizationRequestRedirectFilter가 소셜로그인 인증서버에 요청 보냄
  • 소셜로그인 서버는 로그인 페이지 제공, 성공과 함께 코드 제공
  • OAuth2LoginAuthenticationFilter 가 코드를 받아서 Access 토큰 발급
    - 토큰을 활용해 리소스 서버로 유저정보 획득
    - jwt 발급
  • 유저에게 jwt 발급

사용할 필터

  • JWTFilter : 우리가 커스텀해서 등록해야 함

  • OAuth2AuthorizationRequestRedirectFilter

    	/oauth2/authorization/서비스명
  • OAuth2LoginAuthenticationFilter : 외부 인증 서버에 설정할 redirect_uri

    	/login/oauth2/code/서비스명

OAuth2 클라이언트에서 우리가 구현해야 할 부분

  • OAuth2UserDetailsService
  • OAuth2UserDetails
  • LoginSuccessHandler

JWT에서 우리가 구현해야 할 부분

  • JWTFilter
  • JWTUtil : JWT를 발급 및 검증하는 클래스

여러 추가 설정

OAuth2를 동작하기 위해 사용하는 변수 정보들

인증요청을 보내는 주소, 토큰을 요청하는 주소, 등등이 필요하다.
자바 코드 내에서 사용해도 되지만(?) 저번에 구글만 쓸때는 그렇게 했었다.
지금은 다른 파일에서 변수를 설정하도록하자

provider부분은 google의 경우 이미 OAuth2 클라이언트가 값을 가지고 있어서 설정을 하지 않아도 된다. 그러나 카카오나 네이버의 경우 꼭 등록을 해야한다.

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-name: Google
            client-id: 서비스에서 발급 받은 아이디
            client-secret: 서비스에서 발급 받은 비밀번호
            redirect-uri: 서비스에 등록한 우리쪽 로그인 성공 URI
            authorization-grant-type: authorization_code
            scope:
              - profile
              - email

# 유명한 서비스의 경우 아래는 이미 알고 있다. 따라서 카카오나 네이버의 경우는 직접 등록이 필요함~!
#        provider:
#          google:
#            authorization-uri: https://accounts.google.com/o/oauth2/auth
#            token-uri: https://oauth2.googleapis.com/token
#            user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
#            user-name-attribute: sub

SecurityConfig 등록

profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글