이번에 새로운 프로젝트를 기획하면서 인증/인가 기능이 필요할 것 같다는 판단이 들었고,
해당 기능을 구현하고자 어떤 기술을 사용할지 고민할 필요가 있었습니다.
먼저, 서버를 Spring boot를 통해 구현하고자 결정했고, Spring boot에서 인증/인가를 쉽게 추가할 수 있는 프레임워크인 Spring Security를 선택했습니다.
그리고 이번 프로젝트에서는 많은 회원 정보를 필요로 하지 않아 간편한 회원가입과 로그인을 사용자에게 제공하기 위해 소셜로그인 기능을 사용하자는 판단으로 OAuth2를 선택했습니다.
마지막으로, 세션 방식에 비해서 상태에 관한 관리가 적어지는 토큰 방식을 선택해서 서버의 부하를 줄이자는 생각과 RESTful 한 개발에 목적을 두고 있기 때문에 stateless 한 JWT를 선택했습니다.
( 하지만 보안적인 문제를 해결하기 위해 Refresh 토큰을 Redis에 저장하게 되면서 완전한 stateless는 깨지게 됩니다...
그래도 세션보다는 서버에 부하가 덜하고, 보다 관리가 편하다는 장점이 있어서 JWT를 유지했습니다. )
사용할 기술 스택을 모두 선택했으니 개발 환경을 설정해 봅시다.
build.gradle은 다음과 같이 필요합니다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.3'
id 'io.spring.dependency-management' version '1.1.4'
}
//...
java {
sourceCompatibility = '17'
}
//...
dependencies {
// Spring Web
implementation 'org.springframework.boot:spring-boot-starter-web'
// lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// JPA - H2
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
// Redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'it.ozimov:embedded-redis:0.7.2'
// OAuth2
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
// JWT 0.12.3
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'
// Spring Security
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.security:spring-security-test'
}
//...
H2 데이터베이스에 사용자 데이터 등을 저장하고, Redis에는 Refresh 토큰을 저장합니다.
( Redis의 TTL 설정을 통해 Refresh 토큰의 생명주기를 쉽게 관리할 수 있어서 도입했습니다!
만약 다른 데이터베이스를 사용한다면, 일정 시간마다 만료된 토큰을 삭제해 주는 등 관리할 필요가 있습니다. )
이렇게 각각의 기술들을 선택한 이유와 gradle 의존성을 먼저 설정하고 이번 포스트는 마무리하겠습니다.
다음 포스트부터는 Spring Security와 OAuth2를 통해 어떻게 회원가입과 로그인이 동작하고, JWT를 사용자에게 넘겨주는지 등등 공부했던 내용을 바탕으로 차례대로 정리하면서 작성해 보겠습니다!!
모두 파이팅!
'WEB > Spring' 카테고리의 다른 글
Spring Security 프레임워크로 OAuth2 로그인 (0) | 2024.04.05 |
---|---|
Spring Security가 뭐죠? (0) | 2024.03.24 |
[Spring JPA] IncorrectResultSizeDataAccessException (0) | 2023.12.05 |
[Spring Boot] API Docs를 자동으로 만들어보자! (1) | 2023.11.25 |
[SpringBoot] SpringBoot에 MongoDB 연결 (0) | 2023.09.12 |