본문 바로가기

[개인프로젝트] 개발 공부

[프로젝트] 8. Spring Security + OAuth2.0 (feat. JWT)로 간편 로그인 구현하기 (1)

728x90
반응형

이전에 Spring Security + JWT를 이용해 로그인을 구현해 보았다. 이제 여기에 추가로 간편 로그인 기능도 구현해 보자. 간편 로그인은 사실상 어느 웹사이트를 가든 공통적으로 존재하는 요소이다.

사용자들이 로그인을 편하게 하고 해당 서비스를 이용할 수 있게 해 주기에 사용자의 편의성이 좋고 접근성 또한 매우 훌륭하기에 꼭 필요한 기능이라 생각한다.

 

간편 로그인은 OAuth2.0를 이용해 구현하였다. OAuth2.0를 통해 해당 플랫폼의 로그인 정보를 가져와 내쪽에서 회원가입과 로그인이 이루어지고 일반 로그인과 똑같이 로그인에 성공하면 JWT를 발급하는 형식으로 구현하였다.

 

우선 OAuth2.0에 대해 간략하게 알아보자.

 

OAuth2.0

 

OAuth2.0은 인증을 위한 개방형 표준 프로토콜로 제삼자 애플리케이션이 사용자를 대신해 HTTP 서비스를 이용할 수 있는 권한을 부여하는 메커니즘을 제공한다. 기존의 인증 방식과 달리 인증을 중개해 주는 방식

즉, 인증을 소셜 소비스에서 대신해주어 로그인을 진행하게 해주고 인증을 통해 나오는 정보를 우리가 사용하여 서버에 저장이 되는 형식이다. 그래서 서버에서 접근 권한 관리 등을 담당해야 하며, 이 OAuth2.0을 사용하면 접근 권한 관리, 인증 절차를 간단하게 구현할 수 있다.

 

OAuth2.0 제공자는 대표적으로 구글, 카카오, 네이버 등이 있다. 나는 이 중에서 카카오와 네이버를 통한 인증 서비스를 구현할 것이다. 우선 각 플랫폼 별로 api를 등록하고 간단하게 설정을 해보겠다.

 

네이버 로그인

 

네이버 로그인 ▶ 검색 창에 네이버 개발센터 ▶ 상단 탭에서 Application ▶ 애플리케이션 등록으로 이동 후 아래와 같이 설정을 하고 등록한다.

제공 정보 선택은 원하는 대로 설정해도 된다. 

 

반응형

 

 

카카오 로그인

 

검색 창에 카카오 개발센터 ▶ 카카오 로그인 ▶ 상단 탭에서 내 애플리케이션 ▶ 애플리케이션 추가하기 

필수 작성 항목을 작성하고 애플리케이션을 추가한 뒤 왼쪽 메뉴에서 카카오 로그인으로 이동한다.

 

카카오 로그인을 활성화해주고 Redirect URI에 아래와 같이 입력을 해준다.

 

동의항목은 원하는 대로 설정해도 된다. 테스트용이니 네이버, 카카오 둘 다 localhost:8080으로 진행한다.

 

이제 각 플랫폼에서 할 일은 끝났다. 이제 build.gradle과 application.properties를 설정해 주자

 

build.gradle
// build.gradle
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.4'
	id 'io.spring.dependency-management' version '1.1.0'
}

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

java {
	sourceCompatibility = '17'
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'

	// spring-data-jpa dependency
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

	// maria-db
	implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '3.0.8'

	// spring-security dependency
	implementation 'org.springframework.boot:spring-boot-starter-security'
	testImplementation 'org.springframework.security:spring-security-test'
    
    	// oauth2 dependency
	implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
    
    	// jwt token dependency 
	implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
	runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
	runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
	implementation 'javax.xml.bind:jaxb-api:2.3.0' // java 버전에 따른 JAXV API 제거로 인한 의존성 추가
}

jar {
	zip64 = true
	enabled = false // plain 제거
}

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

 

728x90

 

application.properties

 

# application.properties

# naver
spring.security.oauth2.client.registration.naver.client-id={NAVER_CLIENT_ID}
spring.security.oauth2.client.registration.naver.client-secret={NAVER_CLIENT_SECRET}
spring.security.oauth2.client.registration.naver.redirect-uri=http://localhost:8080/login/oauth2/code/naver
spring.security.oauth2.client.registration.naver.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.naver.client-name=Naver
spring.security.oauth2.client.registration.naver.scope=name,email

