KUKJIN LEE
posted 16 hours ago
[Spring Boot Security] OAuth2와 JWT에 대해서 알아보자
OAuth2와 JWT(JSON Web Token)은 웹 애플리케이션 인증과 인가를 처리하는 데 많이 사용되는 기술입니다.
인증과 권한 부여를 효율적으로 처리하는 데 중요한 역할을 합니다. Spring Boot Security
는 OAuth2
로그인을 간단히 설정할 수 있게 하고, JWT
를 이용해 RESTful 서비스에서 인증을 유지할 수 있는 강력한 기능을 제공합니다.
1. OAuth2 설정 및 활용
1.1 OAuth2
란? 사용자 인증과 권한 부여를 위한 표준 프로토콜입니다. 이를 통해 사용자는 자격증명을 공유하지 않고도 제3자 애플리케이션이 자신의 리소스에 접근할 수 있도록 허용할 수 있습니다.
1.2 Spring Security
에서 OAuth2
로그인을 설정하려면 application.yml
또는 application.properties
파일에 클라이언트 등록 정보를 추가하고, Security설정에서 OAuth2를 활성화합니다. 예시(Github OAuth2)
spring:
security:
oauth2:
client:
registration:
github:
client-id: your-client-id
client-secret: your-client-secret
scope: read:user
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
client-name: GitHub
이후 보안 설정 클래스에서 OAuth2 로그인을 활성화해주면 됩니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login(); // OAuth2 로그인 활성화
}
2. JWT (JSON Web Token)
2.1 JSON 기반의 액세스 토큰으로, 사용자 인증 및 권한 부여 정보를 인코딩하여 안전하게 전달하는 데 사용됩니다. JWT
는 서명되어 있어 정보의 무결성을 보장하며, RESTful 서비스에서 많이 사용됩니다.
2.2 JWT 구조
-
Header: 토큰의 타입과 서명 알고리즘 정보를 포함합니다.
-
Payload: 사용자 정보와 클레임을 포함합니다.
-
Signature: Header와 Payload를 결합하여 비밀 키로 서명한 값입니다.
2.3 JWT
를 사용해 인증을 처리하려면, JWT 필터를 생성하고 보안 필터 체인에 등록해야 합니다.
-
사용자가 로그인하면 서버는 사용자 정보를 검증하고
JWT
토큰을 생성합니다. -
클라이언트는 이후 요청 시
JWT
토큰을 HTTP 헤더에 포함하여 서버에 전송합니다. -
서버는 해당 토큰을 검증하여 사용자의 인증 정보를 확인합니다.
2.4 io.jsonwebtoken
라이브러리를 사용한 간단 예시
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtUtil {
private String secretKey = "mySecretKey";
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60)) // 1시간 유효
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
}
JWT
검증을 위해 필터를 생성하고 보안 설정에 등록합니다.
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String authorizationHeader = request.getHeader("Authorization");
if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
String token = authorizationHeader.substring(7);
// 토큰 검증 로직 추가
}
filterChain.doFilter(request, response);
}
}
3. OAuth2와 JWT 결합하기
3.1 OAuth2
와 JWT
결합하면 소셜 로그인을 통해 인증받은 사용자에게도 JWT
를 발급하여 RESTful API에서 인증 수단으로 사용할 수 있습니다. Spring Security OAuth2
클라이언트를 사용해 인증된 사용자를 위한 JWT
를 생성하고, 이후 요청에 사용할 수 있도록 구성합니다.