WEB

    Spring Security 프레임워크로 OAuth2 로그인

    기본적인 이론을 모두 정리했으니 직접 구현해봅시다. Spring Security에서 제공하는 로그인 기능이 아닌 OAuth2를 사용하는 로그인 기능을 구현해보겠습니다. ( form 로그인 방법도 노션에 정리는 해뒀지만,,, OAuth2 보다 작성할 내용이 많아 추후에 하겠습니다. ) 구현할 로그인 과정의 대략적인 순서는 다음과 같습니다. - 클라이언트에서 Spring Boot 서버로 로그인을 요청합니다. - 클라이언트에게 OAuth2 로그인 redirect url을 전달하여 로그인을 시도합니다. - 로그인에 성공하면 OAuth2 리소스 서버에서 사용자의 정보를 가져와 Refresh JWT 를 발급합니다. - 발급된 Refresh JWT를 Redis 에 저장하여 관리하고, 클라이언트에게 쿠키(Http on..

    OAuth2가 뭐죠?

    OAuth2 (Open Authorization 2.0) 는 인증을 위한 개방형 표준 프로토콜입니다. 이 기능을 통해서 Naver, Kakao, Google 등에 로그인하는 방법으로 간편한 소셜 로그인을 구현할 수 있으며, 서버 혹은 클라이언트에서는 로그인된 해당 애플리케이션에서 사용자의 정보를 받아와 사용할 수 있습니다. OAuth2 를 구성하는 역할을 소개하고 OAuth2를 사용해 로그인하는 과정을 순서대로 정리해보겠습니다. 구성 OAuth2 를 구성하기 위해서는 리소스 소유자(사용자), 클라이언트(애플리케이션 서버), 권한 서버, 리소스 서버가 필요합니다. 리소스 소유자는 로그인을 하는 주체입니다. 즉, Naver, Google 등에 로그인을 시도 할 사용자입니다. 클라이언트는 소셜 로그인을 통해 ..

    JWT가 뭐죠?

    JWT는 JSON Web Token의 약자입니다. 말 그대로 JSON 데이터 형태로 구성된 웹 토큰입니다. 일반적으로 로그인이 되었을 때, 로그인을 유지하거나 권한이 필요한 곳에 접근할 수 있도록 하는 등으로 사용됩니다. 그렇다면 이 토큰의 구성은 어떻게 되어있고 사용했을 때의 장점이 무엇이며, 언제 어디에 주로 사용되는지 순서대로 살펴봅시다!! 구조 JWT는 점(.)으로 구분되는 세 부분으로 구성됩니다. Header . Payload . Signature Header 헤더는 일반적으로 토큰의 유형(JWT)과 Signature 부분을 암호화하는 알고리즘으로 JSON 데이터를 구성합니다. { "alg" : "HS256", "typ" : "JWT" } 그 후 이 JSON 데이터를 Base64Url로 인코딩해..

    Spring Security가 뭐죠?

    많은 분들이 Spring boot를 사용하면서 인증/인가 기능을 추가하고자 한다면 Spring Security를 적극 추천합니다. Spring boot 환경에서 많은 부분을 쉽게 구현하도록 편의성을 제공해 주기 때문이죠!! 그렇다면 Spring 에서 Spring Security의 구조가 어떻게 되어있는지와 기본적인 로그인이 어떻게 동작하는 과정을 살펴봅시다. 구조 Spring Security를 알기 전에 서블릿 기반의 Spring 애플리케이션에서 Filter의 역할을 알아봅시다! Client의 요청이 다양한 Filter와 Servlet을 포함하는 FilterChain을 거쳐 컨트롤러로 보내집니다. FilterChain의 Filter에서는 HttpServletReqeust 와 HttpServletRespo..

    [Spring JPA] IncorrectResultSizeDataAccessException

    IncorrectResultSizeDataAccessException 제가 JPA 레포지토리에서 findBy~~ 메서드를 통해 단일 select를 하면서 발생한 예외입니다. 원하는 조건의 데이터는 단일 데이터인데, db에 해당 조건의 데이터가 여러개가 존재하며 모든 데이터가 가져와지면서 예외가 발생했습니다. 팀원 중 한 명이 서비스의 시나리오와는 별개로 데이터를 추가하면서 발생한 문제로, 서비스의 시나리오대로 로직이 구동될 경우 발생하지 않았습니다. Reference https://computer-science-student.tistory.com/496 [스프링, Spring] JDBC queryForObject의 결과가 없을 때(null) 혹은 결과가 2개 이상일 때 - IncorrectResultSi..

    [Spring Boot] API Docs를 자동으로 만들어보자!

    많은 분들이 그렇겠지만 저는 지금까지 FE 팀원들과 소통하기 위해서 Notion에 API Docs를 만들어서 사용했습니다. 이렇게 만들면 귀찮아서 하기 싫고... 코드에 수정이 발생하면 이것도 수정해야하고... 오타 검수도 힘들고.... 너무 불편해서 찾아봤더니 Swagger라는 툴을 주로 사용한다고 해서 저도! 사용해보고자 합니다. ㅎㅎ 왜 Swagger? 다른 문서화 도구도 있지만 Swagger는 특히 적용하기 쉽습니다! 정말 몇 줄의 코드만으로 만들 수 있어요! 그리고 테스트를 할 수 있는 UI를 제공해줘서 Swagger 문서 화면에서 API를 바로 테스트할 수도 있습니다! 저는 지금까지 Postman을 사용해서 API를 테스트했는데, Postman에서 API를 문서화하면... Notion이랑 다를..

    [SpringBoot] SpringBoot에 MongoDB 연결

    만들어둔 MongoDB 데이터베이스를 SpringBoot 프로젝트에 연결해보려고 합니다. 목표 데이터베이스에 이름과 나이를 저장하고 확인하는 테스트 코드를 작성해 봅시다. 데이터베이스 이름 : test 컬렉션 이름 : Info 의존성 추가 implementation ("org.springframework.boot:spring-boot-starter-data-mongodb") 연결 설정 저는 MongoDB Altas로 데이터베이스를 생성해서 해당 URI를 가져와 설정해 주었습니다. Overview에서 본인의 클러스터의 Connect를 클릭합니다. 여기서 Drivers를 선택해 줍니다. 3번에 있는 윗줄을 복사해 주시고 다음과 같이 맞춰줍니다. spring.data.mongodb.uri=mongodb+srv..

    [Spring Boot] JPA - MySQL

    Mybatis vs JPA MySQL 데이터베이스를 연결하는 방법으로 두 가지 중 어떤 방법을 선택할지 고민했습니다. Mybatis는 직접 쿼리를 작성한 후 XML 또는 어노테이션을 사용해서 데이터 맵핑을 하는 방법이고, JPA는 객체와 관계형 데이터베이스 간의 매핑을 제공해주어서 쿼리를 작성할 필요가 없습니다. Mybatis를 사용해봤던 경험으로 저는 Mybatis를 사용하면서 장기간 프로젝트를 이어나가면 코드가 조금 복잡할 수 있겠다 생각했습니다. (물론 제가 실력이 부족해서..ㅎㅎ) JPA를 사용할 경우 얻을 수 있는 장점으로 여러 가지가 있겠지만 저는 밑에 있는 이유 때문에 JPA를 선택했습니다. - 코드를 더욱 간결하게 만들 수 있습니다. - 보다 높은 유연성과 확장성을 제공합니다. 아직 JPA..