
쿠키부터 JWT까지 흐름을 파악해보자
최근 포스팅에서 인증/인가와 관련된 내용들을 많이 다뤄왔다. 문득 이런 인증/인가 방식의 흐름에 대해서 의문점을 가지게 되었다. 이번 포스팅에서는 가장 많이 언급되는 쿠키, 세션, JWT 이 세가지 키워드가 어떤 식으로 연결되었는지 확인해보고자 한다. HTTP의 무상태성과 인증의 필요성 HTTP(Hypertext Transfer Protocol)...

최근 포스팅에서 인증/인가와 관련된 내용들을 많이 다뤄왔다. 문득 이런 인증/인가 방식의 흐름에 대해서 의문점을 가지게 되었다. 이번 포스팅에서는 가장 많이 언급되는 쿠키, 세션, JWT 이 세가지 키워드가 어떤 식으로 연결되었는지 확인해보고자 한다. HTTP의 무상태성과 인증의 필요성 HTTP(Hypertext Transfer Protocol)...

이제는 소셜로그인을 지원하지 않는 서비스를 찾는 것이 더 어려워졌다. 어찌보면 당연한 현상이다. 서비스별로 아이디와 암호를 모두 외우는 대신 계정 하나의 아이디와 암호만 외우는 게 이용자로 하여금 훨씬 쉽기 때문에 그만큼 빠르게 보급되었다. 이 소셜로그인은 바로 지난 포스트에서 알아본 OAuth와 OIDC(OpenID Connect)를 통해서 구현되는...

개발자 입장에서 로그인이나 회원 가입 등 사용자 정보를 직접 관리하는 것은 어찌 보면 당연한 일이지만, 동시에 굉장히 부담스러운 일이기도 하다. 최근 발생하는 다양한 보안 이슈만 보더라도, 이 작업이 얼마나 어려운 일인지 알 수 있다.시간이 지날수록 우리가 사용하는 서비스의 종류는 점점 늘어나고 있다. 이는 사용자에게도 부담스러운 일이다. 내 정보를 ...

요즘 다양한 서비스에서 소셜로그인을 기본적으로 지원하는 모습을 쉽게 볼 수 있다. 이 소셜로그인은 사용자가 별도의 회원가입 없이 구글, 카카오, 네이버 등 외부 플랫폼 계정으로 간편하게 로그인할 수 있게 해주는데, 그 동작 원리는 바로 OAuth 2.0 프로토콜에 기반한다. 소셜로그인의 핵심 동작 원리는 OAuth 2.0 권한 부여 프로토콜을 활용해...

지난 포스트에서는 Spring Boot 애플리케이션에 로컬 캐시(Caffeine Cache)를 적용하는 방법과 그 효과에 대해 살펴보았다. 이번 포스트에서는 저번 포스트에서 사용한 책 정보 서비스에 글로벌 캐시(Redis)를 적용과 관련하여 알아보자. 도입 배경 로컬 캐시의 한계 로컬 캐시는 애플리케이션 인스턴스의 메모리에 직접 데이터를 저장하여...

지난 포스트에서는 캐시의 기본 개념과 Spring에서 제공하는 캐시 추상화에 대해 알아보았다. 이번 포스트에서는 간단한 서비스를 직접 구현한 뒤, 여기에 로컬(Caffeine Cache) 캐시를 적용해보고 실제로 어떤 변화가 있는지 살펴보겠다. 캐시를 적용하기 전후의 성능 차이를 비교하면서, 캐시가 서비스에 어떤 장점을 가져다주는지 구체적으로 확인해보...

단순한 조회 작업마다 매번 데이터베이스를 호출하는 것은 비효율적일 수 있다. 서비스의 규모가 커지고 트래픽이 증가할수록 이러한 비효율은 더욱 두드러진다. 이럴 때 캐시는 문제를 해결할 수 있는 효과적인 방법 중 하나다. 자주 접근하는 데이터를 미리 저장해두고 필요할 때 빠르게 제공함으로써 데이터베이스 부하를 줄이고, 응답 시간을 단축시킬 수 있다. ...

레디스(Redis)에 대해 찾아보던 중, 자연스럽게 NoSQL 데이터베이스 전반에 대한 궁금증이 생기게 되었다. 레디스도 엄연히 NoSQL이기 때문에, 이를 제대로 알기 위해서는 NoSQL에 대해서 먼저 알아둘 필요가 있다고 생각했다. NoSQL에는 어떤 특징과 차이점이 있는지 한 번쯤 정리해두면 좋을 것 같았다. 이번 포스트에서는 NoSQL의 정의...

Spring에서 Controller는 사용자의 요청을 받아서 처리하고, 그 결과를 클라이언트에 반환하는 역할을 한다. 요청 데이터를 컨트롤러 메소드에 전달하는 방법에는 여러 가지가 있다. @RequestParam 애노테이션을 사용하여 요청 파라미터(즉, 쿼리 파라미터나 폼 데이터)를 컨트롤러의 메서드 매개변수에 바인딩할 수 있다. @RequestBo...

페이지네이션 (Pagination) 사용자가 요청했을 때 데이터베이스에 있는 모든 데이터를 조회하여 제공한다면 부하가 굉장이 클 것이다. 이를 방지하기 위해 대부분의 서비스에서는 데이터를 일정 길이로 잘라 그 일부만을 사용자에게 제공하는 방식을 사용한다. 사용자는 현재 보고 있는 데이터의 다음, 이전 구간 혹은 특정 구간의 데이터를 요청하고, 전달...