Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

20250202/redis-token-storage 오승민 기술블로그 제출 #118

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

HiSeungmin
Copy link

"Refresh Token을 Redis에 저장하는 이유"에 대한 기술 블로그를 작성했습니다.

@HiSeungmin HiSeungmin self-assigned this Feb 2, 2025
@HiSeungmin HiSeungmin changed the title 20250131/redis-token-storage 오승민 기술블로그 제출 20250202/redis-token-storage 오승민 기술블로그 제출 Feb 2, 2025
Copy link

@gongdongho12 gongdongho12 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

주제가 DBMS의 사용법인지 Refresh Token인지 정확하지 않은 것 같습니다
JWT의 리프레시 토큰의 사용 이유와 인메모리 DBMS 도입에 대한 부분이 핵심인데 그중에 Redis를 사용한 예시 정도로 정리해보면 깔끔하게 전달될 수 있을거에요

전체적으로 RDB라고 적혀 있는데 정확하게는 Disk based DBMS로 표현하는게 옳습니다
이미 사용해보셨겠지만 인메모리 DBMS 중 RDB 방식인 H2도 있으니까요

내용 정리하느라 고생 많으셨습니다

| **저장 방식** | 메모리(In-memory) 기반 | 디스크(Disk) 기반 |
| **읽기/쓰기 속도** | 밀리초(ms) 단위의 초고속 처리 | 디스크 I/O로 인해 상대적으로 느림 |
| **데이터 만료** | TTL로 자동 만료 지원 | 명시적 쿼리를 통해 삭제 필요 |
| **확장성** | 클러스터링으로 높은 확장성 제공 | 확장 시 복잡한 데이터 동기화 필요 |

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

일단 RDB도 MySQL 클러스터링을 제공하고 있어요 둘다 확장시에 복잡한 처리가 동작하게 되요
한번 더 고민해보시고 다루고자 하는 본질과 다른 내용이면 제거해도 좋을 것 같습니다

Comment on lines +11 to +12
tags: [Token, 기술세미나]
---

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minor) 주제가 JWT 리프레시 토큰을 위한 레디스 사용 인 것 같은데요
Token -> JWT와 redis 태그 추가해보면 어떨까요?

Suggested change
tags: [Token, 기술세미나]
---
tags: [JWT, redis, 기술세미나]
---

Comment on lines +30 to +31
- 서버에 사용자별 세션 데이터를 저장해야 하므로 서버의 메모리 부담이 커짐
- 확장성이 떨어짐 (서버가 분산 환경일 경우 세션 데이터를 공유하는 데 어려움 발생)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

서버가 분산 환경일 경우 세션 데이터를 공유하는 데 어려움 발생 이 부분도 결국 아래 설명에 따르면 리프레시 토큰을 서버가 분산 환경일 때 redis에 저장해야 한다면 동일한 부분이라고 생각되는데 처리 과정의 차이 정도로만 언급주시는게 어떨까요?

그리고 웹 환경 보다는 지속적인 통신이 어려울 수 있는 모바일/앱 환경 관점도 더해주면 좋지 않을까요?

Comment on lines +58 to +63
Redis(Remote Dictionary Server)는 **인메모리(In-memory) 데이터 저장소**로, 높은 성능과 확장성을 제공하는 오픈 소스 소프트웨어입니다. 주로 캐시(Cache), 세션(Session) 관리, 실시간 데이터 처리 등에 활용됩니다. Redis는 데이터베이스처럼 키-값(Key-Value) 구조로 데이터를 저장하며, 다음과 같은 특징을 가지고 있습니다.

- **In-memory 저장**: 모든 데이터를 메모리에 저장하여 매우 빠른 읽기/쓰기 성능을 제공
- **TTL(Time To Live)** 기능 지원: 데이터에 만료 시간을 설정할 수 있음
- **고가용성**: 복제(replication), 클러스터링(clustering)을 통해 분산 환경에서도 안정적으로 동작
- **다양한 데이터 타입 지원**: 문자열(String), 리스트(List), 집합(Set), 해시(Hash) 등

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

