본문 바로가기

4. Node.js | React.js

5/3(수) IT K-DT(44일차) / 29.bcrypt~30.jwt

 

 

29. bcrypt

비밀번호 해싱 알고리즘 중 하나로, 보안적으로 안전한 방법으로 암호화된 비밀번호를 저장하는 데 사용됨.

단방향 해시 함수의 일종으로, 입력된 문자열을 고정 길이의 임의의 문자열로 변환함.

이 때, 변환된 값은 원래 입력값을 찾아내는 것이 거의 불가능하도록 설계되어 있음.

기존의 일반적인 해시 함수와 달리, 랜덤 솔트(salt) 값을 사용하여 강력한 보안성을 제공함.

또한 해시 함수의 작업량을 조절할 수 있는 파라미터를 제공하므로,

해시 함수의 작업량이 많아질수록 더욱 안전한 해시값을 생성할 수 있음.

이러한 특징들로 인해 많은 웹 사이트와 애플리케이션에서 사용되는 중요한 보안 요소 중 하나임.

 

 예) password 'abcd1234'에 bcrypt를 이용하여 10번의 알고리즘을 실행 후 해시값을 구하는 예제.


const bcrypt = require('bcrypt');
const password = 'abcd1234';
const hashed = bcrypt.hashSync(password, 10); // sync가 포함되면 동기식 메소드.

console.log(`password: ${password}, hashed: ${hashed}`);

정상적으로 ' node bcrypt.js ' 파일을 실행했을 때의 화면.

 

compareSync ( '기준값' , '비교값' )

password와 hashed값이 동일한지를 비교해주는 함수.

일치하면 True, 불일치하면 False 반환.


const result = bcrypt.compareSync('abcd1234', hashed);
console.log(result);

 

추가적인 보안과 관련된 용어


auth
authentication(인증)을 의미하는 축약어로, 사용자가 시스템에 로그인할 때 사용자가 신원을 증명하고 인증하는 프로세스.
인증을 통해 사용자가 자신의 계정에 대한 권한을 얻고, 시스템의 보호 기능을 사용할 수 있음.



세션(Session)
웹 서버에서 사용자의 상태 정보를 저장하고 유지하는 것. 로그인 → 세션 ID를 발급 → 웹 서버에 저장.
이후, 사용자 요청이 발생하면 서버에서는 해당 세션 ID를 통해 사용자 정보를 조회하고 인증 여부를 확인한 후, 요청에 응답함. 세션 방식은 서버 측에서 모든 처리를 담당하기 때문에 보안성이 높지만, 서버에 부담이 가고 성능에도 영향을 미칠 수 있음.

쿠키(Cookie)
사용자의 브라우저에 저장되는 작은 파일. 웹사이트를 방문 → 브라우저에서 서버로 전송 → 사용자 정보를 저장/전달.
서버 측에서 브라우저에게 발급하여, 브라우저가 웹 사이트에 접속할 때마다 쿠키를 서버에 전송하여 인증 정보를 확인함.
쿠키 방식은 세션 방식보다 성능이 우수하지만, 보안성 측면에서는 상대적으로 취약함.

세션과 쿠키 둘 다 사용자 인증과 관련된 웹 애플리케이션에서 중요한 역할을 하며,
사용자 인증 정보를 저장하고 전달하는 데 사용됨.

보통은 쿠키와 세션을 함께 사용하여 사용자 인증과 관련된 정보를 안전하게 저장하고 전달함.
사용자의 인증 정보를 쿠키는 '브라우저'에 저장하고, 세션은 '서버'에 저장하는 방식으로 사용됨.
이를 통해 보안성과 성능을 적절히 조절할 수 있음.

 

30. jwt

JSON Web Token의 약어로, 특정 웹사이트나 애플리케이션에서 사용자 인증을 위한 토큰으로 사용됨.

두 개체 사이에서 안전하게 정보를 전달할 수 있도록 해주는 JSON 기반의 열려있는 표준.

JWT에는 사용자 정보와 해당 사용자의 인증 유효성을 검증하는 데 필요한 서명이 포함됨.

자체적으로 안전한 구조를 가지고 있으므로, 보안적으로 안전한 사용자 인증 방법으로 많이 사용됨.

일반적으로 사용자가 로그인하여 인증되면 서버는 JWT를 발급하고,

해당 JWT를 사용하여 해당 사용자에게 접근 권한을 부여함.

JWT를 사용하면 서버 측에서 사용자 인증을 처리하고 인증된 사용자의 요청을 확인할 수 있음.

따라서 JWT를 사용하여 안전하고 신뢰성 있는 서비스를 제공할 수 있음.

jwt의 설치:
npm i jsonwebtoken 입력.

 

jwt.sign( '데이터' , 'secret/private여부' , ' [옵션]' , ' [완료후실행할콜백함수]' )

 주어진 데이터(payload)를 서명하여 JWT를 생성.

 

jwt. verify( '토큰' , 'secret/private여부' , ' [옵션]' , ' [완료후실행할콜백함수]' )

주어진 토큰을 확인하여 JWT가 유효한지를 검증.

검증에 성공하면 JWT에 포함된 데이터를 반환하며, 검증에 실패하면 오류 객체를 반환함.

만료 시간이 지난 JWT를 검증하면 TokenExpiredError 오류가 발생함.

 

예) jwt와 secret키, token값을 사용하여 3초후에 token이 사라지는 예제


const jwt = require('jsonwebtoken');
const secret = 'g7VPV4XNktJsn3lJv4AX10Y0!$dkWO';     // secret의 값은 lastpass 사이트를 사용하여 임의의 값을 가져옴.
const token = jwt.sign(
    {
        id: 'apple',
        name: '김사과',
        isAdmin: false
    } ,
    secret ,  // 중괄호 내부의 값과 secret 키를 섞음.
    {           // 옵션이 들어갈 중괄호.
        expiresIn: 60           // 만료될 시간을 지정. '초'단위. (예: 1달은 60*60*24*30)
    }
);

setTimeout(() => {                   // setTimeout() 함수 지정.
    jwt.verify(token, secret, (error, decoded) => {             // token과 secret을 변수로 지정하여 입력.
        console.log(error, decoded);                                    // token이 verify된 상태라면, decoded를 출력.
    });
}, 3000) // 해당 밀리초가 expiresIn의 만료시간보다 길게되면, 만료시간 이후에 찍히게 되므로 오류가 발생.

console.log(token);

값이 출력되며, 아래로 token 변수 내부의 값들이 밀리초 이후에 출력됨. (iat, exp 등의 시간은 timestamp의 형식.)

참고

LastPass: 자동으로 Random Password를 만들어주는 사이트

https://www.lastpass.com/features/password-generator#generatorTool

 

Password Generator - LastPass

Create a secure password using our generator tool. Help prevent a security threat by getting a strong password today on Lastpass.com

www.lastpass.com

 

 

JWT.io: Encoding된 값을 입력하여  Decoding해주는 사이트 

https://jwt.io/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

아래와 같이 id가 apple인 data를 encoding한 토큰값을 붙여넣으면, 자동으로 decoding해줌.