반응형

1. Session 기반 로그인 기능 구현 방법론

    ˙ 사용자의 세션을 유지하고, 세션에 로그인 상태를 저장한다.

    ˙ React에서는 세션 쿠키를 통해 세션 상태를 유지하고, Spring Boot에서는 세션 관리를 위한 기능을 제공한다.

    ˙ 로그인 시에 서버에서 세션을 생성하고, 로그아웃 시에 세션을 제거한다.

 

2. JWT(Json Web Token) 기반 로그인 기능 구현 방법론

    ˙ 사용자가 로그인하면 서버에서 토큰을 발급하고, 이 토큰을 사용하여 사용자를 인증한다.

    ˙ React에서는 토큰을 로컬 스토리지 또는 쿠키에 저장하고, Spring Boot에서는 토큰을 검증하여 인증한다.

    ˙ 토큰은 보통 사용자의 권한과 유효기간을 포함하고 있다.

 

    ˙ [장점]

        - 세션 기반 인증 방식에 비해 서버가 DB에 세션 정보를 갖고 있을 필요가 없음

        - 서버에서 상태 정보를 저장하지 않으므로, stateless가 유지됨

        - 토큰 기반이므로 서로 다른 웹 서버에서 동작할 수 있음

 

    ˙ [단점]

        - 세션에 비해 토큰 자체의 데이터 길이가 길다

        - payload는 암호화되지 않으므로 중요한 정보를 담기 부적절 함

        - 토큰을 탈취당한 경우 보안상 문제점 야기할 수 있음 (때문에, 일반적으로 토큰에 유효기간 부여)

Refresh Token을 이용하여 Access Token 재발급

 

3. Spring Security를 이용한 인증 및 권한 기능 구현 방법

    ˙ Spring Security를 사용하여 강력한 보안 기능을 구현한다.

    ˙ React에서는 SpringSecurity의 로그인 페이지를 호출하고, SpringBoot에서 인증하고 권한을 부여한다.

 

4. OAuth2를 이용한 소셜 로그인 기능 구현

    ˙ 소셜 미디어 플랫폼(구글, 페이스북, 카카오 등)의 OAuth2를 이용하여 로그인 기능을 구현한다.

    ˙ React에서는 OAuth2 클라이언트를 통해 플랫폼으로부터 토큰을 받아오고, SpringBoot에서 토큰을 인증한다.

 

OAuth2 인증 시퀀스다이어그램

 

- Resource Owner : 특정 서비스에 접속하려는 사용자

- Client : 웹 서비스 (Google, Kakao 등의 Resource Server 입장에서는 Client 역할)

- Resource Server : 사용자의 개인정보를 가지고 있는 서버(Google, Kakao 등)

- Authorization Server : 실질적으로 권한 부여 기능을 담당하는 서버

  사용자(Resource Owner)는 자신의 SNS 계정 정보(ID/PW)를 넘기면 Authorization Code를 받는다.

   Client는 사용자로부터 받은 Authorization Code를 넘기면 Access Token을 받는다.

 

 

최근 추세는 Token 기반 로그인(JWT)이나 OAuth2를 사용하는 것을 많이 선택하며, 

Spring Security와의 통합도 고려할 만하다.

반응형
반응형

1. 시험환경

    ˙ docker

    ˙ docker-compose

    ˙ mariaDB

 

2. 목적

    ˙ docker 및 docker-compose를 이용하여 MariaDB를 기동한다.

    ˙ volumes를 이용하여 MariaDB 생성시 설정 및 데이터 Import 방법을 알아보자.

 

3. 적용

    ① MariaDB를 기동하기 위한 compose.yml을 작성하며 DB 설정 및 초기 데이터 구축을 테스트한다.

        - /etc/mysql/conf.d : MariaDB 설정 사항이 저장되면 버전, OS 등에 따라 경로는 달라질 수 있다.

        - /docker-entrypoint-initdb.d :  컨테이너 최초 실행 시 스크립트 파일(sql)에 저장된 내용이 반영된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: "3.8"
services:
  test-mariadb:
    container_name: test-mariadb
    build:
      dockerfile: Dockerfile
      context: ./mariadb
    image: mariadb
    environment:
     - MARIADB_DATABASE=world
      - MARIADB_ROOT_PASSWORD=1q2w3e
    volumes:
      - ./mariadb/config:/etc/mysql/conf.d
      - ./mariadb/init:/docker-entrypoint-initdb.d
    ports:
      - "3400:3306"
cs

 

 

    ② character-set 등 MariaDB 설정 정보 파일을 Host 경로에 저장한다.

        - 파일명 : ./mariadb/config/mariadb.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
[client]
default-character-set=utf8mb4
 