레디스 사용의 핵심 중에 가장 큰 특징으로는 단일 스레드라 동시에 처리되지 않고 순차적으로 처리되는 부분이 있는데 분산환경에서 좋지 않은 성능이 발생할 수도 있습니다
비슷한 미들웨어로 Memcached라고 있는데 한번 참고삼아 공부해보시고 전달하고자 하는 핵심이 Redis가 아닌 인메모리 데이터베이스인데, 디스크 io 방식보다 빠르고 멀티 인스턴스에 동시에 연결해서 쓸 수 있다 등으로 깔끔하게 강조해보면 좋을 것 같아요

Comment on lines +43 to +50
**[ JWT의 장점과 특징 ]**
- **무상태성** : 서버가 사용자 세션을 관리할 필요가 없기 때문에 확장성과 성능이 향상됩니다.
- **편리한 인증** : 클라이언트가 각 요청에 토큰을 첨부함으로써 인증 상태를 유지할 수 있습니다.
- **변조 방지** : 서명을 통해 토큰이 변조되지 않았음을 서버가 검증할 수 있습니다.

**2.3 JWT의 한계와 Refresh Token의 필요성**

JWT는 무상태성을 보장하지만, 한 번 발급된 토큰은 만료될 때까지 강제로 무효화할 수 없습니다. 따라서 사용자가 로그아웃하거나 토큰이 유출된 경우에도 토큰이 만료되지 않는 한 보안 위협이 존재할 수 있습니다. 이를 해결하기 위해 Refresh Token이 사용됩니다. Refresh Token은 더 긴 유효 기간을 가지고 있으며, 만료된 Access Token을 갱신하는 데 사용됩니다. Refresh Token을 서버에서 안전하게 관리함으로써 보안성과 사용자 경험을 모두 향상시킬 수 있습니다.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

간단한 예시로 JWT의 인증시간을 짧게 만들고 보안이 중요한 서비스인 경우에 조회하던 클라이언트의 아이피가 달라졌거나 비정상 조회가 감지될 시 리프레시 토큰을 자동으로 비활성화 시킬 수 있는 방법으로도 사용할 수 있는 점을 언급주시면 좋을 것 같습니다

Comment on lines +92 to +97
**3.4 언제 RDB를 사용할까요?**

Redis가 높은 성능과 유연성을 제공하지만, 경우에 따라 RDB가 더 적합할 때도 있습니다.

- **데이터 영속성이 중요한 경우**: Redis는 주로 캐시와 세션 관리에 사용되며, 시스템 장애 시 메모리 데이터가 손실될 수 있습니다. 반면, RDB는 기본적으로 영구 저장을 보장합니다.
- **복잡한 데이터 관계가 필요한 경우**: RDB는 여러 테이블 간의 관계를 정의하고 복잡한 쿼리를 실행할 수 있는 강력한 기능을 제공합니다.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분도 이 블로그 내용의 핵심과는 거리가 멀어보여요

Comment on lines +229 to +235
```java
import org.springframework.data.repository.CrudRepository;

public interface ExampleEntityRepository extends CrudRepository<ExampleEntity, String> {
// 기본 CRUD 메서드 사용 가능
}
```

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

결국 이걸 어떻게 쓰는지는 빼버리고 선언 코드만 작성되어있네요
RedisService를 참조해서 만든 동작과 ExampleEntityRepository를 참조해서 만든 동작 각각의 예시를 표현해서 RefreshToken은 이렇게 정의해서 사용해볼 수 있다와 같이 전달된다면 실제 다른 개발자들이 참조하기 용이할 것 같습니다

이 내용을 아는사람의 입장에서 글을 쓰는 것이 아닌 완전히 모르는 사람이 들어오더라도 이 글만 보고도 적용할 수 있도록 작성하는게 중요합니다

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants