728x90
반응형

TLS(Transport Layer Security)란?

  • 인터넷 상 커뮤니케이션을 위한 개인 정보 및 데이터 보안 용이하게 위한 하기 보안 프로토콜
  • 즉 웹 브라우저/어플리케이션과 서버간 커뮤니케이션을 암호화 하는 포로토콜
    • 이메일, 메세지, VoIP(보이스오버) 등

TLS 역할

  • 암호화: 제 3자로부터 전송되는 데이터 숨김
  • 인증: 정보 교환 당사자가 요청된 당사자임을 보장
  • 무결성: 데이터가 위조되거나 변조되지 않았는지 확인

사용 이유

  • 데이터 유출 및 공격으로부터 웹 어플리케이션 보호 용도

TLS vs SSL

  • SSL (Secure Sockets Layer): 보안 소켓 계층
  • TLS는 SSL에서 발전한 버전
  • 두개를 혼동하여 사용하는 경우가 많음. 현재는 TLS 를 주로 사용함

TLS vs HTTPS

  • HTTPS는 HTTPS 프로토콜 상위에서 TLS 암호화를 구현한 것

TLS 인증서?

  • 웹 어플리케이션이 TLS를 사용하기 위해선 원본 서버에 TLS 인증서가 설치되어야 함
    • SSL 인증서라고 혼동돼서 불리기도 함
    • 인증 기관이 도메인을 소유한 사람 혹은 비즈니스에 TLS 인증서 발행
  • 서버의 공개키 및 도메인 소유자에 대한 정보 포함함
  • 서버의 신원 확인하는데 사용됨

암호 제품군?

  • 안전한 통신 연결 수립을 위한 알고리즘 세트
728x90
반응형

'네트워크' 카테고리의 다른 글

[TLS] TLS 핸드세이크?  (0) 2025.01.14
728x90
반응형

Nullable 데이터

  • DB의 필드 중에 NULL 값이 들어갈 수 있는 값들이 있다. 이 값들을 쿼리해서 코드단에서 처리할 때 어떻게 해야 할까?
  • 다른 언어들은 그냥 쿼리해서 사용하면 null 값으로 처리되던데...

Struct 정의

  • 우선 쿼리된 결과를 원하는 값들에 할당해준다. 아래는 기존에 사용하던 코드
type SampleQueryItem struct {
  UserId string `json:"userId"`
  UserName string `json:"userName"`
  UserEmail string `json:"userEmail"`
}
  • 이렇게 하면 받아오는 데이터 세개 전부 값이 있다고 가능하는 셈이다.
    • 이렇게 된다면 null 값들은 처리할 수 없다.

포인터 사용하기

type SampleQueryItem struct {
  UserId string `json:"userId"`
  UserName string `json:"userName"`
  UserEmail *string `json:"userEmail"` // 포인터 사용
}
  • 이렇게 처리하면 userEmail 값은 null 로 받아올 수 있다.

번외; 단건 조회 데이터가 없을 때

  • 한 건 조회할 때, 쿼리 데이터가 없다면?
  • golang은 심플함을 강조하기 때문에, 이러한 상황들을 직접 핸들링 해 줘야 한다.

기존 코드

var dataItem SampleQueryItem

if scanErr := queryResult.Scan(&dataItem.UserId, &dataItem.UserName, &dataItem.UserEmail);
    scanErr != nil {
        log.Printf("Scan Error: %v", scanErr)
        return scanErr
    }
  • 이렇게 해 주면 scan 에러가 발생한다. 그 이유는 쿼리된 데이터가 없다는 것

수정된 코드

var dataItem SampleQueryItem

if scanErr := queryResult.Scan(&dataItem.UserId, &dataItem.UserName, &dataItem.UserEmail);
    scanErr != nil {
        // 데이터가 없는 에러는 error 에러를 리턴하지 않게 해서 에러로 빠지지 않게 한다.
        if scanErr == sql.NoRowError {
            return SampleQueryItem{}, nil
        }

        log.Printf("Scan Error: %v", scanErr)
        return SampleQueryItem{}, scanErr
    }
  • 조회된 데이터가 없는 것은 에러로 처리된다. scan 할 데이터가 없기 때문
    • 위 처럼 쿼리 후 에러 핸들링을 하면, 에러 처리로 넘기지 않고 빈 데이터를 넘길 수 있다.
728x90
반응형
728x90
반응형
  • 사이드 프로젝트를 하나 더 만들며, 이번 기회에 보안 뿐만 아니라 편리성 측면에서 SSO 의 혜택을 누리고자 구글 OAuth 를 사용해 보았다.

로직 개요

  • 프론트에서 Google OAuth 를 이용해 서비스 가입 및 유저 정보 획득
  • 획득된 유저 정보를 백엔드로 전달
  • 백엔드는 전달된 유저 정보를 DB에 입력
  • 생성된 데이터들을 기반으로 JWT 생성 및 세션 생성
  • 생성된 JWT 를 프론트엔드에 전달
  • 프론트는 전달된 JWT를 매 요청의 헤더에 넣어서 사용

구글 OAuth 설정

  • Google Cloud 에서 콘솔 클릭
  • 콘솔에서 프로젝트 생성
    • 생성된 프로젝트의 API 및 서비스 메뉴로 이동
    • OAuth 동의 화면 설정 진행
      • 서비스 정보 입력
    • 사용할 정보 추가
      • 이메일 및 개인정보 확인만 체크했음
    • 테스트 사용자 추가
      • 테스트 모드인 동안은 테스트 계정만 사용 가능
  • 사용자 인증 정보 만들기
    • OAuth 클라이언트 ID 선택
    • 웹 어플리케이션 선택
    • 승인된 리디렉션 URI 추가
      • google 에서 인증받은 후 리디렉션 되는 경로
      • 프론트에서 사용할 값이므로 프론트의 주소를 사용하도록 등록함
        • 이 때 next-auth를 사용했으므로, next-auth 공식문서에서 제시한 Url Path로 설정
        • /api/auth/callback/google

Oauth 값들 기록

  • clientId: 발급받은 클라이언트 ID
  • clientSecret: 발급 받은 클라이언트 비밀번호
  • redirectUri: 리디렉션 URI
728x90
반응형

+ Recent posts