[Spring] Github OAuth2.0 - Auto Push를 위한 GitHub 액세스 토큰 암호화 (AES)

림민지·2025년 7월 8일

Today I Learn

목록 보기
60/62

Github Oauth2.0 구현 자체는 이전의 블로그 포스팅을 참고하자!
전체적인 플로우는 아래 이미지와 같다


유의할 점 1 (이메일(goolge/naver) OAuth와 다른 점)

Github에서 해당 유저가 아래 이미지처럼 이메일을 public으로 풀어두지 않으면 OAuth 정보를 받아올 때 null 값으로 들어온다

나는 인터페이스를 통해 다양한 OAuth 정보를 관리하고 있었기 때문에 이를 따로 설정해주는 것이 중요하다

만약 유저의 정보가 넘어올 때, 이메일이 null인 경우에 처리해주는 메서드를 꼭 넣어주자

//깃허브 이메일 처리 (GitHub 이메일이 null일 경우 처리)

String email = attributes.get("email");
if (email == null) {
    Long githubId = (Long) attributes.get("id");
    email = githubId + "@github.com"; // 고유 ID 기반 이메일 생성
}

유의할 점 2 (github auto push 관련)

유저의 깃허브에 접근하려면 깃헙에서 발급해주는 accessToken이 반드시 필요하다.
근데 이를 날 것 그대로 DB에 저장하면 보안상의 문제가 생길 수 있다,,,
반드시 암호화를 통해 저장하자


🔐 암호화란? (Encryption)

: 암호화는 중요한 데이터를 권한이 없는 사람이 읽을 수 없도록 정보를 잠그는 과정입니다.

정보보안의 3요소에는 기밀성 무결성 가용성이 있다

  • 기밀성(Confidentiality): 허가된 사용자만 정보에 접근할 수 있도록 보장
  • 무결성(Integrity): 정보가 전송되는 과정에서 위조되거나 변조되지 않았음을 보장
  • 인증(Authentication): 메시지를 보낸 사람이 진짜 그 사람이 맞는지 확인

대칭키 (Symmetric Key) 암호화

: 데이터를 암호화하고 복호화(원상복귀)할 때 동일한 하나의 '비밀키'를 사용하는 방식

작동 방식
1. A가 '비밀키'로 데이터를 암호화합니다.
2. 암호화된 데이터를 B에게 전달합니다.
3. B는 A와 미리 공유했던 똑같은 '비밀키'로 데이터를 복호화하여 원본을 확인합니다.

장점
: 암호화 및 복호화 속도가 매우 빠르다
단점
:'키 배송 문제'를 고려해야함
만약 키가 중간에 탈취되면 암호는 무용지물이 된다,,,,,,

대표적인 예
AES, DES, ARIA

비대칭키

: 서로 다른 두 개의 키가 한 쌍으로 동작하는 방식
하나는 모두에게 공개해도 되는 '공개키(Public Key)'
다른 하나는 자신만 안전하게 보관해야 하는 '개인키(Private Key)'

장점
: 키를 안전하게 배송해야 하는 문제가 해결!
공개키는 유출되어도 상관없ㅋㅋ

단점
: 대칭키 방식에 비해 암호화 및 복호화 속도가 현저히 느림

대표적인 예
RSA, ECC


왜 원래 값을 복구해야하는 값에는 대칭키를 사용해야할까?

이 질문에 답하려면 "암호화(Encryption)"와 "해싱(Hashing)"의 차이를 이해하는 것이 중요하다!

  • 암호화 (Encryption) - 양방향(Two-way)
    • 목적: 데이터를 숨겼다가 나중에 다시 원본으로 되돌리는 것(복호화)이 목적입니다.
    • 특징: AES와 같은 알고리즘은 '키'만 있으면 암호화된 데이터를 다시 원본으로 복원할 수 있습니다. 즉,
      복원이 가능합니다.
    • 사용 예: 민감한 개인정보(주민번호, 계좌번호) 저장, 안전한 데이터 전송(HTTPS) 등 나중에 원본 데이터가
      필요한 모든 경우에 사용됩니다.
  • 해싱 (Hashing) - 단방향(One-way)
    • 목적: 데이터가 원본 그대로인지 검증(무결성 확인)하는 것이 목적이며, 원본으로 되돌리는 것을 의도하지
      않습니다.
    • 특징: 원본 데이터를 고정된 길이의 문자열(해시값)로 바꾸며, 이 해시값으로는 원본 데이터를 복원하는
      것이 거의 불가능합니다.
    • 사용 예: 비밀번호 저장. 웹사이트는 사용자의 실제 비밀번호를 저장하는 대신, 비밀번호의 '해시값'을
      저장합니다. 로그인 시 입력된 비밀번호를 다시 해싱하여 저장된 해시값과 일치하는지 비교만 할 뿐, 원래
      비밀번호가 무엇이었는지는 알 수 없습니다.

결론적으로, "원래 값을 복원할 필요가 있을 때"는 반드시 키를 통해 복호화가 가능한 양방향 방식인 AES와 같은
암호화 알고리즘을 사용해야 합니다. 만약 복원이 필요 없고 데이터의 동일성만 확인하면 된다면 해싱을
사용합니다.

profile
@lim_128

0개의 댓글