2025년 7월 30일 수요일

[springboot]실제 JWT 발급 및 검증 구현

실제 JWT 발급 및 검증 구현

이전 단계에서 만든 임시 토큰을 실제 암호화된 JWT(JSON Web Token)로 대체하고, Spring Security 필터를 통해 API 요청을 보호하는 방법을 구현합니다.

Part 1: 백엔드 (Spring Boot) JWT 로직 구현

1단계: JWT Secret Key 설정

[수정] JWT 라이브러리의 보안 요구사항(256비트 이상)을 만족하는 더 길고 안전한 Secret Key 예시로 변경합니다.

backend/src/main/resources/application.properties 파일에 아래 내용을 추가합니다.

# JWT Secret Key 설정
# 256비트 이상의 길이를 가진 Base64 인코딩된 문자열이어야 합니다.
# 아래는 예시이며, 실제 운영 환경에서는 openssl rand -base64 32 명령 등으로 생성한 키를 사용하세요.
jwt.secret=256비트보타작은키는 오류

2단계: JWT 유틸리티 클래스 생성

JwtUtil.java

package dev.nerobong2.openehr.open_ehr.backend.jwt;
// ... (이전과 동일한 코드)

3단계: AuthService 수정

AuthService.java

package dev.nerobong2.openehr.open_ehr.backend.auth;

import dev.nerobong2.openehr.open_ehr.backend.jwt.JwtUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class AuthService {

    private final AuthenticationManager authenticationManager;
    private final JwtUtil jwtUtil;

    public String login(String username, String password) {
        // Spring Security를 통해 인증 시도
        Authentication authentication = authenticationManager.authenticate(
            new UsernamePasswordAuthenticationToken(username, password)
        );

        // 인증 성공 시 UserDetails 객체를 가져와 JWT 생성
        UserDetails userDetails = (UserDetails) authentication.getPrincipal();
        return jwtUtil.generateToken(userDetails);
    }
}

4단계: JWT 인증 필터 생성

JwtAuthFilter.java

package dev.nerobong2.openehr.open_ehr.backend.jwt;
// ... (이전과 동일한 코드)

5단계: SecurityConfig와 ApplicationConfig 분리

ApplicationConfig.java

package dev.nerobong2.openehr.open_ehr.backend.config;

import dev.nerobong2.openehr.open_ehr.backend.user.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.util.ArrayList;

@Configuration
@RequiredArgsConstructor
public class ApplicationConfig {

    private final UserRepository userRepository;

    @Bean
    public UserDetailsService userDetailsService() {
        return username -> userRepository.findByUsername(username)
                .map(user -> new org.springframework.security.core.userdetails.User(
                        user.getUsername(),
                        user.getPassword(),
                        new ArrayList<>()))
                .orElseThrow(() -> new UsernameNotFoundException("User not found: " + username));
    }

    @Bean
    public AuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService());
        authProvider.setPasswordEncoder(passwordEncoder());
        return authProvider;
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
        return config.getAuthenticationManager();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

SecurityConfig.java

package dev.nerobong2.openehr.open_ehr.backend.config;

