스프링 시큐리티와 JWT 토큰이 무엇인지에 대한 배경지식은 아래 게시글에 작성해두었다.
https://dev-uu.tistory.com/93
[Security]Spring Security와 JWT
1. 스프링 시큐리티란? 스프링 시큐리티는 사용자의 인증, 인가와 관련해 스프링 프레임 워크에서 제공하는 하위 프로젝트를 의미한다.앞선 정의에서 인증과 인가란 아래와 같이 정의할 수 있
dev-uu.tistory.com
1. 프로젝트 환경
- 테스트를 위한 기본적인 프로젝트 환경은 아래와 같이 진행하였다.
1) SpringBoot 3.4.0
2) SpringSecurity 6.0.0 이상 버전
3) JDK 21
2. 프로젝트 생성
스프링 부트 프로젝트 생성 사이트(https://start.spring.io/)에 접속해 아래와 같은 라이브러리들을 추가해 프로젝트를 생성해준다.

3. SecurityConfiguratoin 파일 생성
: SecurityConfiguration 설정을 위한 파일들을 생성해준다.

: 설정에 대한 설명은 아래와 같다.
1) sessionManagement.sessionCreationPolicy
: 스프링 시큐리티를 이용한 인증을 진행할 경우 인증에 필요한 정보가 세션을 기반으로 저장되게 된다. 이를 JWT 토큰 기반의 인증으로 변화할 수 있도록 세션 이용 정책을 변경한다.
: 세션 인증 정책의 종류는 아래와 같이 존재한다.
| ALWAYS | 세션을 항상 생성하고, 이미 존재하는 세션이 있으면 그대로 사용 (기본 세션 정책) |
| IF_REQUIRED | 요청에 세션이 필요한 경우에만 세션을 생성 (세션이 필요 없으면 세션을 생성하지 않음) |
| NEVER | 요청 시 세션을 절대 생성하지 않으며, 세션이 이미 존재하면 예외를 발생시킴 |
| STATELESS | 세션을 사용하지 않으며, 상태 없는 인증 방식을 구현할 때 사용 |
2) httpSecurityHeadersConfigurer.frameOptions
: 시큐리티는 기본적으로 CSRF에 의한 스크립팅 공격을 방지하기 위해 X-Frame-Options을 DENY로 설정한다.
이로 인해 추가적인 설정이 없이 <iframe>,<frame>으로 된 페이지를 로드해 렌더링 할 경우 해당 페이지의 렌더링이 제대로 되지 않는다.
현재 프로젝트에서는 H2 브라우저 콘솔을 사용할 것이기 때문에 해당 옵션의 변경없이 접속할 경우 페이지의 일부 요소가 <iframe> 형태로 되어있어 페이지가 정상적으로 보이지 않는다.
따라서 위와 같이 SameOrigin에서 해당 요소들을 사용할 수 있게 설정 변경해 H2 브라우저 콘솔을 정상적으로 이용할 수 있도록 한다.
3) authorizeRequests.requestMatchers
: 시큐리티에서 인증이 필요한 url과 인증없이 요청을 받을 url을 설정해준다.
4. User Entity, UserDetailsService, UserReposiroty 생성
: 회원정보를 받아 저장할 UserDetailts 클래스를 구현한 User Entity와 데이터베이스에 접근할 수 있도록 해주는 UserDetailsService, UserRepository 계층을 구현해준다.




5. Jwt 토큰 라이브러리 추가
: Jwt 토큰 기반의 인증을 사용하기 위한 라이브러리를 추가해준다.

6. JwtTokenProvider 클래스 생성
: 토큰 발급 및 인증에 이용할 JwtTokenProvider 클래스를 생성해준다.

** java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter 에러 발생 시 해결방안은 아래 링크를 참고해서 해결가능하다.
https://dev-uu.tistory.com/94
[에러] java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
상황: JWT 토큰을 생성하기 위해 Jwts.builder 객체에 헤더, 페이로드 값 그리고 서명에 사용할 비밀 키를 적용하는 상황에서 해당 에러가 발생하였다. JDK 11 이후로 JAXB (Java Architecture for XML Binding)와
dev-uu.tistory.com
7. JwtAuthenticationFilter 생성 및 SecurityConfiguration 파일 수정
: 발급된 토큰 정보의 유효성을 검사하고 이를 이용해 인증정보 저장 후 스프링 시큐리티의 필터체인으로 해당 정보를 넘겨 인증을 실행시켜 주는 커스텀 필터 클래스를 생성해준다.
** Bearer를 통해 토큰 인증 요청 시 토큰 값 앞에 Bearer 문자열이 추가되어 넘어오므로 해당 문자열을 제거해주도록 한다.

