반응형

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. 시험환경

    ˙ 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. 시험환경

    ˙ 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가 열리지 않는다.

반응형
반응형

1. 시험환경

    ˙ IntelliJ

    ˙ Springboot 프로젝트

    ˙ Gradle, Maven

 

2. 목적

    ˙ SpringBoot 프로젝트 생성시 JSP view는 별도의 설정 과정이 필요하다.

    ˙ Gradle 또는 Maven에 JSP view 관련 의존성 패키지 설치 방법을 알아보자.

    ˙ SpringBoot 프로젝트에서 JSP view 설정하는 방법을 알아보자.

    ˙ 테스트를 위한 JSP 파일을 작성하고 URL 요청시 JSP 파일이 열리는지 확인한다.

 

3. 적용

    ① 최소한의 의존성 패키지로 Springboot 프로젝트를 생성하였다.

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

 

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

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

languagestory.tistory.com

 

    ② JSP View 설정을 위한 의존성 패키지를 추가한다.

        - gradle : src/build.gradle

1
2
3
4
dependencies {
    implementation 'javax.servlet:jstl'
    implementation "org.apache.tomcat.embed:tomcat-embed-jasper"
}
cs

 

        - maven : src/pom.xml

1
2
3
4
5
6
7
8
<dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>jstl</artifactId>
</dependency>
<dependency>
       <groupId>org.apache.tomcat.embed</groupId>
       <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
cs

 

    ③ application.properties 또는 application.yml 파일에 JSP prefix 및 suffix를 추가한다.

        - 경로 : src/main/resources/application.properties

 

        - 경로 : src/main/resources/application.yml (properties 파일 대신 yml 파일을 많이 쓰는 추세이다)

 

 

    ④ application.properties 파일에 설정한 경로(prefix)에 테스트를 위한 JSP 파일을 생성한다.

        - 경로 : src/main/webapp/WEB-INF/views

 

    ⑤ JSP 화면 호출을 위한 Controller를 작성한다.

 

4. 결과

    ˙ URL 페이지를 요청하여 JSP 화면 호출 결과를 확인한다.

 

반응형
반응형

1. 시험환경

    ˙ Window

    ˙ Spring Initializr

    ˙ Gradle

    ˙ IntelliJ Community

 

2. 목적

    ˙ Spring Initializer를 이용하여 Spring Boot 프로젝트 패키지를 구성한다.

    ˙ Spring Initializer를 이용하여 구성된 패키지를 IntelliJ에 임포트(import)하여 시작한다.

 

3. 적용

    ① Spring Initializer 사이트에 접속한다.

       - URL : https://start.spring.io/

 

    ② 최소한의 의존성 패키지 구성으로 Spring Boot 프로젝트를 생성한다.

        - "GENERATE" 버튼을 클릭하여 프로젝트 압축파일을 다운로드 받는다.

 

    ③ 다운받은 압축파일을 workspace(프로젝트 작업공간)에서 압축해제한다.

template.zip
0.06MB

 

    ④ IntelliJ에서 template 폴더를 임포트(import) 하면 자동으로 빌드(build) 작업이 진행된다.

        - build.gradle에 추가된 Dependency는 다음과 같다.

1
2
3
4
5
6
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
cs

 

    ⑤ 테스트를 위한 Controller를 작성한다.

        - 패키지 : com.boot.template.controller

        - 테스트용 컨트롤러 : com.boot.template.controller.TestController.java

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.boot.template.controller;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class TestController {
 
    @GetMapping("/test")
    public String test() {
        System.out.println("test...");
        return "Hello World";
    }
}
 
cs

 

 

    Main()에서 프로젝트를 실행한다.

 

4. 결과

    ˙ SpringBoot 실행 결과를 확인한다.

반응형
반응형

1. 시험환경

    ˙ SpringBoot

    ˙ IntelliJ

 

2. 목적

    ˙ 개발/스테이징/배포 등 배포 환경에 따라 application.yaml 파일을 설정한다.

    ˙ 개발/스테이징/배포 등 배포 환경에 작성한 application.yaml 파일을 적용한다.

 

3. 적용

    local 환경을 설정한다.

        - 파일명 : application-local.yaml

        - ex) mariadb와 연결 설정

1
2
3
4
5
6
spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3307/sample?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul
    username: root
    password: 1q2w3e4r
cs

 

    prd 환경을 설정한다.

        - 파일명 : application-prd.yaml

        - ex) mariadb와 연결 설정

1
2
3
4
5
6
spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://13.234.08.2:3306/location_review?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul
    username: root
    password: 1q2w3e4r
cs

 

    application.yaml에서 적용할 프로파일을 설정한다.

        - postfix(local 또는 prd) 설정

1
2
3
spring:
  profiles:
    active: prd
cs

 

4. 결과

    ˙ spring.profiles.active "local" 설정 후 Application 실행

 

    ˙ spring.profiles.active "prd" 설정 후 Application 실행

 

반응형

+ Recent posts