[mysql]
default-character-set=utf8mb4
 
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
 
[mysqldump]
default-character-set=utf8mb4
cs

 

    ③ MariaDB 컨테이너가 최초 기동되면서 실행할 스크립트 파일을 Host 경로에 저장한다.

        - 파일명 : ./mariadb/init/world.sql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-- world 데이터베이스 구조 내보내기
CREATE DATABASE IF NOT EXISTS `world` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */;
USE `world`;
 
-- 테이블 world.nation 구조 내보내기
CREATE TABLE IF NOT EXISTS `nation` (
  `id` bigint(20NOT NULL AUTO_INCREMENT,
  `currency` varchar(255DEFAULT NULL,
  `lang` varchar(255DEFAULT NULL,
  `nation` varchar(255DEFAULT NULL,
  `population` int(11NOT NULL,
  PRIMARY KEY (`id`)
ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
 
-- 테이블 데이터 world.nation:~4 rows (대략적) 내보내기
DELETE FROM `nation`;
/*!40000 ALTER TABLE `nation` DISABLE KEYS */;
INSERT INTO `nation` (`id``currency``lang``nation``population`VALUES
    (1'Dollar''English''America'50000),
    (2'Frank''Swiss''Swizerland'2000),
    (3'Found''English''England'60000),
    (4'Euro''Italian''Italiy'4000);
/*!40000 ALTER TABLE `nation` ENABLE KEYS */;
cs

 

    ④ docker-compose를 실행하여 MariaDB를 기동한다.

        - > docker-compose -f compose.yml up -d

 

    ⑤ Container 실행 후 Client 도구를 이용하여 접속한다.

        - 접속 정보는 compose.yml 파일에 설정한 환경변수 등을 참고한다.

 

4. 결과

    ˙ sql 스키마 및 데이터가 Import된 것을 확인할 수 있다.

반응형
반응형

1. 시험환경

    ˙ SpringBoot

    ˙ Redis

    ˙ Docker

 

2. 목적

    ˙ Docker를 이용하여 Redis를 설치 및 실행한다.

    ˙ SpringBoot에서 Redis 사용을 위한 라이브러리 설치 및 설정하는 방법을 알아보자.

    ˙ SpringBoot를 이용하여 Redis에 Sample 데이터를 저장하고 불러오는 테스트를 진행한다.

 

3. 적용

    ① Redis가 설치 및 실행되어 있어야 한다. ( 여기서는 Docker를 이용하여 Redis를 설치하고 실행한다. )

        - 참고 : https://languagestory.tistory.com/303

 

Redis Docker 설치 및 Cli 초기 접속

1. 시험환경 ˙ 윈도우 ˙ Docker ˙ Redis 2. 목적 ˙ Redis Docker를 다운(pull)받아 설치한다. ˙ Redis 버전을 확인하고 Redis-Cli에 접속하여 CRUD 기본 사용법을 확인한다. 3. 적용 ① docker hub로부터 redis docker im

languagestory.tistory.com

 

    ② SpringBoot에서 Redis 라이브러리를 설치한다.

        - 파일명 : build.gradle

1
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
cs

 

    ③ redis 접속 정보 등을 설정한다.

        - 파일명 : application.yml

1
2
3
4
5
6
7
8
9
  redis:
    lettuce:
      pool:
        max-active: 10
        max-idle: 10
        min-idle: 2
    port: 6379
    host: 127.0.0.1
    password: 1q2w3e
cs

 

    ④ RedisConfig 파일을 설정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.example.demo.config;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
 
@Configuration
public class RedisConfig {
 
  @Value("${spring.redis.host}")
  private String redisHost;
 
  @Value("${spring.redis.port}")
  private String redisPort;
 
  @Value("${spring.redis.password}")
  private String redisPassword;
 
  @Bean
  public RedisConnectionFactory redisConnectionFactory() {
    RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
    redisStandaloneConfiguration.setHostName(redisHost);
    redisStandaloneConfiguration.setPort(Integer.parseInt(redisPort));
    redisStandaloneConfiguration.setPassword(redisPassword);
    LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
    return lettuceConnectionFactory;
  }
 
  @Bean
  public RedisTemplate<String, Object> redisTemplate() {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory());
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new StringRedisSerializer());
    return redisTemplate;
  }
}
 
cs

 

    ⑤ Redis에 데이터 저장 및 불러오기 기능을 수행하는 코드를 작성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.example.demo.ctrl;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
 
@RestController
public class RedisController {
  @Autowired
  private RedisTemplate<StringString> redisTemplate;
 
  @GetMapping("/set")
  public ResponseEntity<?> setKeyValue() {
    ValueOperations<StringString> vop = redisTemplate.opsForValue();
    vop.set("Korea""Seoul");
    vop.set("America""NewYork");
    vop.set("Italy""Rome");
    vop.set("Japan""Tokyo");
    return new ResponseEntity<>( HttpStatus.CREATED);
  }
 
  @GetMapping("/get/{key}")
  public ResponseEntity<?> getValueFromKey(@PathVariable String key) {
    ValueOperations<StringString> vop = redisTemplate.opsForValue();
    String value = vop.get(key);
    return new ResponseEntity<>(value, HttpStatus.OK);
  }
 
}
cs

 

    ⑥ 스프링 프로젝트를 시작한다.

 

4. 결과

    ˙ Redis에 데이터 저장하기

        - 테스트 URL : http://localhost:8080/set

 

    ˙ Redis에 저장된 데이터 불러오기

        - 테스트 URL : http://localhost:8080/get/Korea

        - 테스트 URL : http://localhost:8080/get/Italy

 

 

반응형
반응형

1. 시험환경

    ˙ 윈도우

    ˙ Docker

    ˙ Redis

 

2. 목적

    ˙ Redis Docker를 다운(pull)받아 설치한다.

    ˙ Redis 버전을 확인하고 Redis-Cli에 접속하여 CRUD 기본 사용법을 확인한다.

 

3. 적용

    ① docker hub로부터 redis docker image 최신버전을 다운로드(pull) 받는다.

        - > docker  pull  redis

        - > docker  images

 

    ② Local 저장소에 저장된 Redis Docker 이미지를 실행한다.

        - > docker  run  -d  -p  6379:6379  [Image-id]

 

    ③ 실행중인 Redis Container 내부로 진입하여 설치 버전을 확인한다.

        -> docker  exec  -it  [container-id]  /bin/bash

 

    ④ Redis Cli에 접속하여 CRUD 명령어를 확인한다.

        -> redis-cli

 

반응형
반응형

1. 시험환경

    ˙ 윈도우 11

    ˙ Tomcat 10

 

2. 목적

    ˙ 윈도우 환경에서 Tomcat 최신버전 설치하는 방법을 학습한다.

    ˙ 톰캣에서 War 파일을 실행하여 Spring Project를 배포한다.

 

3. 적용

    ① Tomcat 사이트에서 운영체제와 플랫폼에 적합한 버전을 다운로드 한다.

        - 여기서는 Windows 운영체제의 64 bit 플랫폼을 다운로드 받았다.

        - URL : https://tomcat.apache.org/

 

Apache Tomcat® - Welcome!

The Apache Tomcat® software is an open source implementation of the Jakarta Servlet, Jakarta Server Pages, Jakarta Expression Language, Jakarta WebSocket, Jakarta Annotations and Jakarta Authentication specifications. These specifications are part of the

tomcat.apache.org

 

 

    ② 다운 받은 파일을 원하는 위치에서 압축 해제한다.

        - 별도의 설치과정없이 압축해제만으로 설치는 끝난다.

 

4. 결과

    ˙ Tomcat 실행 및 종료 여부를 확인한다.

        - 웹서버 실행 파일 : bin/startup.bat

 

        - 웹서버 종료 파일 : bin/shutdown.bat

 

반응형
반응형

1. 시험환경

    ˙ SpringBoot

    ˙ Gradlew

 

2. 목적

    ˙ 스프링 프로젝트를 war 빌드한다.

          - 참고: https://languagestory.tistory.com/155

 

JAR(Java Archive)와 WAR(Web Application Archive) 차이점

1. 시험환경 ˙ SpringBoot ˙ Gradle 2. 목적 ˙ Spring Project 빌드시 JAR 또는 WAR Build의 차이점에 대하여 알아보자. 3. 적용 ① JAR(Java Archive) - 여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소

languagestory.tistory.com

 

    ˙ 빌드 파일명 변경을 위한 설정을 한다.

 

3. 적용

    ① 완성된 프로젝트를 배포하기 위해서 빌드 작업을 진행해야 한다.

        - 데모 프로젝트 : https://languagestory.tistory.com/229

 

spring initializr를 이용한 springboot 프로젝트 생성

1. 시험환경 ˙ Window ˙ Spring Initializr ˙ Gradle ˙ IntelliJ Community 2. 목적 ˙ Spring Initializer를 이용하여 Spring Boot 프로젝트 패키지를 구성한다. ˙ Spring Initializer를 이용하여 구성된 패키지를 IntelliJ에 임

languagestory.tistory.com

 

    ② war 배포를 위해 build.gradle 파일을 설정한다.

        - plugins : id 'war' 추가

        - bootWar : 파일명 설정 (선택)

 

 

    ③ 프로젝트 root에서 gradle wrapper를 이용하여 프로젝트 빌드한다.

        - 윈도우 : > gradlew build

        - Linux, iOS : $./gradlew build

 

4. 결과

    ˙ build/libs 폴더에 빌드된 프로젝트 파일을 확인한다.

 

    ˙ war 파일은 web 패키지를 포함하는 경우 사용하므로 Tomcat 또는 Nginx를 이용하여 실행할 수 있다.

        - 참고 : jar 파일은 java -jar [app.jar] 명령어를 통해 단독으로 실행할 수 있다.

 

반응형
반응형

1. 시험환경

    ˙ SpringBoot

    ˙ Gradlew

 

2. 목적

    ˙ 스프링 프로젝트를 jar 빌드한다.

          - 참고: https://languagestory.tistory.com/155

 

JAR(Java Archive)와 WAR(Web Application Archive) 차이점

1. 시험환경 ˙ SpringBoot ˙ Gradle 2. 목적 ˙ Spring Project 빌드시 JAR 또는 WAR Build의 차이점에 대하여 알아보자. 3. 적용 ① JAR(Java Archive) - 여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소

languagestory.tistory.com

 

  ˙ 빌드 파일명 변경을 위한 설정을 한다.

 

3. 적용

    ① 완성된 프로젝트를 배포하기 위해서 빌드 작업을 진행해야 한다.

        - 데모 프로젝트 : https://languagestory.tistory.com/229

 

spring initializr를 이용한 springboot 프로젝트 생성

1. 시험환경 ˙ Window ˙ Spring Initializr ˙ Gradle ˙ IntelliJ Community 2. 목적 ˙ Spring Initializer를 이용하여 Spring Boot 프로젝트 패키지를 구성한다. ˙ Spring Initializer를 이용하여 구성된 패키지를 IntelliJ에 임

languagestory.tistory.com

 

 

    ② build.gradle에서 jar 파일 이름을 설정한다.

        - 빌드파일 이름을 설정하지 않으면 기본값 "프로젝트명-0.0.1-SNAPSHOT.jar"으로 빌드파일이 생성된다.

1
2
3
bootJar {
    archiveFileName = 'app.jar'
}
cs

 

 

    ③ 프로젝트 root에서 gradle wrapper를 이용하여 프로젝트 빌드하여 jar 파일을 생성한다.

        - 윈도우 : > gradlew build

        - Linux, iOS : $./gradlew build

 

4. 결과

    ˙ build/libs 폴더에 빌드된 프로젝트 파일을 확인한다.

 

    ˙ jar 파일을 생성하여 프로젝트 실행여부를 확인한다.

 

반응형
반응형

1. 시험환경

    ˙ SpringBoot

    ˙ Gradle

 

2. 목적

    ˙ Spring Project 빌드시 JAR 또는 WAR Build의 차이점에 대하여 알아보자.

 

3. 적용

    ① JAR(Java Archive)

        - 여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스(텍스트, 그림 등) 및 메타데이터를 하나의 파일로 모아서

           자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷이다.

        - JRE(JAVA Runtime Environment)만 있어도 실행 가능하다.

        - 패키지 실행 방법 : java -jar package.jar

        - 참고 : https://ko.wikipedia.org/wiki/JAR_(%ED%8C%8C%EC%9D%BC_%ED%8F%AC%EB%A7%B7) 

 

JAR (파일 포맷) - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 

    ② WAR (Web Application Archive)
        - 웹 애플리케이션을 구성하는 자바 클래스와 웹 관련 자원(JSP, Servlet, JAR, Class, XML, HTML, Javascript)을 포함하는

           파일 등을 묶은 압축 파일 포맷이다.

        - 별도의 Web Server 또는 WAS(Tomcat)가 필요하다.

        - 패키지 실행 방법 1 (외부 Tomcat 사용) : apache-tomcat-버전/webapps/package.war 위치에 파일 복사 후 Tomcat 실행

        - 패키지 실행 방법 2 (내장 Tomcat 사용) : java -jar package.war


    ③ Build Package "war" 설정

        - build.gradle 파일

1
2
3
4
5
apply plugin: 'war'
 
dependencies {
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}
cs

 

    ④ 클린 및 빌드

        - $./gradlew clean build

 

4. 결과

    ˙ RestAPI와 같이 Web Page(JSP)가 포함되지 않은 Spring 프로젝트는 jar로 빌드한다.

    ˙ Web Page(JSP)가 포함된 spring 프로젝트는 war로 빌드한다.

        - 만약, jsp 파일 등이 포함된 프로젝트를 jar 빌드 후 페이지 요청하면, 404 에러가 발생하고  Web Page가 열리지 않는다.

반응형

+ Recent posts