29

Spring에서 웹소켓 사용하기

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

웹/Spring 2022.05.17

React 프로젝트에서 Redux 사용하기

React 프로젝트를 진행하다 보면 몇 단계 아래의 자식 Component에게 props를 전달하거나, 자식 Component의 값을 부모 Component로 전달해야 하는 경우가 생긴다. 이러한 경우 javascript 혹은 React의 기능을 이용해서 문제를 해결할 수도 있지만, Redux를 이용하면 필요한 정보를 Redux로 저장한 뒤 가져오는 방식으로 해결할 수 있다. 1. React 프로젝트에 Redux 추가하기 React 프로젝트를 만들 때 Redux를 추가하기 위해서는, create-react-app의 인자로 --template redux를 제공하면 된다. npx create-react-app --template redux 혹은 기존 React 프로젝트에 Redux를 추가하고 싶다면 Redu..

웹/Redux 2022.05.12

Redux 시작하기

Redux는 Javascript의 상태 관리 라이브러리이다. Redux를 사용하면 특정 변수를 state로 지정해 저장할 수 있고, 또 어느 위치에서든 저장한 state를 조회하거나 수정할 수 있다. 1. Redux 설치하기 Redux를 사용하기 위해선 cdn으로 import하는 방식과 node.js에 설치하는 방식이 있는데, cdn으로 import하는 방식은 잘 사용되지 않는다. node.js에 Redux를 설치하는 방법은 아래와 같다. npm i @reduxjs/toolkit 2. state 저장하기 Redux에서 state를 저장하기 위해서는 configureStore 함수를 사용하면 되는데, 이 때 인자로는 반드시 reducer 필드를 가진 object를 사용해야 한다. 이 reducer는 Red..

웹/Redux 2022.05.12

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

Spring 프로젝트에 Lombok 추가하기

Spring뿐 아니라 여러 Java 프로젝트를 다루다 보면, 기본적인 생성자와 getter / setter, builder 등을 만들기 위해 시간을 낭비해야 하는 경우가 있다. 물론 VS Code 혹은 IntelliJ와 같은 편집기를 이용하면 해당 메소드를 빠르게 추가할 수도 있지만, Lombok이라는 라이브러리를 이용하면 이러한 기본 메소드를 따로 추가할 필요 없이 Annotation만으로도 빠르게 추가할 수 있다. 1. VS Code에 Lombok Annotations Support 확장 추가 Lombok은 Oracle 혹은 Microsoft에서 개발한 것이 아닌 서드 파티 라이브러리이기 때문에, 우선 VS Code에 Lombok이 어떤 라이브러리인지 알려주어야 한다. VS Code의 확장에서 Lom..

웹/Spring 2022.04.09