LogIn 의미

 

컴퓨터 보안에서 로그인(login: 등록가입)과 로그아웃(logout)은 접근 허가 증명을 얻기 위해 사용자 인증으로 개인이 컴퓨터 시스템에 접근하는 작업을 말한다. 컴퓨터 보안에서 중요한 역할을 담당한다. 사용자 자격 증명은 일반적으로 사용자 이름과 그에 일치하는 비밀번호 형태를 이루며 이를 기반으로 사용자는 접근을 얻기 위해 시스템에 로그인할 수 있으며 더 이상 필요하지 않을 때 로그아웃할 수 있다.

 


 

로그인의 기원

 

우리는 매일, 하루에도 수십 번씩 로그인을 합니다.

하지만 왜 로그인이라고 부르는지 모릅니다.

 

로그인의 뜻을 생각해보면 이상하게 들릴 수 있는 문구입니다.

온라인에서 많이 사용돼서 흔히 어떤 서비스에 자신의 계정으로 시작한다는 의미 정도로 알고 있지만,

로그인이라는 단어의 유래를 깊게 찾아본 사람은 많지 않습니다.

 

 

OED에서 "컴퓨터에 대한 온라인 엑세를 여는 것"이라는 현대적 의미의 "로그인"을 사용한 최초의 사례는 1963년 출판물인 MIT의 Compatible Time-Sharing System에서 가져온 것입니다.

이 시점이 "로그인"의 첫 번째 사용인지 확실하지 않지만 1961년에 시작된 CTSS가 틀림없이 최초의 시분할 운영 체제라면 말이 됩니다.

가장 먼저 로그인해야 하는 시스템이기도 합니다. (이전에는 일괄 처리 시스템만 있었습니다.)

 

CTSS든 비슷한 시스템이든, 1959년에서 1961년 사이에 MIT에 있는 엔지니어가 그들이 만들고 있는 시스템에 대한 새로운 사용자 명령을 설명할 필요가 있다고 생각합니다.

우리는 이러한 상황에서 많은 신조어를 얻으며, 역사상 로그인이 시작된 날은 지금 이 순간부터입니다.

 

 

시분할 시스템 이전에 '로그인'이 컴퓨터 이외의 의미로 사용되었을 가능성도 있지만, 다른 자료들에서 찾을 수 없었습니다.

그러나 물론 어떤 것 또는 누군가를 기록한다는 의미의 "로그" 부분은 컴퓨터보다 수백 년 앞서 있었습니다.

 

 

이 사용법은 OED에서 정의하는 "로그북" 또는 선박의 로그(또는 스타플릿에 있는 경우 선장 로그)에 무언가를 입력하는 것의 단축됩니다.

항해일지에서 선박의 항해 내용(일지에 표기된 선박의 진행률 포함)을 매일 입력하는 책입니다.

