Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
JoonSoo-Kim authored Dec 14, 2023
1 parent 4820a45 commit 8ab0246
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,67 @@ Ncloud의 CLOVA Sentiment를 활용하여 작성된 일기의 감정을 분석
|개인 데이터 접근 제어| • JWT 인증을 통해 로그인용 액세스/리프레시 토큰을 발급하고 저장 <br> • `JwtAuthGuard`를 사용하여 부적절한 로그인 및 중복 로그인 방지<br> • `PrivateDiaryGuard`를 사용하여 타인의 일기 접근 제어|
|명확한 테스트 코드| • 테스트 코드 규칙 정의<br> • 내부 및 외부 의존성에 대한 테스트 코드 작성<br> • `typeorm-transactional-tests` 라이브러리를 활용하여 트랜잭션 적용|

## BE의 기술적 도전 과제

### Stateful한 JWT 기반 인증 방식 도입

![리드미1](https://github.com/boostcampwm2023/web08-ByeolSoop/assets/49023630/cd697065-43f6-4e4c-994b-7f7aa2e0a426)

<a href="https://byeolsoop.notion.site/3048b611bbc4442b8b1fb6ec1abed392?pvs=4">개발일지</a>

- 개인 일기 서비스에서 가장 중요한 요소는 일기 데이터가 타인에게 노출되지 않는 것이라고 판단했습니다.
- Stateless한 JWT 기반 인증 방식을 도입했으나, 이 방식은 액세스 토큰의 탈취가 쉽고, 서버에서 이를 방지할 수 있는 방법이 없어 보안 이슈가 발생하였습니다.
- Stateless 방식은 서버에서 클라이언트의 상태를 저장하지 않기 때문에, 탈취된 액세스 토큰을 통한 부적절한 접근을 막기 어렵다는 문제점이 있습니다.
- 이를 해결하기 위해 인증 방식을 Stateful하도록 변경했습니다.
- Stateful JWT는 토큰의 유효성을 서버에서 검증하면서 사용자 상태를 기억하고 관리하는 방식입니다. 따라서 부적절한 접근 시 서버는 사용자의 상태를 기반으로 요청을 차단할 수 있습니다.

<br>

### 커스텀 Guard를 통한 개인 데이터 접근 제어

<a href="https://byeolsoop.notion.site/Guard-4daa2c3e56d34b5e9009fb992bd61c60?pvs=4">개발일지</a>

- Stateful한 JWT 기반 인증 방식을 구현한 후, 이를 활용하여 중복 로그인 등의 여러 보안 이슈를 해결해야 했습니다.
- JwtAuthGuard를 구현하여 액세스 토큰을 발급 받은 사용자가 현재 사용자가 맞는지 리프레시 토큰을 활용하여 비교하고 접근을 제어하도록 했습니다.

![리드미2](https://github.com/boostcampwm2023/web08-ByeolSoop/assets/49023630/8fd16bce-3525-4522-a8e0-f7c41b8af880)

- 부적절한 액세스 토큰으로 접근한 경우 리프레시 토큰의 Payload에 저장된 액세스 토큰과 비교하여 접근을 제어할 수 있습니다.
- 중복 로그인의 경우 리프레시 토큰의 Payload에 저장된 클라이언트 IP를 비교하여 접근을 제어할 수 있습니다.
- PrivateDiaryGuard를 구현하여 요청한 일기 데이터가 현재 사용자의 일기가 맞는지 검증하고 접근을 제어하도록 했습니다.

![리드미3](https://github.com/boostcampwm2023/web08-ByeolSoop/assets/49023630/71feb961-0873-49c6-9326-946274e42726)

- 정상적인 액세스 토큰을 갖고 타인의 일기를 부적절하게 요청하는 경우 접근을 통제할 수 있습니다.

<br>

### 테스트 코드 작성을 위한 개념과 규칙 정의

![image](https://github.com/boostcampwm2023/web08-ByeolSoop/assets/49023630/ae8e8891-3a9a-4521-b879-975e3a7c4347)

<a href="https://byeolsoop.notion.site/e9ce009cef9b40378011df2afe70101d?pvs=4">개발일지</a>

- 테스트 코드를 작성하기 시작할 때, 각 테스트의 종류에 대한 개념을 제대로 이해하지 못해 개발 중 혼동이 발생했습니다.
- 테스트와 관련된 명확한 개념과 규칙을 정의한 후 테스트 코드를 작성했습니다.
- 특히나 통합 테스트의 경우 각 코드의 의존성을 내부 의존성과 외부 의존성으로 구분하고, 이에 따라 테스트 방식을 다르게 구현했습니다.
- 개념을 명확히 하여 팀원 간의 소통 시 혼동이 발생하지 않았고, 각 테스트가 갖는 책임을 명확히 하여 더 간결하고 확실하게 코드를 검증할 수 있었습니다.

<br>

### 트랜잭션 도입을 통한 테스트 리소스 사용량 감소
| ![리드미5](https://github.com/boostcampwm2023/web08-ByeolSoop/assets/49023630/5b951334-1e32-4a90-90e2-4816667dba67) | ![리드미6](https://github.com/boostcampwm2023/web08-ByeolSoop/assets/49023630/9c9c6748-6d6e-458f-989e-b9c71f4c9c38) |
|---|---|
|도입 이전|도입 이후|

<a href="https://byeolsoop.notion.site/Transaction-83289ba51d524c4281cfae5303fd0113?pvs=4">개발일지</a>

- 테스트 데이터베이스 환경을 독립적으로 유지하기 위해, 매 테스트마다 데이터베이스를 초기화해야 했습니다. 이로 인해 테스트에 소요되는 리소스와 시간이 크게 늘어나는 문제가 발생했습니다.
- TypeORM Transactional Test를 통해 문제를 해결할 수 있었습니다.
- 테스트가 시작하면 모든 쿼리문이 트랜잭션으로 들어갑니다.
- 트랜잭션을 통해 기능의 검증을 실시합니다.
- 테스트가 종료되면 트랜잭션이 롤백되고 커넥션을 풀에 반환합니다.
- 데이터베이스 초기화에 대한 부담이 없어지고 커넥션 객체가 풀에 바로 반납 및 재사용되어 테스트에 필요한 시간을 50% 이상 줄이고, 리소스 사용량을 크게 감소시킬 수 있었습니다.

<br>

Expand Down

0 comments on commit 8ab0246

Please sign in to comment.