반응형

1. 시험환경

    ˙ Chat GPT (Open AI) 서비스

 

2. 목적

    ˙ AI 앱 개발을 위해 Chat GPT를 연동할 경우 사전 준비사항으로 API 키 발급 받는 절차를 알아보자.

 

3. 적용

    ① Open AI 사이트에 접속하여 계정생성 및 로그인한다.

        - URL : https://openai.com/

 

OpenAI

Introducing Sora: Creating video from text

openai.com

 

    ② 로그인 후 나타나는 첫 화면에서 "API" 메뉴를 클릭한다.

 

    ③ 좌측 아이콘에서 [API keys] 메뉴를 클릭한다.

 

    ④ "Create new secret key" 버튼을 클릭하여 서비스별 API 키를 발급한다.

 


 

    ⑤ "Settings" → "Billing" → "Add payment details" 버튼을 클릭하여 결재카드를 등록한다.

        - 발급받은 Key를 사용하기 위해 결재방법 등록 및 과금 결재(선불)해야 한다.

 

    ⑥ 선불 결재 결과를 확인한다 (10% tax는 별도 부과된다)

 

4. 결과

    ˙ API 연동 예제 프로그램(python)을 작성하여 테스트하면 응답 결과를 확인할 수 있다.

        - 라이브러리 설치 : pip install langchain langchain-openai tiktoken

        - 샘프코드 작성

1
2
3
4
5
6
7
8
9
10
import os
os.environ['OPENAI_API_KEY'= '발급받은 OpenAI API Key'
 
from langchain_openai import ChatOpenAI
 
# model
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
 
# chain
llm.invoke("태양계 행성의 종류는?")
cs

 

        - 결과확인

 

반응형
반응형

1. 시험환경

    ˙ Amazon Linux

    ˙ terraform(테라폼)

 

2. 목적

    ˙ Amazon 리눅스 환경에서 terraform을 설치한다.

 

3. 적용

    ① 테라폼(terraform) 공식 사이트에서 운영체제별 설치 가이드를 확인할 수 있다.

        - URL : https://developer.hashicorp.com/terraform/install

 

Install | Terraform | HashiCorp Developer

Explore Terraform product documentation, tutorials, and examples.

developer.hashicorp.com

 

    ② 운영체제별 설치 가이드를 확인한다.

 

    ③ 설치 명령어 실행한다.

        - 여기에서 Amazon Linux 환경에 설치한다.

        $ sudo  yum  install  -y  yum-utils  shadow-utils

        $ sudo  yum-config-manager  --add-repo  https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo

        $ sudo  yum  -y  install  terraform

 

4. 결과

    ˙ 설치가 완료되면 설치경로 및 버전을 확인한다.

        - $ which terraform

        - $ terraform version

반응형
반응형

1. 시험환경

    ˙ ubuntu v20.04

    ˙ terraform(테라폼)

 

2. 목적

    ˙ ubuntu 리눅스 환경에서 terraform을 설치한다.

 

3. 적용

    ① 테라폼(terraform) 공식 사이트에서 운영체제별 설치 가이드를 확인할 수 있다.

        - URL : https://developer.hashicorp.com/terraform/downloads

 

Install | Terraform | HashiCorp Developer

Explore Terraform product documentation, tutorials, and examples.

developer.hashicorp.com

 

    ② 설치 명령어를 copy한다.

        - 여기에서 ubuntu 환경에 설치한다.

install-terraform.sh
0.00MB

1
2
3
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
cs

 

4. 결과

    ˙ 설치가 완료되면 설치경로 및 버전을 확인한다.

        - $ which terraform

        - $ terraform version

 

반응형
반응형

1. 시험환경

    ˙ Node.js 20.11.1 LTS

    ˙ 윈도우

 

2. 목적

    ˙ node.js를 윈도우 환경에서 설치한다.

    ˙ node.js를 설치 시, 자동설치 되는 npm을 확인한다.

 

3. 적용

    ① node JS 공식 웹사이트에서 설치 파일을 다운 받는다.

        - URL : http://nodejs.org 

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

 

    ② 특별한 경우가 아니라면 LTS("안정화 버전")을 다운로드 받는다.

        - 2024년 3월 기준 안정화 버전은 20.11.1 LTS이다.

        - Release Schedule을 확인하여 지원종료가 되는 버전은 피하자.

 

 

    ③ 다운 받은 파일을 확인하고 실행한다.

 

    ④ Next 버튼을 클릭하며 설치 절차를 진행한다.

설치과정 5
설치과정 6
설치과정 7
설치과정 8

 

4. 결과

    ˙ npm -v 명령어를 실행하여 설치 버전을 확인한다.

    ˙ node -v 명령어를 실행하여 설치 버전을 확인한다.

 

반응형
반응형

1. 쿠키

    ˙ 사용자가 특정 웹 사이트에 접속할 때, 사용자의 컴퓨터에 저장하는 기록 파일

    ˙ ex) 로그인 시 ID와 PW 저장을 체크한 후 사이트 재접속 시 ID/PW를 기억하는 기능

 

2. 세션

    ˙ 서버에서 가지고 있는 객체(Object)로써, 특정 사용자의 로그인 정보를 유지하기 위해 사용하는 기술
    ˙  서버는 접속한 클라이언트에게 세션ID와 회원정보를 매핑하여 기록하고 Session ID를 부여하면,
    ˙  사용자는 접속할 때마다 발급받은 Session ID와 함께 요청(Request)한다.
    ˙  ex) 웹 사이트 로그인 후 다른 페이지 이동마다 접속 상태 유지하는 역할

 

    ① 장점

        - 개인정보가 포함되지 않은 세션ID(회원 식별 목적)를 사용자에게 제공하고, 회원 중요정보는 서버가 갖고 있음.

 

    ② 단점

        - 악의적인 공격자가 세션 ID를 탈취할 수 있음.

        - 웹 서버에서 세션 정보를 기록하고 있어야 하므로, 접속자가 많을 때 서버 메모리 부하 문제가 발생할 수 있음.

 

3. 세션과 쿠키의 관계

 

 

    ˙ 세션 ID는 일반적으로 쿠키에 저장되며, 세션 쿠키라고도 불린다.  

    ˙ 브라우저는 이 세션 쿠키를 갖고 있으면서 서버와의 상호 작용을 통해 세션 상태를 유지한다.

    ˙ 주로 사용되는 쿠키 타입은 HttpOnly 속성이 설정된 쿠키이며, JavaScript에서 쿠키에 접근하는 것을 방지하여 보안을 강화할 수 있다.
    ˙ SpringBoot에서도 세션 관리를 위한 설정이 가능하며, 세션 ID를 쿠키에 저장/유지하는 방식을 선택할 수 있다.

반응형
반응형

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

 

 

반응형

+ Recent posts