Redis는 싱글스레드인데 왜 초당 수십만 요청을 처리할 수 있을까? 이번 시간엔 Blocking I/O부터 epoll, Java NIO, Redis 이벤트 루프까지 정말 빡세게 공부하면서 어느정도 개념을 정립했기에 정리하는 시간을 가져볼 생각이다. I/O는 왜 느린가 공부를 하다 보면 I/O가 병목이라는 말을 자주 듣는다. 왜 하필 I/O가 병목이 되는 걸까? CPU가 느리나? 코드가 문젠가? 아니다. 이건 하드웨어의 근본적 속도 차이 때문이다. CPU 레지스터에 접근하는 시간은 약 0.3 나노초이다. L1 캐시는 1ns. DRAM은 100ns 정도. 근데 네트워크 패킷이 도착하는 시간은 로컬 네트워크만 해도 수십 마이크로초(µs), 인터넷 너머라면 수십 밀리초(ms)다. 디스크 읽기는 SSD 기..
Redis
모바일 앱 백엔드를 개발하면서 눈이 많이 뜨였다. 설계자의 시점에서 프로젝트를 바라볼 필요가 있기에 많은 노력과 고생이 들어갔다. 아직 대학교 4학년이지만 어느정도 프로젝트를 거시적으로 바라보며 이 작업이 왜 필요하고 어떻게 설계하면 좋을지에 대한 감각이 생긴것 같아서 행복한 요즘이다. 이번 시간엔 카카오 OAuth 2.0 + Spring Security + JWT + Redis를 조합하여 인증 시스템을 설계한 과정을 포스팅해볼 것이다. 각각의 기술을 선택한 이유와 세부적으로 필터체인을 설계한 과정을 공유할 생각이다. 왜 JWT일까? 전통적인 웹 애플리케이션에선 세션 방식이 일반적이다. 로그인할 땐 브라우저가 자동으로 쿠키 전송 → 서버가 세션 저장소에서 조회 → 사용자 정보 확인 이후의 ..
JWT는 로그인한 사용자를 인증하기 위해 가장 널리 쓰이는 방식이다. 서버가 세션을 직접 저장하지 않아도 되기 때문에 무상태이면서도 서명 검증만으로 사용자를 확인할 수 있다. 근데 단순한 만큼 치명적인 약점이 있다. 서버가 한 번 발급한 토큰을 강제로 무효화할 수 없다는 점이다. 서버가 잃어버린 통제권 JWT는 한 번 발급되면 그 안에 exp(만료시간)이 고정된다. 이 말은 서버가 그 토큰을 회수하거나 취소할 방법이 없다는 뜻이다. 사용자가 로그아웃 해도 기존 토큰은 유효하고 비밀번호 변경해도 이전 토큰으로 접근 가능하고 토큰이 유출되면 서버는 막을 방법이 없다. 결국에 서버가 다시 상태를 관리하는 방법을 찾아봐야 한다. 그게 바로 블랙리스트 구조이다. 블랙리스트란? JWT는 기본적으로 sta..
지난 시간에 Redis를 알아봤으니 이번엔 실제로 스프링부트에서 Redis를 활용해서 CRUD 작업을 해보겠다. 먼저 스프링에서 제공하는 RedisTemplate을 쓰기 위해 spring-boot-starter-data-redis 의존성을 추가해주자. 그 후에 application.yml에서 Redis 기본 연결을 위해 포트번호 설정을 해주면 된다. 준비됐으면 시작해보자! Docker로 Redis 실행하고 연결하기 먼저 Docker Desktop에 들어가서 Redis를 search해서 run해준다. 여기서 Run을 해주고 컨테이너 이름은 TestRedis, Host port엔 6379를 해줬다. 이렇게 해주고 Run을 하면 성공적으로 돌아가고 있다는 로그를 확인할 수 있다. 이제 내..
Redis란? Redis는 빠르고 가볍고 유연한 현대 백엔드 시스템의 핵심 중 하나이다. Redis(REmote DIctionary Server)는 키-값(key-value) 구조로 데이터를 저장하는 인메모리 기반의 NoSQL 데이터 저장소이다.메모리에 저장하므로 속도가 매우 빠름 (읽기/쓰기 모두 수 밀리초 수준)디스크에도 저장 가능 (RDB, AOF) → 영속성 보장 가능다양한 자료구조 지원: 문자열, 리스트, 셋, 해시, 정렬된 셋 등분산 환경에서도 사용 가능 → 클러스터, Sentinel 지원 Redis는 RAM 기반 처리로 빠른 응답을 한다. 간단하게 redis를 사용하는 이유를 보자면 이렇게 설명할 수 있다. 어디에 쓰일까?단순히 사람들이 많이 써서 나도 해야 한다는 것보단 어디서 ..