풀이

모든 경우의 수를 다 해보면 되는 문제.

코드

#include <iostream>
#include <set>
#include <vector>

using namespace std;

char table[5][5];
set<string> s;

void input() {
  for(int i=0;i<5;++i) {
    for(int j=0;j<5;++j) {
      cin >> table[i][j];
    }
  }
}

bool rangeCheck(int nx, int ny) {
  return 0 <= nx && nx < 5 && 0 <= ny && ny < 5;
}

vector<char> temp;
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
void dfs(int y, int x) {
  if(temp.size() == 6) {
    string make = "";
    for(int i=0;i<temp.size(); ++i) {
      make += temp[i];
    }
    s.insert(make);
    return;
  }

  for(int k=0;k<4;++k) {
    int nx = x + dx[k];
    int ny = y + dy[k];
    if(rangeCheck(nx, ny)) {
      temp.push_back(table[ny][nx]);
      dfs(ny, nx);
      temp.pop_back();
    }
  }
}

void processing() {
  for(int i=0;i<5;++i) {
    for(int j=0;j<5;++j) {
      temp.push_back(table[i][j]);
      dfs(i, j);
      temp.pop_back();
    }
  }

  cout << s.size();
}

int main() {
  input();
  processing();
}

'알고리즘' 카테고리의 다른 글

백준 4902 삼각형의 값 c++  (0) 2020.09.17
백준 2916 자와 각도기 c++  (0) 2020.09.15
백준 2933 미네랄 C++ 풀이  (0) 2020.09.12
백준 2776 CPP, js  (0) 2020.09.04
[javascript] b1072.js  (0) 2020.09.03

개요

user 로그인 상태를 관리하기 위해 안전한 방법으로 Server에서 Client에게 쿠키로 sessionID를 발급해주고 이 쿠키를 통해 Server에 접속하면 sessionID값을 활용해 어떤 Client인지 식별하고 관련 정보를 제공하는 방법을 사용한다. 관련 기능을 쉽게 사용할 수 있게 해주는 express-session 모듈을 사용해 보자.

관련 그림

1. express-session 등록

const session = require('express-session');

app.use(session({
 secret: 'mySecretKey!@#$',
 resave: false,
 saveUninitialized: true
}));

express-session을 미들웨어로 등록한다. sessionID를 발급할 때 username이나 password같은 정보만으로 만들어 발급한다면 외부에서 이 정보를 알아낼 가능성이 있다. 이는 심각한 보안사고이다. 그래서 추가적으로 secret키를 sessionID 생성에 참고해서 이 sessionID를 역으로 해석해서 원래 정보를 알아내기 힘들도록 한다.

이렇게 등록을 하면 Server에 접속했을 때

와 같은 sessionid가 발급된다.

2. Login

로그인을 구현하기 위해서 Client에서 ID와 Password가 Server에 오면 이를 user database에 있는 user정보와 비교해서 제대로 된 유저인지 확인한다. 만약 제대로 된 user라면 sessionId를 발급해주면 된다.

router.post('/login_process', (req, res) => {
  const userData = fs.readFileSync(`${__dirname}/../data/user.json`, (e) => {if(e) console.log(e)});
  let loginSuccess = false;
  let userID;
  JSON.parse(userData.toString()).users.some(x => {
    if(x.id == req.body.id && x.password && req.body.password) {
      loginSuccess = true;
      userID = x.id;
      return true;
    }  
  });

  if(loginSuccess) {
    console.log("로그인 성공!");
    req.session.sessionID = userID;
  } else {
    console.log("로그인 실패");
  }
  res.redirect('/');
})

login이 성공하면 req.session에 원하는 property에 원하는 정보를 담아 보낸다. 위 코드는 userID를 담아 어떤 user가 접속했는지 확인할 수 있도록 했다.

3. sessionID로 Server에서 어떤 Client인지 식별

client에게 고유한 sessionID가 발급되었기 때문에 이 sessionID값으로 Server에 접근하면 서버는 지금 접근한 게 누군지 알 수 있다.

router.get('/rightLoginCheck', (req, res) => {
  if(req.session.sessionID) {
    console.log(req.session.sessionID, "가 접속했습니다");
  } else {
    console.log("잘못된 유저");
  }
  res.redirect("/");
})

4. session삭제, 로그아웃 기능 구현

로그아웃은 Client가 가지고 있는 sessionid쿠키를 삭제하는 것과 server에서 유지하고 있는 session값을 지워주는 것으로 구현할 수 있다.

router.get('/logout_process', (req, res) => {
  if(req.session.sessionID) {

    console.log(`${req.session.sessionID}가 로그아웃했습니다.`);
    req.session.destroy((err) => {
      if(err) {
        console.log(err);
      }
    })
  }

  res.redirect('/');
})

참고

https://velopert.com/406

'웹 프로그래밍 > node.js' 카테고리의 다른 글

Express 미들웨어 매우 간단한 개념  (0) 2020.09.03
Express 구조  (0) 2020.08.31

개요

데이터베이스를 외부에(AWS나 NCP, 혹은 다른 PC나 가상환경 등등) 두고 그 곳에 접속하는 환경을 만들 때 고려해야 할 것들을 정리했다.

고려해야할 4가지 그림

1. 접속 가능 포트 설정

먼저 외부 서비스에 접속하기 위해서 Mysql로 접속하기 위한 포트를 포트포워딩 해주어야 한다. NCP에서는 ACG 규칙에 추가해주는 것으로 설정이 가능하다.

2. Mysql에 접속 가능한 IP주소

Mysql에 접속가능한 IP주소는 default로 localhost로 지정되어 있다. 이를 수정하기위해 다음과 같은 경로에 있는 파일을 열어서 bind-address를 localhost에서 0.0.0.0(전역) 으로 수정해주거나 접근가능하게 하고싶은 IP주소를 입력해서 외부에서 접속 가능하게 할 수 있다.

/etc/mysql/mysql.conf.d/mysqld.cnf

  • 위 사진 맨 아래의 bind-address의 값이 초기에 127.0.0.1로 되어있다. 이 것을 원하는대로 바꾸면 된다.

3. user에 접속가능한 IP주소 설정

위 그림을 예로 들면 userA에 접근가능한 IP주소는 127.0.0.1인데 2.2.2.2인 IP에서 접근을 시도해서 user에 로그인 할 수 없다. 로그인 하고싶은 IP에 접속 가능하도록 추가해준다.

CREATE USER ‘userA’@’%’ IDENTIFIED BY ‘user_password’;

4. 접근 가능한 database인지 확인

user가 접근하고자 하는 database의 접근권한이 없으면 접근할 수 없다. 아래와 같은 명령어를 통해 접근 권한을 부여하자.

grant all privileges on 'DB 이름'.'Table 이름' to ‘root’@‘%’ identified by ‘root의 패스워드’

'웹 프로그래밍' 카테고리의 다른 글

데이터베이스 MYSQL 실습  (0) 2017.12.28
데이터베이스 MYSQL 이론  (0) 2017.12.23
PHP 실습  (0) 2017.12.22
JavaScript 실습  (0) 2017.12.21
JavaScript 실습  (0) 2017.12.20

+ Recent posts