In this paper we study the Steiner tree problem in graphs for the case when vertices as well as edges have weights associated with them. A greedy approximation algorithm based on "spider decompositions" was developed by Klein and Ravi for this problem. This algorithm provides a worst case approximation ratio of 2 ln k, where k is the number of terminals. However, the best known lower bound on the approximation ratio is (1 - o(1)) ln k, assuming that NP ⊈ DTIME[nO(log log n)], by a reduction from set cover. We show that for the unweighted case we can obtain an approximation factor of ln k. For the weighted case we develop a new decomposition theorem, and generalize the notion of "spiders" to "branch-spiders", that are used to design a new algorithm with a worst case approximation factor of 1.5 lnk. We then generalize the method to yield an approximation factor of (1.35+ε) lnk, for any constant ε > 0. These algorithms, although polynomial, are not very practical due to their high running time; since we need to repeatedly find many minimum weight matchings in each iteration. We also develop a simple greedy algorithm that is practical and has a worst case approximation factor of 1.6103 ln k. The techniques developed for this algorithm imply a method of approximating node weighted network design problems defined by 0-1 proper functions as well. These new ideas also lead to improved approximation guarantees for the problem of finding a minimum node weighted connected dominating set. The previous best approximation guarantee for this problem was 3 lnn due to Guha and Khuller. By a direct application of the methods developed in this paper we are able to develop an algorithm with an approximation factor of (1.35 + ε) lnn for any fixed ε > 0.