log-book 또는 logbook의 첫 번째 나열된 사용법은 대략 1689년부터입니다( J. Moore's  New Syst. Math ). 

250년 전으로 돌아가면서, 우리는 컴퓨터 시스템의 우리 자신을 확인하는 것에서 항해하는 배의 속도를 책에 입력하는 것으로 변했습니다.

그런데 왜 로그북이라고 불렸을까요? 칩 로그, 선박 로그, 로그 등으로 다양하게 불리는 이 장치 때문에 다음과 같습니다.

 

 

통나무 아니면 매듭(knot)이 있는 밧줄에 달린 무거운 나무 조각을 배 밖으로 던져서 정해진 시간 동안 얼마나 많은 매듭(knot)이 지나가는지, Wikipedia에서 설명하는 대로 시간을 측정합니다.

예전에는 배의 속도를 확인할 때 미리 밧줄에 매듭 표시를 한 부표를 던져놓고 일정 시간이 지난 후 그동안 몇 매듭(knot)이 지나갔다 확인합니다. 그 매듭(knot)의 수가 배의 속도였습니다.

 

 

이미지 참조 : https://en.wikipedia.org/wiki/Chip_log

 

이것이 우리가 여전히 항해 속도를 매듭으로 측정하는 이유이기도 합니다.

그래서 컴퓨터로 어떤 서비스에 접속하여 기록을 남기기 시작할 때 "Login" 한다고 말하거나, 접속을 종료할 때 "Logout"을 사용하게 되었다고 추측합니다.

하지만 일반인들이 평소에 사용하던 단어가 아니고 단어만 들었을 때 이해되지 않았습니다.

그래서 "Login"이라는 단어가 낯설게 다가와서 "Signin"으로 사용하거나,

"Logout" 대신 "Signout" 등 같은 의미지만 다른 단어들이 사용되고 있습니다.

 

 

후기

 

"Login"이라는 단어를 외래어처럼 사용했는데, 유래를 알고 나니 되게 재밌습니다.

사실 이렇게 파고든 이유는 개발에 영향이 큽니다.

예전에는 Spring을 사용하면 그냥 이름이 Spring이고 사람들이 많이 사용하니 좋은 프레임워크구나 싶어서 사용을 했는데, Spring의 유래와 프레임워크의 유래까지 찾다 보니 새로운 사실들을 많이 알게 되었고 뿐만 아니라 다른 프레임워크를 사용하지 않고 왜 Spring을 사용하는지까지 찾다보니 이렇게 한 가지에 파고드는 습관이 생겼습니다.

단순히 사람들이 사용하니깐 사용하는 것이 아닌 무언가 발명이 되었으면 발명이 된 이유가 있을 것이고, 그게 지금 나에게 왜 필요한지까지 생각해보게 되었습니다.

감사합니다.

 

참조 자료: http://www.designcult.org/2011/08/why-do-we-call-in-logging-in.html

참조 자료: https://ko.wikipedia.org/wiki/%EB%A1%9C%EA%B7%B8%EC%9D%B8

'스프링 > LOG' 카테고리의 다른 글

[LOG] log4j 보안취약점 업데이트 권고 내용  (0) 2021.12.30
Spring Cloud Config 의미

 

Spring Cloud Config는 분산 시스템에서 외부화된 구성에 대한 서버 측 미 클라이언트 측 지원을 제공합니다.

Config 서버를 사용하면 모든 환경에서 애플리케이션의 외부 속성을 중앙에서 관리할 수 있습니다.

클라이언트와 서버의 개념은 모두 Spring Environment 및 PropertySource 추상화와 동일하게 매핑되므로 Spring 응용 프로그램과 매우 잘 맞지만 모든 언어로 실행되는 응용 프로그램에서 사용할 수 있습니다.

애플리케이션이 개발에서 테스트로, 운영으로 배포 파이프라인을 통해 이동할 때 이러한 환경 간의 구성을 관리하고 마이그레이션 시 애플리케이션이 실행하는 데 필요한 모든 사항을 갖추도록 할 수 있습니다.

서버 스토리지 백엔드의 기본 구현은 git을 사용하므로 레이블링된 버전의 구성 환경을 쉽게 지원할 뿐만 아니라 컨텐츠 관리를 위한 다양한 툴링에 액세스할 수 있습니다.

대체 구현을 추가하고 Spring 구성을 통해 간편하게 연결할 수 있습니다.

 

https://cloud.spring.io/spring-cloud-config/reference/html/

 

Spring Cloud Config

Many source code repository providers (such as Github, Gitlab, Gitea, Gitee, Gogs, or Bitbucket) notify you of changes in a repository through a webhook. You can configure the webhook through the provider’s user interface as a URL and a set of events in

cloud.spring.io

 


 

이슈

 

서비스를 개발하고 운영을 하다보면 설정 값을 변경해야 하는 경우가 있다.

이 경우에 설정 값을 변경 후 빌드 후 배포하는 과정이 필요하다.

빌드 후 배포하는 과정에서 서버를 재기동해야한다.

Spring Cloud Config는 서버 재기동 없이 설정 값 변경이 가능하다.

 

인프라

 

 

Admin : 관리자 클라이언트

Main Server : Spring Cloud Config Client가 될 곳이다. 서비스 서버이다.

SCC Server : Spring Cloud Config Server이다. Repository 정보를 받아서 Client에 전달해준다.

Repository : 설정 값을 관리할 저장소이다. Git이 될 수도 있고, 로컬에서 관리할 수도 있다.

 

현재는 Admin에서 요청하면 Main Server를 거쳐서 SCC Server로 요청되고 Repository를 조회한 다음 반환된다.

 

구현 Spring Cloud Config Server

 

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cg.park</groupId>
    <artifactId>config-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-server</name>
    <description>config-server</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2020.0.4</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

 

application.yml

server:
  port: 9100 #SCC Server의 포트설정

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/qkrcksrbs8/project-config #Repository 주소.

위의 Repository 주소는 본인 로컬경로나 본인 깃주소로 사용하길 바랍니다.

 

ConfigServerApplication

package cg.park.configserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }

}

 

 

