Spring 14

Spring에서 웹소켓 사용하기

웹소켓(Websocket)은 TCP를 이용한 통신 프로토콜로, HTTP의 Stateless한 점을 개선하기 위해 만들어졌다. 기존의 HTTP는 사용자가 요청을 보내야 서버에서 응답을 받을 수 있지만, 웹소켓을 사용하면 사용자의 요청 없이도 서버에서 데이터를 받아 사용할 수 있게 된다. 예를 들어 채팅 앱을 만들 때, 유저 A가 유저 B에게 메세지를 보냈다고 하자. HTTP만을 사용하여 이 기능을 구현한 경우 유저 B가 서버에 주기적으로 요청을 보내야 메세지를 받았다는 것을 알 수 있지만, 웹소켓을 사용한 경우 유저 A가 메세지를 보냈을 때 서버에서 이 요청을 처리하면서 유저 B에게 메세지를 받았다는 데이터를 전송할 수 있는 것이다. 1. Spring에 WebSocket dependency 추가 Sprin..

웹/Spring 2022.05.17

Spring Security를 이용한 세션 확인과 커스텀 인가

백엔드에서 세션을 다루다 보면 세션 정보를 확인해야 할 일이 있다. 사용자의 비밀번호를 바꾼다거나, 사용자가 작성한 게시물을 확인할 때에는 해당 요청을 보낸 사용자 정보를 반드시 확인해야 하는데, Spring Security에서는 간단하게 세션의 확인과 인가가 가능하다. 우선 세션의 확인은 Controller 단에서 이루어지는데, Spring의 Controller에 @AuthenticationPrincipal 어노테이션을 가진 파라미터를 설정하면 요청을 보낸 세션의 username을 가져올 수 있다. // ... 기존 코드들 ... @RestController public class UserController { // ... 기존 코드들 ... @RequestMapping(value = "/path", ..

웹/Spring 2022.04.25

Spring Security에서 JWT를 이용해 인증 토큰 발행하기

Spring Security의 세션 기능은 Spring 서버 안에서 관리되는 세션이다. 따라서 Frontend 서버를 따로 개발하는 경우 Spring Security 안의 세션 기능을 직접적으로 사용할 수 없는데, 이럴 때 사용할 수 있는 방법이 바로 Json Web Token(JWT)을 사용하는 방법이다. JWT는 Json 기반의 인증 토큰으로, 인증에 필요한 모든 정보를 암호화한 채로 담고 있어 인증 이후에도 클라이언트와 서버가 연결을 유지할 필요가 없다는 장점이 있다. 또, Json을 암호화한 짧은 문자열로 전달되기 때문에 큰 부담 없이 사용할 수 있다. 거기에 모든 인증이 인증 토큰으로 진행되므로 여러 종류의 클라이언트 서버를 동시에 사용 가능하다. Spring 프로젝트에서 JWT를 사용하기 위해..

웹/Spring 2022.04.13

Spring Security에서 사용자 인가하기

Backend에서 여러 기능을 구현하다 보면, 사용자를 몇 가지 종류로 구분해야 하는 경우가 생긴다. 각 사용자는 구분에 따라 할 수 있는 기능도 다르고, 접근 권한도 다르다. Spring Security에서는 이러한 기능을 인가를 통해 구현한다. Spring Security에서 인증 과정이 여러 클래스를 구현해 복잡하게 진행되었다면, 인가 과정은 훨씬 간단하다. Spring Security의 설정 클래스에서 configure 메소드를 오버라이드한 뒤 특정 path에 필요 권한을 추가하면, Spring Security가 사용자의 권한에 따라 해당 path로의 접근을 허용하거나 차단하기 때문이다. public class SecurityConfig extends WebSecurityConfigurerAdap..

웹/Spring 2022.04.12

Spring Security에서 DB에 존재하는 사용자 인증하기

