TOP
본문 바로가기
[Java]/Spring Boot

[Java] Spring Boot: 스프링 시큐리티, OAuth2, JWT

by 기록자_Recordian 2025. 4. 21.
728x90
반응형
이전 내용
 

[Java] Spring Boot: 네이버 로그인 구현하기

이전 내용 [Java] Spring Boot: 카카오 로그인 기능 추가하기이전 내용 [Java] Spring Boot: 구글 로그인 기능 추가하기이전 내용 전반적인 순서1. Gradle 또는 Maven 의존성 추가2. 구글 API Console 설정 - 구글 개

puppy-foot-it.tistory.com


Spring Security(스프링 시큐리티)

 

스프링 시큐리티는 스프링 프레임워크에서 제공하는 강력한 보안 기능을 위한 프레임워크다. 이를 통해 인증(Authentication)과 인가(Authorization)를 처리할 수 있으며, 웹 개발 과정에서 필수적인 사용자 관리 기능을 구현하는 데 도움을 준다.

 

일반적으로 개발 시 가장 먼저 작업하는 부분이 사용자 관리 부분으로 가볍게는 회원가입부터 로그인, 로그아웃, 세션 관리, 권한 관리까지 온라인 플랫폼에 맞춰 다양하게 작업되는 인가 & 보안 기능은 개발자에게 많은 시간을 요구하는데, Spring 생태계 내에서 이러한 요구사항을 효과적으로 지원하기 위해 개발된 것이 Spring Security로 개발자들이 보안 관련 기능을 효율적이고 신속하게 구현할 수 있도록 도와준다.

 

[주요 기능]

  • 인증: 사용자 이름과 비밀번호를 확인하여 사용자의 신원 검증.
  • 인가: 사용자가 특정 리소스에 액세스할 수 있는지 결정.
  • CSRF 보호: 교차 사이트 요청 위조(Cross-Site Request Forgery) 공격 방어.
  • 세션 관리: 사용자 세션을 효율적으로 관리.
  • 다양한 인증 방식 지원: 기본 인증, 폼 기반 인증, LDAP, OAuth2 등 다양한 인증 메커니즘 지원.

 

◆ 스프링 시큐리티 아키텍처

출처: https://www.elancer.co.kr/blog/detail/235

 

Spring은 자바의 프레임워크답게 개발 구조가 잘 설계되어 있기  때문에 Spring 생태계에서 제공하는 라이브러리라면 기존의 코드를 변경하지 않고도 그림과 같이 중간에 삽입하여 사용할 수 있다. 

[대략적인 동작 순서]
사용자의 요청이 서버로 들어옴 → Authotication Filter가 요청을 가로채고 Authotication Manger로 요청을 위임
→ Authotication Manager는 등록된 Authotication Provider를 조회하며 인증 요구 → Authotication Provider가 실제 데이터를 조회하여 UserDetails 결과를 돌려줌 → 결과는 SecurityContextHolder에 저장이 되어 저장된 유저정보를 Spring Controller에서 사용할 수 있게 됨

 

◆ 스프링 시큐리티 설치하기

스프링 시큐리티를 사용하기 위해 build.gradle 파일의 dependencies에 아래의 코드를 추가한다.

implementation 'org.springframework.boot:spring-boot-starter-security'

 

스프링 시큐리티를 설치하고 로컬 서버를 재시작하고 localhost:로컬번호/login에 접속하면 로그인화면이 나타나게 된다.

Spring Security에서 웹사이트 보안에 가장 기본적인 기능인 아이디/패스워드 인증을 화면까지 지원하며, 이것은 Spring Security인증의 가장 기본적인 방법이다.

스프링 시큐리티는 기본적으로 인증되지 않은 사용자가 웹 서비스를 사용할 수 없게끔 만든다. 따라서 이와 같이 인증을 위한 로그인 화면이 나타나는 것이다.


인증 및 인가

 

- 인증: 사용자가 시스템에 로그인할 때 신원 확인.
- 인가: 사용자가 시스템에 로그인한 후 각 사용자가 수행할 수 있는 작업이나 접근할 수 있는 자원에 대해 권한 검토.

 

1. 인증 (Authentication)
사용자의 신원을 확인하는 과정.

사용자가 주장하는 신원이 실제로 그 사용자가 맞는지를 검증한다. 일반적으로 사용자 이름과 비밀번호를 사용하여 수행되지만, 다양한 방식으로 구현될 수 있다.