구현 Spring Cloud Config Client

 

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cg.park</groupId>
    <artifactId>config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-client</name>
    <description>config-client</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.0</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

application.yml

server:
  port: 9000
spring:
  profiles:
    active: local
  config:
    import: "configserver:http://localhost:9100" # config server url
  cloud:
    config:
      name: config # config name
      profile: local # config sub name
      label: main # branch name
management:
  endpoints:
    web:
      exposure:
        include: refresh # refresh

 

ConfigClientApplication

package cg.park.configclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }

}

 

ApiController

package cg.park.configclient.controllers;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ApiController {

    Logger logger = LoggerFactory.getLogger(this.getClass());

    @RequestMapping("/test")
    public String apiTest() {

        logger.info("### info !!!");
        logger.debug("### debug !!!");
        return "test입니다.";
    }

}

 

설명

 

서비스를 운영하다 보면 INFO 레벨로 자세한 로그 확인이 불가능하여

DEBUG로 로그레벨 변경 후 로그를 확인하는 경우가 있다.

하지만 로그레벨 변경 후 빌드를 하고 배포를 해야하기 때문에 서비스 운영에 문제가 있다.

 

Spring Cloud Config를 사용하면 빌드 후 재배포 과정없이 로그레벨 변경 가능하다.

 

Admin(관리자) 측이 설정 파일이 있는 Repository의 설정 값을 수정한다. (본인은 Git으로 했음. 로컬도 가능)

 

info 설정으로 되어있는 로그레벨을 debug로 수정.

 

Spring Cloud Config의 Refresh 기능으로 설정 값을 갱신한다.

 

PostMan을 이용하여 Refresh 사용

http://localhost:9000/actuator/refresh

 

로그레벨이 info일 때는 debug는 나오지 않음.

 

로그레벨을 debug로 바꾼 후에는 debug까지 나옴.

 

위의 과정은 서버 재기동없이 진행되었습니다.

 

깃 주소

 

Client : https://github.com/qkrcksrbs8/config-client2

Server : https://github.com/qkrcksrbs8/config-server


 

후기

 

Spring Cloud Config를 보고 처음에는 설정파일을 프로젝트로부터 분리시켜 관리를 용이하게 만든다. 라는 정보만 알고있었다.

위의 내용만으로는 굳이 지금 서비스에 적용할 이유가 없다.

하지만 현재 Spring Cloud Config 기술이 필요한 부분이 발생하여 적용하게 되었다.

위의 내용처럼 Log 레벨 변경 시 서버를 재기동하는 과정이 매우 불편했기 때문이다.

지금 예시로 보여주는 기능은 Log 레벨 변경이지만, 응용을 한다면 properties에 들어가는 모든 설정 값들을 외부파일로 분리시켜서 관리할 수 있다.

 

 

 

 

+ Recent posts