[Spring Boot Security] OAuth2와 JWT에 대해서 알아보자

KUKJIN LEE's profile picture

KUKJIN LEE1개월 전 작성

OAuth2와 JWT(JSON Web Token)은 웹 애플리케이션 인증과 인가를 처리하는 데 많이 사용되는 기술입니다.

 

인증과 권한 부여를 효율적으로 처리하는 데 중요한 역할을 합니다. Spring Boot SecurityOAuth2로그인을 간단히 설정할 수 있게 하고, 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 OAuth2JWT 결합하면 소셜 로그인을 통해 인증받은 사용자에게도 JWT를 발급하여 RESTful API에서 인증 수단으로 사용할 수 있습니다. Spring Security OAuth2 클라이언트를 사용해 인증된 사용자를 위한 JWT를 생성하고, 이후 요청에 사용할 수 있도록 구성합니다.

New Tech Posts