: SecurityConfiguration 파일에서 addBeforeFilter 메소드를 이용해 커스텀 필터가 시큐리티 필터체인보다 앞서 실행되도록 설정파일을 수정해준다.

8. SwaggerConfig 파일 생성 및 application.yml 파일 수정
: Swagger 사용을 위한 SwaggerConfig 파일을 생성하고, application.yml에 해당 설정을 기입해준다.
(스웨거 이용방법에 관한 기본적인 설정 방법은 아래 링크 참고)
https://dev-uu.tistory.com/78
swagger 추가 및 사용예시
Swagger란?API 문서화와 테스트를 위한 프레임워크 - Swagger API 문서 생성 라이브러리 종류1. springFox - 2020년 7월 이후로 업데이트 안되고 있음.2. springDocs 의존성 추가( gradle 기준)- springFoximplementatio
dev-uu.tistory.com
: 스웨거에 JWT 토큰을 이용한 api 요청의 처리를 위해 SwaggerConfig 파일과 인증용 api에 다음의 설정을 추가해준다.
- SwaggerConfig 파일

: 각 설정에 대한 설명은 아래와 같다.
.addSecurityItem(new SecurityRequirement().addList("JWT"))
: Swagger OpenAPI 문서에 보안 요구 사항을 추가하는 부분,
JWT 인증을 적용하려는 API에 대해 JWT 토큰을 요구한다고 명시하는 부분
new Components()
.addSecuritySchemes("JWT", new SecurityScheme() : 보안 스키마(인증 방식을 정의)를 설정하고 추가
.type(SecurityScheme.Type.HTTP) : 인증 방식이 HTTP 기반임을 지정
.scheme("bearer") : 인증 방식이 'bearer' 기반임을 명시
.bearerFormat("JWT") : 인증 방식에서 사용되는 토큰의 형식을 'JWT'로 지정
.in(SecurityScheme.In.HEADER) : 인증 정보가 HTTP 헤더에 포함된다는 것을 지정
.name("Authorization") : 토큰이 포함될 헤더의 이름을 지정
));
- api 설정
: @SecurityRequirement 설정 추가

: 설정이 성공적으로 완료되면 api 문서에 아래와 같이 Authorize 버튼인 생성된다.

9. TestRestController
: api 테스트를 위한 api 요청을 받을 TestRestContoller를 생성하고 아래와 같이 내용을 작성해준다.

10. 테스트를 통해 결과 확인
: 설정해 둔 Swagger 테스트 페이지에 접속해 회원가입 및 로그인 요청에 대한 결과를 확인한다.
- Swagger UI 페이지

- RequestBody에 계정정보를 담아 회원가입 요청을 보낸다.

- RestContorller와 성공적으로 통신 후 DB에 값이 저장된 걸 확인할 수 있다.


- RequestBody에 계정정보를 담아 로그인 요청을 보낸다.

- RestContorller와 성공적으로 통신 후 DB에 저장된 User 정보를 바탕으로 JWT 토큰을 생성해 반환해준다.

- 생성된 토큰을 이용해 인증 처리를 진행해준다.


- 인증이 완료된 상태에서 api 요청 시 설정한 응답을 확인할 수 있다.

** application.yml 설정파일에 들어갈 내용은 아래와 같다.

- 참고한 사이트
https://webfirewood.tistory.com/115
SPRING SECURITY + JWT 회원가입, 로그인 기능 구현
이전에 서블릿 보안과 관련된 포스트(링크)를 작성했던 적이 있습니다. 서블릿 기반의 웹 애플리케이션에서 인증과 인가 과정을 간단하게 설명했습니다. 스프링에서는 마찬가지로 이런 인증과
webfirewood.tistory.com
Basic 인증과 Bearer 인증의 모든 것
토스페이먼츠-HTTP 인증 HTTP 인증(Authorization)은 웹 서버의 비밀번호 같은 역할을 해줘요. 비밀번호로 이메일 계정의 권한을 확인하는 것 처럼, HTTP 인증으로 서버에 접근하는 클라이언트의 권한을
velog.io
- 참고서적
장정우.스프링 부트 핵심 가이드.위키북스.2022
'Spring' 카테고리의 다른 글
| [Security]Spring Security와 JWT (2) | 2024.12.09 |
|---|---|
| [메타코딩] 13강. 스프링 부트의 동작원리? (0) | 2023.10.02 |
| [메타코딩] 12강. 스프링 부트의 동작원리? (0) | 2023.10.02 |
| [메타코딩] 11강. 스프링 부트의 동작원리? (0) | 2023.09.25 |
| [메타코딩] 10강. 스프링 부트의 동작원리? (1) | 2023.09.24 |