[인증의 유형]

  • 기본 인증: 사용자 이름과 비밀번호를 제공하여 인증하는 전통적인 방법.
  • 2단계 인증: 기본 인증 뒤에 추가적인 인증 단계(예: 문자 메시지를 통한 인증코드 입력)를 추가하여 보안을 강화.
  • 소셜 로그인: Google, Facebook, Twitter 등의 소셜 미디어 계정을 사용하여 인증하는 방법. 사용자는 별도의 계정을 만들 필요 없이 소셜 미디어 계정을 통해 쉽게 로그인할 수 있다.
  • 생체 인식 인증: 지문, 얼굴 인식, 홍채 인식 등의 생체 정보를 사용하여 인증.

[작동 과정]

  • 사용자는 로그인 폼을 통해 사용자 이름과 비밀번호 등의 인증 정보를 입력.
  • 서버는 입력된 정보가 데이터베이스에 저장된 정보와 일치하는지 확인.
  • 사용자가 올바른 정보를 제공하면 인증이 성공하고, 시스템은 사용자에게 접근 권한 부여.

2. 인가 (Authorization)
인증된 사용자가 특정 자원이나 기능에 접근할 수 있는지를 결정하는 과정, 사용자가 어떤 권한을 가지는지를 식별.

[인가의 유형]

  • 역할 기반 인가 (Role-Based Access Control, RBAC): 사용자의 역할에 따라 접근 권한 설정. 예를 들어, 관리자는 모든 기능에 접근할 수 있지만, 일반 사용자는 특정 기능에만 접근할 수 있다.
  • 속성 기반 인가 (Attribute-Based Access Control, ABAC): 사용자의 속성에 따라 접근 결정. 예를 들어, 사용자의 직책, 나이, 위치 등을 기반으로 접근 권한 부여.
  • 정책 기반 인가: 특정 정책 규칙을 기반으로 접근을 제어하는 방식.

[작동 과정]

  • 사용자가 인증을 성공적으로 완료.
  • 애플리케이션은 사용자의 역할 또는 권한을 검사.
  • 요청된 자원이나 기능에 대한 접근 권한이 확인되어, 필요한 경우 접근이 허용되거나 거부.

OAuth2

 

OAuth2는 Authorization(인가)의 프레임워크로, 사용자가 자신의 데이터를 제어하고 타사 애플리케이션에 액세스를 허용할 수 있게 한다. 이 프로토콜에서는 third-party 애플리케이션이 사용자의 리소스에 접근하기 위한 절차를 정의하고 서비스 제공자의 API를 사용할 수 있는 권한을 부여 한다. 대표적으로 네이버 로그인, 카카오 로그인, 구글 로그인과 같은 소셜 미디어, 클라우드 서비스 등에서 널리 사용된다.

 

[주요 구성 요소]

  • 리소스 소유자(Resource Owner): 데이터를 소유한 사용자.
  • 클라이언트(Client): 리소스 소유자의 데이터를 요청하는 애플리케이션.
  • 권한 부여 서버(Authorization Server): 사용자 인증 및 액세스 토큰을 발급하는 서버.
  • 리소스 서버(Resource Server): 보호된 자원(데이터)을 제공하는 서버.

[작동 방식]

  • 클라이언트가 권한 부여 서버에 인증 요청 보냄.
  • 리소스 소유자가 클라이언트의 요청 승인.
  • 권한 부여 서버는 클라이언트에게 액세스 토큰 발급.
  • 클라이언트는 액세스 토큰을 사용하여 리소스 서버에 데이터 요청.
  • 리소스 서버는 액세스 토큰을 검사하고, 유효하면 데이터 반환.

[OAuth 2.0 용어]

  • 액세스 토큰(Access Token): 클라이언트가 리소스 서버의 리소스에 접근하기 위한 권한을 부여받는 토큰. 액세스 토큰은 권한 서버로부터 발급되며, 일반적으로 제한된 유효 기간을 가지고 있다.
  • 리프레시 토큰(Refresh Token): 리프레시 토큰은 액세스 토큰의 유효 기간이 만료된 후 새로운 액세스 토큰을 받기 위한 토큰. 이를 통해 사용자는 다시 로그인할 필요 없이 토큰 유효 시간 갱신만으로 계속 애플리케이션을 사용할 수 있다.
  • 범위(Scope): 범위는 클라이언트가 리소스에 대한 어떤 작업을 수행할 수 있는지를 정의하는 문자. 범위는 권한 서버에 의해 정의되며, 클라이언트는 특정 범위의 액세스 권한을 요청할 수 있다.
  • 인증 코드(Authorization Code): 인증 코드는 클라이언트가 액세스 토큰을 얻기 위한 중간 단계로 사용되는 코드. 인증 코드 부여(Authorization Code Grant) 방식을 통해 권한 서버로부터 발급되며, 이를 사용하여 액세스 토큰과 리프레시 토큰을 얻을 수 있다.

[OAuth 2.0 권한 부여 과정]

