Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions week10/keyword/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
## 1. Spring Security

개념: 로그인, 회원가입, 로그아웃 등 애플리케이션의 보안 기능을 쉽게 구현하도록 돕는 강력한 프레임워크다.

작동 방식: Filter Chain을 사용하여 들어오는 HTTP 요청을 필터링하고 인증 및 인가 로직을 처리한다.

설정: `@EnableWebSecurity` 어노테이션을 사용하여 보안 설정을 활성화하며, 우리가 작성한 정책이 기본 설정보다 우선 적용된다.


## 2. 인증(Authentication)과 인가(Authorization)

인증: "사용자가 누구인지"를 확인하는 과정이다. 실습에서는 사용자가 제출한 이메일과 비밀번호를 검증하는 과정에 해당한다.

인가: "특정 리소스에 접근할 권한이 있는지"를 확인하는 과정이다.

예: USER는 Swagger에 접근하지 못하고 ADMIN만 접근할 수 있게 제한하는 것이 인가다.

## 3. 세션과 토큰

세션: 서버 측에 사용자 정보를 저장하고 식별하는 방식이지만, 이번 실습에서는 이를 배제한 토큰 방식을 주로 다룬다.

토큰: 클라이언트 측에 인증 정보를 저장하는 방식이며, 실습에서는 JWT를 활용한다.

전달 방식: 토큰 기반 인증은 클라이언트가 요청을 보낼 때 Authorization 헤더에 실어서 전달하는 것이 특징이다.

## 4. 액세스 토큰(Access Token)과 리프레시 토큰(Refresh Token)

액세스 토큰: 리소스 접근에 실제로 사용되는 토큰이다. 실습에서는 4시간 정도의 유효 기간을 설정하여 사용했다.

리프레시 토큰(Refresh Token): 액세스 토큰 만료 시 새로운 토큰을 발급받기 위해 사용한다.

이번 실습은 흐름의 이해를 위해 엑세스 토큰 방식 위주로 구현했다.
46 changes: 46 additions & 0 deletions week10/mission/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
## 1. Spring Security 기본 설정
### 1.1 의존성 추가

build.gradle 파일에 보안 및 테스트를 위한 의존성을 추가합니다.

### 1.2 SecurityConfig 클래스 구현
보안 정책을 정의하기 위해 `@EnableWebSecurity` 어노테이션을 사용한 설정 클래스를 생성합니다.
- Filter Chain 설정: HTTP 요청에 대한 접근 권한을 정의합니다.
- PermitAll: Swagger UI, API 문서 등 공통적으로 허용할 URI를 allowUris 배열로 관리하여 가독성을 높였습니다.
- Role 기반 접근 제어: /admin/ 경로는 ADMIN 역할을 가진 사용자만 접근 가능하도록 제한합니다.

## 2. 회원가입 및 비밀번호 보안
### 2.1 BCrypt를 활용한 비밀번호 암호화
보안 강화를 위해 평문 비밀번호를 그대로 저장하지 않고, BCryptPasswordEncoder를 사용하여 단방향 해싱 및 솔팅처리를 수행합니다.

### 2.2 엔티티 및 DTO 확장
Member 엔티티에 email, password, role 필드를 추가합니다.

사용자 역할은 Role Enum(ROLE_ADMIN, ROLE_USER)으로 정의합니다.

## 3. JWT 기반 인증 구현 (실습 2)
### 3.1 JWT 설정 및 유틸리티 제작

application.yml에 시크릿 키와 만료 시간(4시간)을 설정하고, JwtUtil 클래스를 통해 토큰 생성, 검증, 정보 추출 로직을 구현합니다.

### 3.2 커스텀 필터 (JwtAuthFilter)

OncePerRequestFilter를 상속받아 모든 요청마다 JWT를 검사하는 필터를 구현합니다.

- 헤더에서 토큰을 추출하고 Bearer 접두사를 확인합니다.
- 토큰 유효성 검증 후, CustomUserDetailsService를 통해 사용자 정보를 조회합니다.
- 인증이 완료되면 SecurityContextHolder에 인증 객체를 저장합니다.

## 4. 예외 처리 통일
Spring Security 기본 에러 응답(403 Forbidden 등)을 프로젝트의 공통 응답 형식(ApiResponse)으로 통일하기 위해 AuthenticationEntryPoint를 커스텀 구현하였습니다.

- 인증 실패 시 GeneralErrorCode.UNAUTHORIZED를 반환하도록 설정하여 클라이언트가 일관된 에러 메시지를 받을 수 있게 조치했습니다.


## 5. 결과

DB에 암호화된 비밀번호와 ROLE_USER 권한이 정상 저장됨을 확인했습니다.

USER 권한 사용자가 관리자 페이지 접근 시 403 에러가 발생하며, ADMIN으로 변경 후 접근 시 정상 동작함을 확인했습니다.

로그인 시 발급된 accessToken을 Swagger의 Authorize 헤더에 담아 보낼 경우, 인증이 필요한 API 호출이 성공함을 확인했습니다.