목록개발 (301)
이전 포스팅에서는 accessToken 발급을 구현하여 인가하는 방법까지 다뤘다. 허나, accessToken 만으로는 사실 부족한데, accessToken 은 해킹을 당했을 경우 보안에 취약할 뿐더러 유효기간이 짧은 토큰의 경우 그만큼 사용자에게 로그인(accessToken)을 강요하여 불편하다는 단점이 있기 때문이다. 따라서 이러한 점들을 보안하기 위해서 만들어진 것이 refreshToken. refreshToken 은 로그인을 완료했을 때 accessToken 과 함께 발급되며 accessToken 보다 유효기간이 길다. refreshToken 의 유효기간이 만료되면 사용자는 새로 로그인을 하게 되는데 이 또한 해킹의 가능성이 있기 때문에 적절한 유효기간 설정이 필요하다. accessToken : ..
미래의 나에게 jwt 패키지 설치 / bcrypt 패키지 설치 yarn add @nestjs/jwt passport-jwt yarn add @nestjs/passport yarn add --dev @types/passport-jwt yarn add bcrypt yarn add --dev @types/bcrypt 2023.02.10 - [코딩/알쓸코잡] - 인증(Authentication) & 인가(Authorization) 2023.01.30 - [코딩/알쓸코잡] - JWT (JSON Web Token) 이전 포스팅과 연결고리가 많은 포스팅이다. JWT (Jason Web Token) JWT 는 유저를 인증 / 식별하기 위한 토큰 기반의 인증이라고 볼 수 있다. JWT 는 토큰 자체에 [사용자의 권한 정..
소셜 로그인 (social login) 소셜 로그인이란, 소셜 네트워크(SNS) 사이트의 정보를 이용하여 타사의 서비스에 보다 쉽게 로그인할 수 있는 방식을 의미한다. 여기서 사용되는 프로토콜은 OAuth 라고 하는데, 인터넷 사용자들이 패스워드를 제공하지 않고 다른 웹사이트 상에 접근 권한을 부여할 수 있는 수단이라고 보면 된다. 추가적인 회원가입을 할 필요가 없을 뿐더러 비밀번호를 기억할 필요도 사용자로서는 쉽게 서비스를 이용할 수 있게 되었으며, 개발자 & 기업의 경우 사용자에게 데이터를 더욱 안정적으로 제공할 수 있게 된다. 과정 거의 대다수의 사람들이 사용하는 구글을 기준으로 설명하도록 한다. 1. 브라우저에서 백엔드로 로그인을 요청 2. 백엔드에서 브라우저로 구글 로그인 페이지를 전송 3. 브..
payment 는 말 그대로 비용울 지불하기 위한 서비스를 의미하므로, iamport 에 대해 얘기한다. iamport PG사(Payment gateway) 결제 모듈에 대한 개발을 진행할 때, 제공되는 결제 서비스를 의미한다. (기본적으로 하나의 서비스는 무료이나 두개 이상은 유료임) 여기서 PG사는 대신 결제해주는 업체 또는 방식을 의미한다. 방식
인증 인증이란 유저의 신원을 검증하는 과정으로, 회원가입이나 로그인하는 것이라 보면 편하다. 인증 과정에서 ID, PassWord(암호화)한 DB를 저장하고 일치하는지 확인하고, 일치하게 되면 jwt 이나 쿠키와 같은 토큰을 발급한다. 인가 인가란 인증 이후에 신원을 검증함과 동시에, 인증된 사용자에게 접근 권한을 확인하는 과정이다. 예를 들어, 자신의 게시물에는 자신만 수정이 가능하고 타인의 게시물은 수정이 불가능한 것이라고 보면 쉽다. 인가 과정에서 로그인 시 토큰를 발급하게 되고, 해당 토큰 안에는 사용자의 정보를 포함시킨다. 요청 시 요청헤더에 토큰을 담고, 서버는 이를 복호화하여 사용자의 정보를 읽어, 사용자에게 그에 맞는 권한을 부여할 수 있게 된다. 2023.02.02 - [코딩/알쓸코잡] ..
미래의 나에게 bcrypt 라이브러리 설치 yarn add bcrypt yarn add --dev @types/bcrypt 이번 포스팅에서는 이전에 포스팅했던 product API 구현과 다른 부분에 대해 다룬다. Create // Hashing & ConflictException // users.service.ts async create({ createUserInput }: IUsersServiceCreate): Promise { const { password, email, ...rest } = createUserInput; const user = await this.findOneByEmail({ email }); if (user) throw new ConflictException('이미 등록된 이메일..
정규표현식에 대해 간단히 다뤄본다. 문제 설명 기존의 풀이 방식 function solution(s) { let a = ['zero','one','two','three','four','five','six','seven','eight', 'nine'] for(let i = 0 ; i < a.length ; i ++){ s = s.replaceAll(a[i],i) } return Number(s) } 배열을 만들어 둔 뒤, replaceAll 을 활용하였다. 정규표현식을 활용한 방식 function solution(s){ let a = ['zero','one','two','three','four','five','six','seven','eight', 'nine'] // s = s.replace(/number..
상당히 어려웠던 부분이다. 내가 구현했던 ERD에는 일 대 일 관계와 일 대 다 관계는 없기에, 다 대 일 / 다 대 다 관계에서 다룬다. 다 대 일 다 대 일로 작업한 내용은 카테고리였다. // dto create-product.input.ts @Field(() => String) productCategory: string; // dto 에 카테고리 추가 // product.service.ts create 함수 내부에 추가 create({ const { productCategory, ...product } = createProductInput; // 구조 분해 할당 } const result = this.productsRepository.save({ ...product, productCategory: ..