출처: https://guide.ncloud-docs.com/docs/b2bpls-oauth2

 


JWT(Json Web Token)

 

JWT는 두 개의 엔티티 간에 정보를 안전하게 전송하기 위해 JSON 형식으로 인코딩된 문자열이다. 일반적으로 인증된 사용자에 대한 정보를 저장하는 데 사용된다. 서버는 사용자가 로그인을 완료하면 JWT를 생성하고 이를 클라이언트에 반환한다. 클라이언트는 이후의 요청에서 이 JWT를 사용하여 인증을 수행한다.

 

[구조]

  • 헤더(Header): 토큰의 메타데이터 ▶ JWT의 유형과 사용할 서명 알고리즘 지정
  • 페이로드(Payload): 사용자의 정보 및 권한 등의 주제 관련 정보. 전달할 정보가 포함된 부분. 이 정보는 클레임(claims)이라고 하며, 등록된(claims), 공개(public claims), 비공식(private claims) 클레임으로 나눌 수 있다.
  • 서명(Signature): 헤더와 페이로드를 기반으로 하여 비밀 키로 생성된 서명. 데이터의 변조 여부를 검증하는 데 사용.

-헤더-

{
  "alg": "HS256",
  "typ": "JWT"
}

 

-페이로드-

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "iat": 1516239022
}
  • iss(Issuer): 토큰 발급자
  • sub(Subject): 토큰 제목 - 토큰에서 사용자에 대한 식별 값
  • aud(Audience): 토큰 대상자
  • exp(Expiration Time): 토큰 만료 시간
  • nbf(Not Before): 토큰 활성 날짜 (이전의 토큰은 활성화되지 않음 보장)
  • iat(Issued At): 토큰 발급 시간
  • jti(JWT id): JWT 토큰 식별자(Issuer 가 여러 명일 때 이를 구분하기 위한 값)

-서명-

a-string-secret-at-least-256-bits-long

 

[작동 방식]

  • 사용자 인증: 사용자가 로그인하면 서버는 사용자 인증 정보 확인.
  • JWT 생성: 인증이 성공하면 서버는 JWT를 생성하여 클라이언트에 반환.
  • 클라이언트 저장: 클라이언트는 JWT를 로컬 스토리지 또는 쿠키에 저장.
  • 토큰 전송: 이후의 요청에서 클라이언트는 JWT를 Authorization 헤더에 포함시켜 서버에 요청을 보냄.
  • 서버에서 JWT 검증: 서버는 수신한 JWT를 디코드하고 서명을 확인하여 유효성 검사. 유효한 경우 요청을 처리하고, 그렇지 않은 경우 인증 오류 반환.

[JWT의 장점]

  • 자체 포함성: JWT는 사용자에 대한 정보를 포함하고 있기 때문에, 추가적인 데이터베이스 조회 없이도 인증할 수 있다.
  • 확장성: 세션을 서버 측에 저장하지 않기 때문에, 많은 수의 클라이언트와 서버를 분산 처리하는 데 유리.
  • 성능: 웹 서버가 JWT를 인증할 때 데이터베이스에 쿼리할 필요가 없어 성능 향상.
  • 다양한 플랫폼에서 사용 가능: JWT는 JSON 기반이기 때문에 다양한 프로그래밍 언어와 플랫폼에서 쉽게 사용할 수 있다.

[보안 고려 사항]

  • 비밀 키 관리: JWT의 서명에 사용되는 비밀 키는 안전하게 관리해야 한다.
  • 토큰 만료: JWT는 만료 시간을 설정할 수 있으며, 만료된 토큰은 거부해야 한다.
  • HTTPS 사용: JWT가 네트워크를 통해 전송될 때 도청을 방지하기 위해 HTTPS를 사용하는 것이 중요

◆ jwt.io: JWT(Json Web Token) 토큰의 구조를 확인할 수 있는 사이트. 

 

JSON Web Tokens - jwt.io

JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature (JWS).

jwt.io

 

 


[참고]

점프 투 스프링 부트

https://www.elancer.co.kr/blog/detail/235

https://guide.ncloud-docs.com/docs/b2bpls-oauth2

https://brunch.co.kr/@jinyoungchoi95/1

https://playlist808.tistory.com/62


다음 내용

 

[Java] Spring Boot: 블로그 앱 만들기

이전 내용 [Java] Spring Boot: 스프링 시큐리티, OAuth2, JWT이전 내용 [Java] Spring Boot: 네이버 로그인 구현하기이전 내용 [Java] Spring Boot: 카카오 로그인 기능 추가하기이전 내용 [Java] Spring Boot: 구글 로그

puppy-foot-it.tistory.com

 

 

 

 

728x90
반응형