[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #3 - 구글 OAuth

2025. 7. 16. 02:06·팀 프로젝트/[2025][GDG]홍대 맛집 아카이빙 프로젝트

어제 개발하다가 구글로그인이 안돼서 보니까..

OAuth2의 구글 로그인 API 유효기간이 1시간이더라..

 

오늘은 API를 다시 발급받고 리프레시 토큰을 이용해보고자 한다.

그거 성공하면 네이버 로그인 API도 구현해야함

 

산너머산

산너머산


refresh 토큰은 그냥 AccessToken이 만료되었을 때 새로 발급해주는 토큰이다.

구글 API의 refresh token 활용방식은 다음 블로그를 참고했다.

 

https://soda-dev.tistory.com/60

 

[API] 구글 OAuth로 토큰(access token) 발급받기

구글 클라우드 플랫폼을 사용하여 연동한다.OAuth토큰 사용포스트맨 (Postman) 사용  구글 클라우드 플랫폼https://console.cloud.google.com/ Google Cloud Platform하나의 계정으로 모든 Google 서비스를 Google Clou

soda-dev.tistory.com

 

추가로 Spring Security 구조에 참고하면 좋을듯한 자료

https://velog.io/@tmdgh0221/Spring-Security-%EC%99%80-OAuth-2.0-%EC%99%80-JWT-%EC%9D%98-%EC%BD%9C%EB%9D%BC%EB%B3%B4

 

Spring Security 와 OAuth 2.0 와 JWT 의 콜라보

Spring Boot, Spring Security, OAuth 2.0, JWT 와의 치열한 싸움 기록

velog.io

https://guswls28.tistory.com/148

 

[Spring] Access Token 블랙리스트 관리하기

🎉 개요로그인 기능을 구현하고 테스트 하던 중, Access Token을 새로 발급 받았는데도 발급 전의 Access Token으로 여전히 접근이 가능하다는 것을 알게 되었다. 이는 이전 토큰의 만료 기간이 남았

guswls28.tistory.com

 

내용이 조금 어려워보여서.. JWT를 배우고 읽으면 좋을듯 하다.

 

근데 어제 뜨던 이 오류가 또 떠서...

이거 해결하는데 2시간은 걸린듯...

 

알고보니 이렇게 간단하게만 바꾸면 되더라... 아오아오

스프링 security가 자동으로 링크를 넘겨주는데 내가 또 링크를 넘겨서 충돌한거라고 하더라..

충돌을 피하려면 저 링크로 접근해야한다고 한다. 그럼 어제도 저게 원인인가...? 암튼 해결했으니 기분은 좋다

 

 

 

2시간 만에 다시 원상태로 돌아왔다.

Spring이 AccessToken 발급까지는 자동으로해주지만.. RefreshToken 발급까지는 자동으로 해주는데 AccessToken이 만료되었을 때 자동으로 교체해주지는 않는다고한다. 수동으로 짜야한다.

그래도 다행히 위의 링크처럼 POSTMAN으로 POST요청을 보낼 필요는 없고 Spring의 메서드로 AccessToken과 RefreshToken 값을 가져올 수 있다.

 

그럼 RefreshToken을 저장해야하는데.. AccessToken은 유효기간이 짧아 세션에 주로 저장하고, Refresh Token Redis 에 이를 맡기는 경우가 있다고 한다. 그건 나중에 알아보기로

 


JWT

구글링해서 찾아보니까 JWT를 이용한 분들이 많은데 나는 JWT를 모르기에.. 굳이 JWT를 이용해야하나싶어 GPT에게 물어보니 토큰 만료시각이 JWT 형태로 보관되어 있어 구조정도는 아는게 좋다고 한다.

 

JWT란 무엇일까?

JWT는 한 개체의 속성정보 (그니까 나의 경우에는 토큰의 이메일, 아이디 등의 유저정보, 토큰 발급시각, 토큰 만료시각 등)를 JSON 구조로 표현한 토큰. 장치간 안전한 전송을 위해 설계되었다고 한다.

 

좀 두려운데

 

출처 : 코딩애플 / 문제시 삭제

JWT는 Header와 Payload, Verify Signature 로 이루어져있다.

 

Header에서는 암호화 해시 알고리즘의 종류를 고르고 (코딩애플 영상을 보니 none을 절대 사용하지 말라고하더라. HS256 사용을 권장함) JWT로 타입을 정한다.

암호화 해시 알고리즘에는 다음 글을 참고하면 좋을 듯하다.

https://velog.io/@ddangle/JWT-%ED%86%A0%ED%81%B0-%EC%95%94%ED%98%B8%ED%99%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-HS256%EA%B3%BC-RS256

 

JWT 토큰 암호화 알고리즘 - HS256과 RS256

이 글에선 JWT 토큰의 전체적인 동작 방식에 대한 내용은 다루지 않고, 암호화 알고리즘에 대해서만 다루도록 하겠습니다. JWT 토큰 암호화 알고리즘 중 대표적인 HS256, RS256에 대해서만 다루겠습

velog.io

 

 

Payload에서는 보낼 내용, 담을 내용 (클레임)을 정한다. 내가 보낼 데이터들이 저기에 들어간다.

추가로 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터인 '등록된 클레임'이 존재하며, 사용할 것을 권장한다고 한다.

iss: 발급자

sub: 제목

aud: 대상자

exp: 만료시간

nbf: 활성날짜

iat: 발급 시간(issued at)

jti: JWT 토큰 식별자(JWT ID)

 

Signature는 서명으로 Header, Payload, Secret key를 합쳐 암호화한 값이다. Secret key는 어렵게 설정하여 탈취되지 않도록 유의해야한다.


JWT는 뭐 암호화된 JSON 오브젝트 정도로 이해했는데.. 어디에 쓰는걸까? 우선 구글 OAuth API의 만료시각을 확인하기 위해서 필요하고.. 궁금해서 몇 가지 추가로 GPT에게 물어봤다.

GPT하니까 생각나는게 알바 다녀오면서 코딩애플님 영상을 몇 개 봤는데, 그 중에서 바이브코딩 영상을 보다가 다음 대목이 나왔다. -> 신입개발자는 바이브코딩, AI를 이용한 코딩을 지양해야한다. AI는 검색도구로 활용하는 것은 좋지만 직접 AI가 코드를 짜는 것은 적절치 않다.

맞는 말 같기도 하고...? 암튼 이 말을 유념하면서 개발해야겠다.

 

백엔드에서 로그인을 완료한 후 유저이메일, 유저아이디 등을 담아서 JWT 토큰을 만들어 accessToken을 만들고, 이를 쿠키에 저장하면 (그냥 쿠키가 아니라 HttpOnly라고 한다..) 프론트, 다른 백엔드 협업자 등도 이를 조회하여 액세스 권한 역시 확인할 수 있다고 한다.

즉, 로그인을 통해 JWT 토큰을 만들어 쿠키에 저장하면 사용자가 요청을 보낼때마다 쿠키만 긁어와서 보면 된다는 소리

물론 당연한 얘기지만 JWT 토큰에 들어갈 정보들은 DB에 저장해서 로그인 할 때마다 불러와야한다. 그럼 DB를 만들어야하는데.. DB 만드는데 또 시간이 걸리고.. 지도 API 만드는데 시간이 걸리고..

 

이제 해보자!


우선 첫 번째로 알아야할 것은 JWT encoding / decoding

블로그를 찾아보면서 jjwt 라이브러리를 사용하기로 결정했다.

 

제일 먼저 할 것은 로그인 성공 시 응답코드 반환과 함께 JWT 토큰을 발급하고, HttpOnly 쿠키로 저장하는 것이다, (HttpOnly 쿠키는 뒤에서 다룰 예정) 로그인 성공 시 응답코드 반환까지는 이미 구현해놨고, 이메일 긁어오는 것도 되어 있으니 토큰만 잽싸게 만들면 됨.

 

jjwt 라이브러리를 사용하기 앞서 secret 코드를 설정해야하는데.. 그걸 클래스에 대놓고 선언하는 미친짓은 다행히 하지 않았고 (사실 할 뻔함) .yml 파일에서 주입시켰다. 어차피 .yml 파일은 OAuth 비밀번호가 있어서 gitignore에 들어가야하기 때문에...

뭐 이러면 .yml에서 주입되는 것 같음. 이용은 secret으로 하고, 메서드에 저걸 넣으면

modifier private not allowed here / annotation type not applicable to this kind of declaration

오류가 뜬다. 메서드 밖, 클래스 안에 넣어야한다.

 

AccessToken 발급코드. 새 클래스로 분리할까했는데 우선은 기존 코드 안에 넣었다.

라고했지만 filter를 만들어야한대서 바로 새 클래스로 분리시켰다. 역시 개발은 우당탕탕해야지

 

근데 Value 어노테이션을 얘가 인식을 못해서 우선은 String으로 직접 선언했다. 내일 고쳐야할듯

 

추가로 컨트롤러에서 이메일을 뽑아 넘겨주는 방식이 아니라 oauth 객체를 넘겨주면 서비스에서 이메일을 뽑아내도록 변경

 


우선 오늘은 여기까지

알바도 하고 개발도하고 하려니 시간이 안나네;;

 

내일은 알바가 없으니 원없이 개발해보자

내일 할 일

- value 어노테이션 인식되게 고치기

- filter 만들어서 프론트엔드의 헤더 읽을 수 있게 하기

- OAuth 잘되는지 점검하고 안되면 RefreshToken 점검하여 새 토큰 받아오는 코드 만들기

 

- 네이버 로그인 만들기

- 카카오 로그인 만들기

 

할게 많네

아자아자

'팀 프로젝트 > [2025][GDG]홍대 맛집 아카이빙 프로젝트' 카테고리의 다른 글

[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #5 - OAuth 최종점검  (0) 2025.07.18
[GDG] 개발코스 2주차 WIL  (1) 2025.07.17
[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #4 - 오늘은 OAuth 끝내죠?  (7) 2025.07.17
[GDG] 홍대 맛집 아카이빙 프로젝트 백엔드 개발 #2 - ResponseEntity 활용하기  (1) 2025.07.15
[GDG] 홍대 맛집 아카이빙 프로젝트 백엔드 개발 #1 - OAuth에 대해서...  (2) 2025.07.14
'팀 프로젝트/[2025][GDG]홍대 맛집 아카이빙 프로젝트' 카테고리의 다른 글
  • [GDG] 개발코스 2주차 WIL
  • [GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #4 - 오늘은 OAuth 끝내죠?
  • [GDG] 홍대 맛집 아카이빙 프로젝트 백엔드 개발 #2 - ResponseEntity 활용하기
  • [GDG] 홍대 맛집 아카이빙 프로젝트 백엔드 개발 #1 - OAuth에 대해서...
Radiata
Radiata
개발을 합니다.
  • Radiata
    DDD
    Radiata
  • 전체
    오늘
    어제
    • 분류 전체보기 (211)
      • 신년사 (3)
        • 2025년 (2)
        • 2026년 (1)
      • CS (59)
        • JVM (12)
        • 백엔드 (20)
        • 언어구현 (1)
        • 객체지향 (1)
        • 논리회로 (5)
        • 컴퓨터구조 (9)
        • 데이터베이스 (1)
        • 컴퓨터 네트워크 (10)
      • 언어공부 (64)
        • Java | Kotlin (48)
        • JavaScript | TypeScript (9)
        • C | C++ (6)
      • 개인 프로젝트 (11)
        • [2025] Happy2SendingMails (3)
        • [2026] 골든리포트! (8)
        • [2026] 순수자바로 개발하기 (0)
        • 기타 이것저것 (0)
      • 팀 프로젝트 (29)
        • [2025][GDG]홍대 맛집 아카이빙 프로젝트 (29)
      • 알고리즘 (13)
        • 백준풀이기록 (11)
      • 놀이터 (0)
      • 에러 수정일지 (2)
      • 고찰 (24)
        • CEOS 23기 회고록 (2)
  • 블로그 메뉴

    • CS
    • 언어공부
    • 개인 프로젝트
    • 팀 프로젝트
    • 알고리즘
    • 고찰
    • 신년사
    • 컬러잇 개발블로그
  • 링크

    • 컬러잇 개발블로그
  • 공지사항

  • 인기 글

  • 태그

    144
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Radiata
[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #3 - 구글 OAuth
상단으로

티스토리툴바