import dev.nerobong2.openehr.open_ehr.backend.jwt.JwtAuthFilter;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    private final JwtAuthFilter jwtAuthFilter;
    private final AuthenticationProvider authenticationProvider;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable())
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/auth/**").permitAll()
                .anyRequest().authenticated()
            )
            .authenticationProvider(authenticationProvider)
            .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }
}

6단계: 인증 테스트용 API 생성

TestController.java

package dev.nerobong2.openehr.open_ehr.backend.test;
// ... (이전과 동일한 코드)

Part 2: 프론트엔드 (Vue) JWT 연동 및 테스트

(이전과 동일)

1단계: 상태 관리 (Pinia) 설정

frontend/src/stores/auth.ts

// ... (이전과 동일한 코드)

2단계: 인증된 API 호출 테스트

frontend/src/views/HomeView.vue

<script setup lang="ts">
// ... (이전과 동일한 코드)
</script>

<template>
  <main>
    <h1>메인 페이지</h1>
    <p>로그인에 성공했습니다.</p>
    <hr />
    <p><strong>{{ message }}</strong></p>
  </main>
</template>

다음 단계: 이제 백엔드 서버를 재시작하시면 오류 없이 정상적으로 실행될 것입니다. 그 후 다시 로그인을 테스트해 보세요.

2025년 7월 29일 화요일

[springboot]JWT 로그인 인증 구현 가이드

JWT 로그인 인증 구현 가이드

이 가이드에서는 Spring Boot와 Vue.js를 사용하여 JWT(JSON Web Token) 기반의 로그인 인증 시스템을 구축하는 전체 과정을 안내합니다.

Part 1: 백엔드 (Spring Boot) 설정

가장 먼저 백엔드에서 사용자 인증을 처리하고 JWT를 발급하는 API를 만듭니다.

1단계: 의존성 추가

(이전과 동일)

// build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
    runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
    runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
    // ...
}

2단계: User Entity 및 Repository 생성

(이전과 동일)

User.java

package dev.nerobong2.openehr.open_ehr.backend.user;
// ... (Lombok, JPA 어노테이션 등)
public class User {
    // ... id, username, password 필드 ...
}

UserRepository.java

package dev.nerobong2.openehr.open_ehr.backend.user;
// ...
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
}

3단계: Spring Security 설정 (단순 버전으로 복원)

403 오류의 원인을 명확히 하기 위해, 가장 단순한 초기 버전으로 설정을 되돌립니다.

SecurityConfig.java

// [수정] 403 오류 원인 파악을 위해 가장 단순한 버전으로 복원합니다.
package dev.nerobong2.openehr.open_ehr.backend.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable()) // CSRF 보호 비활성화
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 세션 사용 안 함
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/auth/**").permitAll() // 로그인/회원가입 API는 모두 허용
                .anyRequest().authenticated() // 나머지 요청은 인증 필요
            );
        return http.build();
    }
}

4단계: 로그인 API 생성 (단순 버전으로 복원)

AuthService에서 직접 PasswordEncoder를 사용하여 비밀번호를 비교하는 초기 방식으로 되돌립니다.

AuthService.java

// [수정] PasswordEncoder를 직접 사용하는 단순 버전으로 복원합니다.
package dev.nerobong2.openehr.open_ehr.backend.auth;

import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import dev.nerobong2.openehr.open_ehr.backend.user.User;
import dev.nerobong2.openehr.open_ehr.backend.user.UserRepository;
import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class AuthService {

    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;

    public String login(String username, String password) {
        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다."));

        // 입력된 비밀번호와 DB의 암호화된 비밀번호를 비교
        if (!passwordEncoder.matches(password, user.getPassword())) {
            throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
        }

        // 로그인 성공 시 임시 토큰 반환
        return "temp-jwt-token-for-" + user.getUsername();
    }
}

AuthController.java (변경 없음)

// ...
public class AuthController {
    // ...
    @PostMapping("/login")
    public String login(@RequestBody LoginRequestDto requestDto) {
        return authService.login(requestDto.username(), requestDto.password());
    }
}
record LoginRequestDto(String username, String password) {}

5단계: 올바른 테스트 데이터 생성 (매우 중요!)

“비밀번호가 일치하지 않습니다” 오류는 DB에 저장된 암호화된 비밀번호가 잘못되었기 때문입니다. 아래 방법으로 올바른 암호화 비밀번호를 직접 생성하여 DB에 넣으세요.

  1. 메인 애플리케이션 파일(OpenEhrBackendApplication.java)을 열고, 기존 클래스 내부에 임시로 아래 코드를 추가합니다. 이 코드는 서버가 시작될 때 비밀번호 '1234’를 암호화하여 콘솔에 출력해 줍니다.

    OpenEhrBackendApplication.java

    package dev.nerobong2.openehr.open_ehr.backend;
    
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.security.crypto.password.PasswordEncoder;
    
    @SpringBootApplication
    public class OpenEhrBackendApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OpenEhrBackendApplication.class, args);
        }
    
        // [추가] 비밀번호 암호화를 위해 이 Bean을 기존 클래스 내부에 임시로 추가합니다.
        @Bean
        public CommandLineRunner commandLineRunner(PasswordEncoder passwordEncoder) {
            return args -> {
                String encodedPassword = passwordEncoder.encode("1234");
                System.out.println("####################################################");
                System.out.println("Encoded password for '1234': " + encodedPassword);
                System.out.println("####################################################");
            };
        }
    }
    
    
  2. 백엔드 서버를 재시작합니다.

  3. 터미널(콘솔)에 아래와 같이 암호화된 비밀번호가 출력됩니다.

    ####################################################
    Encoded password for '1234': $2a$10$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    ####################################################
    
    
  4. 콘솔에 출력된 $2a$10$...로 시작하는 전체 문자열을 복사합니다.

  5. DBeaver에서 아래 SQL을 실행하여 password 컬럼에 복사한 값을 붙여넣고 사용자를 생성합니다.

    -- 기존 데이터 삭제
    DELETE FROM users WHERE username = 'testuser';
    
    -- 새로 생성된 암호화 값으로 INSERT
    INSERT INTO users (username, password, employee_number, company_code)
    VALUES ('testuser', '콘솔에서 복사한 암호화된 비밀번호 붙여넣기', '12345', 'COMP01');
    
    COMMIT;
    
    
  6. 테스트 데이터 생성이 끝나면, OpenEhrBackendApplication.java에 추가했던 CommandLineRunner 코드는 다시 삭제해도 됩니다.

Part 2: 프론트엔드 (Vue) 설정

(이전과 동일)

다음 단계: 이제 백엔드 서버를 재시작하고, 프론트엔드에서 아이디 testuser, 비밀번호 1234로 다시 로그인을 시도해 보세요. 이제는 403 오류 없이 정상적으로 로그인되어 메인 페이지로 이동할 것입니다.## JWT 로그인 인증 구현 가이드

이 가이드에서는 Spring Boot와 Vue.js를 사용하여 JWT(JSON Web Token) 기반의 로그인 인증 시스템을 구축하는 전체 과정을 안내합니다.

Part 1: 백엔드 (Spring Boot) 설정

가장 먼저 백엔드에서 사용자 인증을 처리하고 JWT를 발급하는 API를 만듭니다.

1단계: 의존성 추가

(이전과 동일)

// build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
    runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
    runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
    // ...
}

2단계: User Entity 및 Repository 생성

(이전과 동일)

User.java

package dev.nerobong2.openehr.open_ehr.backend.user;
// ... (Lombok, JPA 어노테이션 등)
public class User {
    // ... id, username, password 필드 ...
}

UserRepository.java

package dev.nerobong2.openehr.open_ehr.backend.user;
// ...
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
}

3단계: Spring Security 설정 (단순 버전으로 복원)

403 오류의 원인을 명확히 하기 위해, 가장 단순한 초기 버전으로 설정을 되돌립니다.

SecurityConfig.java

// [수정] 403 오류 원인 파악을 위해 가장 단순한 버전으로 복원합니다.
package dev.nerobong2.openehr.open_ehr.backend.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable()) // CSRF 보호 비활성화
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 세션 사용 안 함
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/auth/**").permitAll() // 로그인/회원가입 API는 모두 허용
                .anyRequest().authenticated() // 나머지 요청은 인증 필요
            );
        return http.build();
    }
}

4단계: 로그인 API 생성 (단순 버전으로 복원)

AuthService에서 직접 PasswordEncoder를 사용하여 비밀번호를 비교하는 초기 방식으로 되돌립니다.

AuthService.java

// [수정] PasswordEncoder를 직접 사용하는 단순 버전으로 복원합니다.
package dev.nerobong2.openehr.open_ehr.backend.auth;

import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import dev.nerobong2.openehr.open_ehr.backend.user.User;
import dev.nerobong2.openehr.open_ehr.backend.user.UserRepository;
import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class AuthService {

    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;

    public String login(String username, String password) {
        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다."));

        // 입력된 비밀번호와 DB의 암호화된 비밀번호를 비교
        if (!passwordEncoder.matches(password, user.getPassword())) {
            throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
        }

        // 로그인 성공 시 임시 토큰 반환
        return "temp-jwt-token-for-" + user.getUsername();
    }
}

AuthController.java (변경 없음)

// ...
public class AuthController {
    // ...
    @PostMapping("/login")
    public String login(@RequestBody LoginRequestDto requestDto) {
        return authService.login(requestDto.username(), requestDto.password());
    }
}
record LoginRequestDto(String username, String password) {}

5단계: 올바른 테스트 데이터 생성 (매우 중요!)

“비밀번호가 일치하지 않습니다” 오류는 DB에 저장된 암호화된 비밀번호가 잘못되었기 때문입니다. 아래 방법으로 올바른 암호화 비밀번호를 직접 생성하여 DB에 넣으세요.

  1. 메인 애플리케이션 파일(OpenEhrBackendApplication.java)을 열고, 기존 클래스 내부에 임시로 아래 코드를 추가합니다. 이 코드는 서버가 시작될 때 비밀번호 '1234’를 암호화하여 콘솔에 출력해 줍니다.

    OpenEhrBackendApplication.java

    package dev.nerobong2.openehr.open_ehr.backend;
    
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.security.crypto.password.PasswordEncoder;
    
    @SpringBootApplication
    public class OpenEhrBackendApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OpenEhrBackendApplication.class, args);
        }
    
        // [추가] 비밀번호 암호화를 위해 이 Bean을 기존 클래스 내부에 임시로 추가합니다.
        @Bean
        public CommandLineRunner commandLineRunner(PasswordEncoder passwordEncoder) {
            return args -> {
                String encodedPassword = passwordEncoder.encode("1234");
                System.out.println("####################################################");
                System.out.println("Encoded password for '1234': " + encodedPassword);
                System.out.println("####################################################");
            };
        }
    }
    
    
  2. 백엔드 서버를 재시작합니다.

  3. 터미널(콘솔)에 아래와 같이 암호화된 비밀번호가 출력됩니다.

    ####################################################
    Encoded password for '1234': $2a$10$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    ####################################################
    
    
  4. 콘솔에 출력된 $2a$10$...로 시작하는 전체 문자열을 복사합니다.

  5. DBeaver에서 아래 SQL을 실행하여 password 컬럼에 복사한 값을 붙여넣고 사용자를 생성합니다.

    -- 기존 데이터 삭제
    DELETE FROM users WHERE username = 'testuser';
    
    -- 새로 생성된 암호화 값으로 INSERT
    INSERT INTO users (username, password, employee_number, company_code)
    VALUES ('testuser', '콘솔에서 복사한 암호화된 비밀번호 붙여넣기', '12345', 'COMP01');
    
    COMMIT;
    
    
  6. 테스트 데이터 생성이 끝나면, OpenEhrBackendApplication.java에 추가했던 CommandLineRunner 코드는 다시 삭제해도 됩니다.

Part 2: 프론트엔드 (Vue) 설정

(이전과 동일)

다음 단계: 이제 백엔드 서버를 재시작하고, 프론트엔드에서 아이디 testuser, 비밀번호 1234로 다시 로그인을 시도해 보세요. 이제는 403 오류 없이 정상적으로 로그인되어 메인 페이지로 이동할 것입니다.

2024년 10월 25일 금요일

[oracle]백업및 복구

[oracle]백업및 복구

오라클 덤프 백업및 복구

윈도우 서버 기반 간단 정리

--디렉터리 조회

sqlplus 또는 dbtool 입력시작

SELECT * FROM DBA_DIRECTORIES ;

--D:\DEV\DATABASE\ORACLE21C\ADMIN\XE\DPDUMP 경로에 작업할 dpump_dir1 디렉토리 생성 

CREATE DIRECTORY dpump_dir1 AS 'D:\DEV\DATABASE\ORACLE21C\ADMIN\XE\DPDUMP';

--dpump_dir1 디렉토리레 권한을 system 계정에 부여

GRANT READ, WRITE ON DIRECTORY dpump_dir1 TO system;

--시스템 계정의 비밀번호가 없다면 생성

ALTER USER system IDENTIFIED BY 1234;

sqlplus 또는 dbtool 입력 끝


cmd 입력 시작

-- cmd 창을 열어 dmp 생성

expdp c##nerobong2/1234@xe SCHEMAS=C##NEROBONG2 DIRECTORY=dpump_dir1 DUMPFILE=schema_backup2.dmp LOGFILE=schema_backup.log

--전체복원

impdp c##nerobong2/1234@xe FULL=Y DIRECTORY=dpump_dir1 DUMPFILE=schema_backup2.dmp LOGFILE=full_restore.log

--스키마 복원

impdp c##nerobong2/1234@xe SCHEMAS=C##NEROBONG2 DIRECTORY=dpump_dir1 DUMPFILE=schema_backup2.dmp LOGFILE=schema_restore.log

--테이블 복원
impdp c##nerobong2/1234@xe TABLES=C##NEROBONG2.SALE DIRECTORY=dpump_dir1 DUMPFILE=schema_backup2.dmp LOGFILE=table_restore.log


cmd 입력 끝

2024년 7월 30일 화요일

[lunux]리눅스 폴더별 용량 확인

리눅스 폴더별 용량 확인

조회 하고자 하는 디렉토리 리스트가있는 경로로 이동후

du -h --max-depth=1

[oracle]오라클 오류 조회

ORACLE DB 오류 조회

ORACLE 내부 오류 조회 관련 명령어

select name, value from v$diag_info;

SELECT * FROM DBA_ERRORS WHERE NAME = 'DB오브젝트명';

SELECT * FROM USER_ERRORS WHERE NAME = '%DB오브젝트명%';

[linux]특정 문자열을 포함한 파일을 찾기

리눅스 특정 문자열을 포함한 파일리스트 출력

레드햇 엔터프라이즈 환경

–exclude=*.{확장자,확장자} 를 통해 검색 하는 파일을 제외 시킬수 있다.

grep --exclude=*.{bin,bak} -inr '찾는문자열' 디렉토리경로

2024년 5월 1일 수요일

[oracle]ORACLE DB 전체 용량 확인

ORACLE DB 전체 용량 확인


-- ★★★★★ ORACLE DB 전체 용량 확인 : DBA_DATA_FILES  ★★★★★

SELECT SUM(bytes) FROM DBA_DATA_FILES;
SELECT SUM(bytes)/1024/1024/1024||'GB' FROM DBA_DATA_FILES;

-- ★★★★★ ORACLE DB 전체 사용량 확인 : DBA_SEGMENTS  ★★★★★

SELECT SUM(bytes) FROM DBA_SEGMENTS;
SELECT SUM(bytes)/1024/1024/1024||'GB' FROM DBA_SEGMENTS;

-- ★★★★★ ORACLE DB 전체 여유량 확인 : DBA_FREE_SPACE  ★★★★★

SELECT SUM(bytes) FROM DBA_FREE_SPACE;
SELECT SUM(bytes)/1024/1024/1024||'GB' FROM DBA_FREE_SPACE;

[springboot]실제 JWT 발급 및 검증 구현

실제 JWT 발급 및 검증 구현 이전 단계에서 만든 임시 토큰을 실제 암호화된 JWT(JSON Web Token)로 대체하고, Spring Security 필터를 통해 API 요청을 보호하는 방법을 구현합니다. Part 1: 백엔드 (Spring ...