Spring Security가 자체적으로 세션 관리 기능을 지원하기는 하지만, 이는 어디까지나 자체적인 기능이지 Spring 서버와 연결된 DB의 정보와는 무관한 기능이다. 따라서 Spring Security를 제대로 이용하기 위해선 우선 Spring Security와 DB의 회원 정보를 연결하는 과정이 필요하다. 우선은 Spring Security와 연결할 DB, 그리고 DB와 연결된 Repository가 필요하다. 이 글에서는 H2 DB에서 아래와 같이 정의된 테이블과, 해당 테이블을 JDBC Template을 이용해 관리하는 Repository가 있다고 가정하겠다. create table user ( id bigint generated by default as identity, username va..

웹/Spring 2022.04.12

Spring 프로젝트에서 Spring Security 사용하기

웹 프로젝트를 개발하다 보면 민감한 데이터를 다루어야 할 일이 종종 생긴다. 예를 들어 회원 데이터를 다루는 경우, 비밀번호는 반드시 암호화하여 저장해야 하고 각 회원이 로그인했을 때 만들어지는 세션 역시 중복이나 위/변조가 발생하지 않도록 관리해야 한다. 이렇게 보안이 중요한 데이터를 다룰 때 Spring에서 사용하는 것이 바로 Spring Security이다. Spring Security는 Filter Chain을 기반으로 한 프레임워크이다. 무슨 소리냐면, 어떠한 요청(예를 들어 로그인 등)을 처리할 때, 하나의 거대한 함수 안에서 모든 기능을 처리하는 것이 아니라 Spring Security에서 생성한 여러 개의 Filter를 차례로 거치면서 인증을 진행하게 된다는 것이다. 따라서 Spring S..

웹/Spring 2022.04.12

Spring 프로젝트에서 HTTPS 사용하기

일반적으로 회원정보와 같은 민감한 정보를 네트워크로 전송할 땐 보안을 위해 HTTP가 아니라 HTTPS를 사용한다. Spring 프로젝트에서 HTTPS를 사용하기 위해선 프로젝트에 인증서를 추가해야 하는데, Spring의 보안을 담당하는 Spring Security 없이 java의 keytool과 Spring에 내장된 tomcat만으로도 간단하게 인증서의 추가가 가능하다. 1. java의 keytool로 인증서 생성 HTTPS를 사용하기 위해선 인증서가 필요한데, 인증서를 만들 수 있는 가장 간단한 방법은 바로 java의 keytool을 사용하는 것이다. sudo /usr/lib/jvm/java-11-openjdk-amd64/bin/keytool -genkeypair -alias {인증서 별칭} -key..

웹/Spring 2022.04.10

DB와 연결하기

백엔드 서버의 가장 중요한 역할은 데이터의 CRUD이고, 이를 위해선 백엔드 서버와 DB의 연결은 필수적이다. 이 글에서는 DB 중 하나인 H2 DB를 설치해 Spring 서버와 연결해 보겠다. 1. H2 DB 설치 및 실행 우선 이 링크에서 1.4.200 버전 인스톨러를 다운로드 받는다. 이 때 인스톨러에는 Windows Installer와 Platform-Independent 두 종류가 있는데, 이 글에서는 DB를 WSL 환경에 설치할 것이므로 Platform-Independent 버전을 다운로드 받아 WSL 폴더의 홈 디렉토리(~)에 놓는다. 이제 WSL 터미널에서 ~/h2/bin 경로로 이동한 뒤 h2.sh에 chmod 명령어를 이용해 실행 권한을 부여하고, h2.sh를 실행하면 H2 DB의 콘솔..

웹/Spring 2022.03.22

JUnit / AssertJ를 이용하여 테스트하기

프로그램 개발에서 가장 중요한 부분은 바로 디버깅이다. 어떤 프로그램을 개발하든 프로그래머의 예상을 벗어나는 버그는 항상 발생할 수밖에 없고, 정상적으로 동작하는 프로그램을 만들기 위해선 이런 버그를 해결하는 디버깅 작업을 실행해야 하는데, Spring Initializr로 생성한 Spring 프로젝트는 디버그용 라이브러리 JUnit과 AssertJ를 이용해 손쉽게 디버깅할 수 있다. Spring에서 디버깅은 src/test 폴더 안에 테스트 전용 java 파일을 만들어 실행한다. 이 파일 안에는 테스트할 클래스를 인자로 가진 테스트 전용 클래스를 만들어 진행하는데, 이 때 테스트는 main 메소드가 아닌 Annotation으로 JUnit의 @Test를 붙여 runnable하게 만든 여러 메소드에서 진행..

웹/Spring 2022.03.17

Repository / Service / Controller

백엔드 서버에서 가장 중요한 것은 데이터의 CRUD와 데이터를 프론트엔드 서버로 전송하는 것이다. Spring은 Java 프레임워크이므로 이러한 기능 역시 특정 객체의 메소드로 구현하는데, 이러한 기능을 가진 객체를 각각 Repository, Service, Controller라고 부른다. 이 객체들은 모두 Spring Container의 한 종류이므로 Annotation을 붙여 Spring에게 알려야 제대로 사용할 수 있다. Repository Repository 객체는 백엔드 서버와 DB의 연결을 담당하는, 즉 데이터의 CRUD를 담당하는 객체이다. DB에 따라 데이터를 가져오는 절차가 다를 수 있으므로 Interface를 이용해 구현하는 것이 바람직하며, DB와 데이터를 주고받는 기능만을 진행해야 ..

웹/Spring 2022.03.17