spring.security.oauth2.client.provider.naver.authorization-uri=https://nid.naver.com/oauth2.0/authorize
spring.security.oauth2.client.provider.naver.token-uri=https://nid.naver.com/oauth2.0/token
spring.security.oauth2.client.provider.naver.user-info-uri=https://openapi.naver.com/v1/nid/me
spring.security.oauth2.client.provider.naver.user-name-attribute=response

# kakao
spring.security.oauth2.client.registration.kakao.client-id={KAKAO_CLIENT_ID}
spring.security.oauth2.client.registration.kakao.client-secret={KAKAO_CLIENT_SECRET}
spring.security.oauth2.client.registration.kakao.redirect-uri=http://localhost:8080/login/oauth2/code/kakao
spring.security.oauth2.client.registration.kakao.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.kakao.client-name=Kakao
spring.security.oauth2.client.registration.kakao.scope=profile_nickname, profile_image
spring.security.oauth2.client.registration.kakao.client-authentication-method=client_secret_post

spring.security.oauth2.client.provider.kakao.authorization-uri=https://kauth.kakao.com/oauth/authorize
spring.security.oauth2.client.provider.kakao.token-uri=https://kauth.kakao.com/oauth/token
spring.security.oauth2.client.provider.kakao.user-info-uri=https://kapi.kakao.com/v2/user/me
spring.security.oauth2.client.provider.kakao.user-name-attribute=id

 

 

네이버 Client ID와 SECRET은 생성한 Application에 들어가면 아래와 사진과 같은 애플리케이션 정보에서 확인이 가능하다.

 

카카오 Client ID는 Application에서 앱 키 부분의 REST API 키를 넣어주면 되고 SECRET은 보안 탭에서 SECRET 코드 생성 버튼을 눌러 발급을 한 뒤 넣어준다.

 

 

Redirect_URI는 위에서 설정한 URI를 넣어주고 Scope는 자신이 동의 항목에서 선택한 것들을 넣어주면 된다.

 

이제 전반적인 설정을 완료했다 이제 기존 Spring Security + JWT와 연동하여 간편 로그인을 구현해 보자

 

관련 포스팅

 

2024.03.21 - [[개인프로젝트] 개발 공부] - [프로젝트] 9. Spring Security + OAuth2.0 (feat. JWT)로 간편 로그인 구현하기 (2)

 

[프로젝트] 9. Spring Security + OAuth2.0 (feat. JWT)로 간편 로그인 구현하기 (2)

이제 본격적으로 구현을 해보자 우선 각 플랫폼 별로 로그인 페이지를 호출하는 코드는 아래와 같다. // naver "http://localhost:8080/oauth2/authorization/naver"}>네이버 // kakao "http://localhost:8080/oauth2/authorizati

rlawo32.tistory.com

 

2024.03.01 - [[개인프로젝트] 개발 공부] - [프로젝트] 5. Spring Security + JWT로 로그인 구현하기 (1)

 

[프로젝트] 5. Spring Security + JWT로 로그인 구현하기 (1)

로그인, 회원가입 개발을 하다 보면 제일 많이 접근하고 자주 구현하게 되는 기능이 아닐까 싶다.예전 막 개발을 시작했을 때는 아무런 기능 없이 회원가입 때 아이디와 비밀번호를 DB에 넣어주

rlawo32.tistory.com

 

2024.03.06 - [[개인프로젝트] 개발 공부] - [프로젝트] 6. Spring Security + JWT로 로그인 구현하기 (2)

 

[프로젝트] 6. Spring Security + JWT로 로그인 구현하기 (2)

이전에 Spring Security 설정을 대략적으로 끝냈다면 이제 JWT를 설정해 보겠다. 우선 JWT dependencies를 작성해 주자 // build.gradle plugins { id 'java' id 'org.springframework.boot' version '3.0.4' id 'io.spring.dependency-manag

rlawo32.tistory.com

 

2024.03.08 - [[개인프로젝트] 개발 공부] - [프로젝트] 7. Spring Security + JWT로 로그인 구현하기 (3)

 

[프로젝트] 7. Spring Security + JWT로 로그인 구현하기 (3)

앞서 Spring Security와 JWT 관련 설정들을 모두 끝냈다면 이제 관련 로직들에 기능들을 적용하여 사용해 보겠다. 로그인 시 JWT 토큰을 발급해 줄 것이고 페이지 새로고침 및 로그인 연장 시 토큰 재

rlawo32.tistory.com

 

728x90
반응형