spring

    Spring Security 프레임워크로 로그인에 성공하면 JWT 발급하기

    지난 글에서 OAuth2를 통해 로그인을 구현했습니다. 이번 글에서는 로그인에 성공했을 때 사용자에게 Refresh 토큰을 발급해 주고, Refresh 토큰으로 Access 토큰을 발급받아 사용하도록 구현해보겠습니다. JWT 발급 전략 구현하기에 앞서 제가 선택한 JWT 발급 전략에 대해서 설명해보겠습니다. OAuth2 로그인을 시도할 때 CORS 설정이 허용된 애플리케이션 서버에서 요청을 하기 위해서 사용자가 하이퍼링크로 서버의 url에 접근했었습니다. 이로 인해서 주체는 백엔드가 되었고, 클라이언트 페이지로 돌아오기 위해서 리디렉션을 해야 합니다. 따라서 요청과 응답 객체에 토큰을 포함할 경우 사용이 불가능하다는 문제가 생깁니다. 저는 이를 해결하기 위해서 Access 토큰 재발급을 위한 Refres..

    Spring Security가 뭐죠?

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

    Spring Security + JWT + OAuth2 를 도입하겠습니다!

    이번에 새로운 프로젝트를 기획하면서 인증/인가 기능이 필요할 것 같다는 판단이 들었고, 해당 기능을 구현하고자 어떤 기술을 사용할지 고민할 필요가 있었습니다. 먼저, 서버를 Spring boot를 통해 구현하고자 결정했고, Spring boot에서 인증/인가를 쉽게 추가할 수 있는 프레임워크인 Spring Security를 선택했습니다. 그리고 이번 프로젝트에서는 많은 회원 정보를 필요로 하지 않아 간편한 회원가입과 로그인을 사용자에게 제공하기 위해 소셜로그인 기능을 사용하자는 판단으로 OAuth2를 선택했습니다. 마지막으로, 세션 방식에 비해서 상태에 관한 관리가 적어지는 토큰 방식을 선택해서 서버의 부하를 줄이자는 생각과 RESTful 한 개발에 목적을 두고 있기 때문에 stateless 한 JWT를..

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

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

    [Spring Boot] JPA - MySQL

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

    [Spring Boot] TDD - JUnit?

    JUnitJUnit은 Java의 표준 단위 테스트 프레임워크 입니다.JUnit은 어노테이션을 기반으로 테스트를 지원합니다.JUnit 5는 크게 Jupiter, Platform, Vintage 모듈로 구성됩니다. JUnit LifeCycle AnnotationJUnit은 아래와 같은 테스트 라이프 사이클을 가지고 있습니다.@Test  -  테스트용 메소드를 표현하는 어노테이션@BeforeEach  -  각 테스트 메소드가 시작되기 전에 실행되어야 하는 메소드를 표현@AfterEach  -  각 테스트 메소드가 시작된 후 실행되어야 하는 메소드를 표현@BeforeAll  -  테스트 시작 전에 실행되어야 하는 메소드를 표현 (static 처리 필요)@AfterAll  -  테스트 종료 후에 실행되어야 하는 ..

    [Spring Boot] Spring Boot에서 TDD 방법론

    이전에 스프링을 사용하여 개발을 진행했을 때는 테스트를 거의 하지 않았습니다.딱히 필요하다고 느끼지 못했습니다.하지만 많은 팀에서 채택하는 것을 보고TDD 방법론과 조금은 친해지면서 새롭게 시작할 프로젝트에는 적용해서 개발해보고 싶어졌습니다. TDD?먼저 TDD란??Test Driven Development, 테스트 주도 개발입니다.말 그대로 테스트 코드를 먼저 작성하고 테스트를 통과하기 위해 개발을 이어가는 방법입니다. Why TDD?그렇다면 TDD를 채택하는 이유는 무엇일까요?TDD의 장점은 다음과 같습니다.객체 지향적인 코드 개발, 설계 수정시간의 단축, 유지보수(리팩터링)의 용이성, 테스트 문서의 대체 가능 저는 이중에서 객체 지향적인 코드 개발, 유지보수의 용이성, 테스트 문서의 대체 가능이 세..

    [Spring Boot] Spring boot EC2에 배포하기

    Java JAVA JDK, JRE 설치 및 환경설정 AWS EC2 AWS EC2 에 스프링 부트를 배포하자. 먼저 저자는 Maven 사용했기 때문에 package 를 더블클릭해서 실행하면 배포를 하게되고 아래 콘솔에 나온 경로로 이동해서 server-0.0.1-SNAPSHOT.jar 파일을 찾는다. 이 파일이 배포 파일이다. (설정에 따라 war 일 수도 있음) EC2로 해당 파일을 옮긴 후 java -jar server-0.0.1-SNAPSHOT.jar 를 입력하여 실행하면 스프링 부트가 실행된다. 이 실행을 백그라운드로 돌리기 위해서는 nohup java -jar server-0.0.1-SNAPSHOT.jar & 이렇게 입력해준다. 만약 스프링을 배포한다면 톰캣을 설치하고 webapps 폴더 내에 해..